В Bash вы можете перенаправить весь будущий вывод stdout текущего запущенного скрипта. Например, с этим сценарием,
exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3
Это закончится в системном журнале:
Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3
Но это специфично для Bash, и голый exec с перенаправлением, похоже, не работает в Dash.
Syntax error: redirection unexpected
Как я могу заставить его работать в Dash или, возможно, в обеих оболочках?
>
тире. Я понимаю, что вы, кажется, просите что-то еще, но я не могу точно сказать, что это.Ответы:
Вы можете просто сделать:
Вы можете сделать это с любой оболочкой.
Если вам не нравится, как он выглядит, возможно, заставьте скрипт обернуть себя в функцию.
источник
run ${1+"$@"} || do stuff
таковой, чтобы аргументы были сохранены.${1+"$@"}
ничего"$@"
не делает . В любом случае, у него были другие проблемы."$@"
пройдет,""
когда нет аргументов, пока${1+"$@"}
пропустит пустую строку, когда нет аргументов. Это очень важно для многих программ, так как они анализируют""
как пустой аргумент, в то время как пустая строка (без кавычек) вообще не будет интерпретироваться как аргумент.dash
в такой системе) , но в остальном"$@"
уникальна в том, что случай с нулевым аргументом не заменяет нулевой аргумент для оболочек POSIX."${@+is especially cool $@}"
. Но практически не отличается от старого${1+”$@"}
обходного пути в конце концов. Если у вас есть ksh93:"${1+quoted" not quoted "quoted again}"
Замена процесса легко моделируется с помощью именованных каналов.
На самом деле, именованные каналы - это один из механизмов (другой
/dev/fd
), с помощью которых может быть реализовано замещение процессаbash
.источник
Я не думаю, что это возможно в
dash
. Насколько я могу судить по егоman
странице , он не поддерживает подстановку процессов.В качестве обходного пути вы можете попробовать то, что предложил mikserv , или вы можете перенаправить все в файл, а затем, после того как ваш скрипт будет завершен (предположительно, это в скрипте), добавить содержимое этого файла в logger:
источник
dash
других оболочках. Подстановка процесса - это просто аргумент, указывающий на/dev/fd/[num]
ссылку на анонимный канал.dash
делает здесь документы с анонимными каналами, а не с временными файлами genning, как большинство других оболочек. Так чтоcat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
это не только функционально эквивалентно, вы даже можете назвать имя FD самостоятельно. Тем не менее, ваша точка зрения направлена на то, чтобы пойти по другому пути - вам нужно открыть новый файл с помощьюexec
и запустить процесс, который его читает.cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
«легче», чемcat <(get output)
?< >
перенаправления оболочки. в основном, если вы просто сделаете два из них, то сможете добавить и следующие строки. Но да, у вас есть точка зрения - мне здесь нравятся документы. Тем не менее, так много вещей, которые могут потребовать запоминания, мне кажется, легче, когда они работают универсально. С другой стороны, многим людям не очень нужны другие оболочки, и для них это не имеет значения. Я просто не среди них./dev/fd/3
(в этой точной форме) и детали того, что происходит с пробелами. , , и в этом отношении тот факт, что весь этот подход работает вообще в Dash, когда он не работает в других оболочках, которые имеют все компоненты, означает, что общий подход - это особое правило, которое нужно запомнить. (Это напоминает мне о попытках создать упрощенный английский с меньшим словарным запасом; они вырезают такие слова, как « сохраняй» , но игнорируют такие же сложные идиомы, как « продолжай» .)