Перенаправить stdout / stderr исполняемого файла, но не ошибки времени вызова из оболочки - PullRequest
1 голос
/ 07 января 2020

У меня есть простой bash скрипт, который запускает исполняемый файл в фоновом режиме и перенаправляет stdout + stderr в файл журнала:

#!/usr/bin/bash
myexec >& logfile &

Это работает. Однако вывод из myexec - не единственное, что перенаправляется: любые сообщения, которые bash испускает при попытке вызвать myexec, также отправляются на logfile. То есть, если bash не находит myexec, я не вижу ошибку myexec: No such file or directory, потому что она идет прямо к logfile вместо терминала. Это поведение меня раздражает, потому что я в конечном итоге не знаю, удалось ли сценарию запустить myexec.

Мне приходит в голову, что сценарий может просто проверить наличие myexec, прежде чем пытаться вызвать его, но мне интересно, не существует ли способа сделать само перенаправление таким образом, чтобы перенаправлялся только вывод myexec, а не оболочки.

1 Ответ

1 голос
/ 09 января 2020

Невозможно разделить выходы так, как описывает OP. Как объясняет в своем комментарии Чарльз Даффи, системный вызов, который открывает (или не может открыть) исполняемый файл myexec, происходит после того, как Bash разветвил новый процесс, после чего все перенаправление ввода-вывода уже было установлено вверх. Однако существует обходной путь, достаточный для целей, указанных в OP, а именно: «Знать, удалось ли сценарию запустить myexe c»:

myexec > logfile 2>&1 && echo "ok" >&2 || echo "nope." >&2
...