Chciałbym użyć execSync
metody, która została dodana w NodeJS 0.12, ale nadal mam dane wyjściowe w oknie konsoli, z którego uruchomiłem skrypt Node.
Np. Jeśli uruchomię skrypt NodeJS, który ma następujący wiersz, chciałbym zobaczyć pełne dane wyjściowe polecenia rsync „na żywo” w konsoli:
require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');
Rozumiem, że execSync
zwraca wynik polecenia i że mógłbym wydrukować to na konsoli po wykonaniu, ale w ten sposób nie mam wyjścia "na żywo" ...
node.js
child-process
suamikim
źródło
źródło
[0,1,2]
użyłem'inherit'
, co jest równoważne[process.stdin, process.stdout, process.stderr]
lub[0,1,2]
zgodnie z dokumentamioptions.stdio
dokumentacji: nodejs.org/api/child_process.html#child_process_options_stdio{stdio:'inherit'}
, musisz dodać .toString (), a następnie ręcznie wywołać console.log z wynikiem. Ponadto nie spełnia nawet wymogu dotyczącego wyświetlania wyników polecenia „na żywo”. Nie sądzę, że jest to „dużo prostsze”, w rzeczywistości nie sądzę, że jest wcale prostsze.Możesz po prostu użyć
.toString()
.Zostało to przetestowane na Node
v8.5.0
, nie jestem pewien co do poprzednich wersji. Według @etov to nie działav6.3.1
- nie jestem pewien co do pomiędzy.źródło
.execSync()
zgłaszaError
instancję.O ile nie przekierujesz stdout i stderr, jak sugeruje zaakceptowana odpowiedź, nie jest to możliwe w przypadku execSync lub spawnSync. Bez przekierowywania stdout i stderr te polecenia zwracają stdout i stderr tylko wtedy, gdy polecenie jest zakończone.
Aby to zrobić bez przekierowywania stdout i stderr, będziesz musiał użyć spawn, aby to zrobić, ale jest to całkiem proste:
Użyłem polecenia ls, które rekurencyjnie wyświetla listę plików, dzięki czemu można je szybko przetestować. Spawn przyjmuje jako pierwszy argument nazwę pliku wykonywalnego, który próbujesz uruchomić, a jako drugi argument przyjmuje tablicę ciągów reprezentujących każdy parametr, który chcesz przekazać do tego pliku wykonywalnego.
Jeśli jednak korzystasz z execSync iz jakiegoś powodu nie możesz przekierować stdout lub stderr, możesz otworzyć inny terminal, taki jak xterm, i przekazać mu takie polecenie:
Pozwoli ci to zobaczyć, co robi twoje polecenie w nowym terminalu, ale nadal masz połączenie synchroniczne.
źródło