В общем, я бы рекомендовал следовать образу действий Bourne-again SHell , поскольку bash, пожалуй, самая популярная оболочка Unix. Bash обычно использует либо &>
или 2>&1
. ИМХО, ни то, ни другое "идеально", поэтому я рекомендую забыть об этой ерунде. Реально, какой из них вы должны использовать, зависит от того, что вы пытаетесь сделать.
2>&1
объединяет stderr с stdout, что может быть полезно, если, например, вы хотите передать текст stderr. Так, например, если вы хотите увидеть, печатает ли программа определенное сообщение stderr, но не хотите, чтобы ваш экран заполнялся (предположительно) неважным мусором, вы можете сделать что-то вроде этого program 2>&1 | grep crashed
, который будет искать stdout и stderr из программы называется "программа" для слова "разбился".
С другой стороны, если вы не хотите, чтобы программа вообще что-либо печатала, вы можете просто запустить program &> /dev/null
, что перенаправит и stderr, и stdout в / dev / null, специальный файл, который волшебным образом заставляет вещи исчезнуть. Или, если вы хотите сохранить выходные данные программы (возможно, сообщить об ошибке или что-то в этом роде), вы можете перенаправить как stderr, так и stdout в файл: program &> log.txt
перенаправит все данные в файл с именем «log.txt». Если вы хотите, вы можете перенаправить stdout и stderr через program 2> log.txt > log.txt
или program 2>&1 | cat > log.txt
, оба из которых будут иметь тот же эффект, что и при использовании &>
. Если вы сделаете что-то подобное program 2>&1 > file
, будет перенаправлен только stdout, но stderr все еще может быть передан другой программе, например, cat, которую можно перенаправить, как показано выше. Тем не менее, набрав&>
это проще, чем в любом из приведенных выше примеров, поскольку включает в себя ввод меньшего количества символов (и людям немного легче читать). Обратите внимание, что это program 2> log.txt > log.txt
может с большей вероятностью работать на оболочках, отличных от bash.
PS: если вы беспокоитесь о людях, использующих другие оболочки, есть что-то, что вы можете добавить в первую строку вашего сценария, называемое «магическим числом» или «шебанг». По сути, это способ убедиться, что другие компьютеры (особенно те, на которых работают Unix-подобные операционные системы) знают, какую программу использовать для выполнения скрипта. Разные сценарии используют разные шебанги. Шебанг для сценария bash выглядит так:
#!/bin/bash
Если вы используете вышеперечисленное в качестве первой строки данного скрипта, bash обычно будет использоваться для выполнения указанного скрипта. Это значительно усложнит случайное выполнение сценария с неверной оболочкой.
PS: я не собираюсь лгать: до сих пор я не знал, что можно использовать >&
, но, что касается bash, похоже, он делает то же самое, что и &>
. Ты узнаешь что-то новое каждый день.