Просто ищу разницу между
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
и их портативность с non-Bourne shells
как tcsh
, mksh
и т.д.
Просто ищу разницу между
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
и их портативность с non-Bourne shells
как tcsh
, mksh
и т.д.
&>
совместимость с GNU bash, настоятельно рекомендуется не использовать это, так как синтаксический анализ может нарушить семантику существующих сценариев POSIX, а mksh уже отключает это в режиме POSIX.^ /dev/null
что это делает?Ответы:
Для фона:
Сначала давайте рассмотрим функцию этих. Для справки см. Расширенное руководство по написанию сценариев .
функции
2>&-
Общая форма этого -
M>&-
где «M» - номер дескриптора файла. Это закроет вывод для любого дескриптора файла, на который есть ссылка, то есть «M» .2>/dev/null
Общая форма этого -
M>/dev/null
где «M» - номер дескриптора файла. Это перенаправит дескриптор файла «M» на/dev/null
.2>&1
Общая форма этого -
M>&N
где «M» и «N» - номера файловых дескрипторов. Он объединяет вывод файловых дескрипторов «M» и «N» в один поток.|&
Это просто аббревиатура для
2>&1 |
. Это было добавлено в Bash 4.&>/dev/null
Это просто аббревиатура для
>/dev/null 2>&1
. Он перенаправляет файловый дескриптор 2 (STDERR) и дескриптор 1 (STDOUT) в/dev/null
.>/dev/null
Это просто аббревиатура для
1>/dev/null
. Перенаправляет файловый дескриптор 1 (STDOUT) на/dev/null
.Переносимость на не-bash, tcsh, mksh и т. Д.
Я не имел дело с другими оболочками за пределами
csh
иtcsh
. Мой опыт работы с этими двумя по сравнению с операторами перенаправления bash заключается в том, что bash превосходит их. Смотрите страницу руководства tcsh для более подробной информации.Из команд, которые вы спрашивали ни о одной, напрямую не поддерживается csh / tcsh. Вам придется использовать разные синтаксисы для создания похожих функций.
источник
2>&-
vs2>/dev/null
(кроме того, что некоторые «плохо» написанные программы2>&-
неправильно понимают )?&>
былbash
с самого начала (и нарушает совместимость с Bourne и POSIX, так как это означает что-то другое, хотя вряд ли ударит).>&
и|&
прийти(t)csh
(и это единственный способ перенаправить stderr). Они были вzsh
начале и были добавлены только недавноbash
. Смотрите такжеrc
для лучшего дизайна операторов.(+2-2=0)
. Теперь, что касается редакции, я не много редактирую, но в этом случае я бы сделал это, потому что она разъясняет, что данные после операции будут вN
. Я прочитал ваш ответ, и это очень хорошо во всех аспектах. Именно эта небольшая двусмысленность заставила меня задуматься, вот почему издание. Но хорошо, не стесняйтесь повторно добавить или отклонить это, как вы будете. Я надеюсь, что смогу объяснить суть. Продолжайте хорошую работу.Это для перенаправления STDERR & STDOUT:
2>/dev/null
Перенаправить STDERR в / dev / null (не показывать на консоли)
|&
Перенаправить STDERR и STDOUT в STDIN для конвейерной команды (cmd1 | & cmd2)
&>/dev/null
Перенаправьте STDERR и STDOUT в / dev / null (на консоли ничего не отображается)
>/dev/null
Перенаправить STDOUT в / dev / null (на консоли отображается только STDERR)
2>&-
Для закрытия файлового дескриптора, используемого с перенаправлением
Все это стандартные методы перенаправления для оболочек Борна.
источник
|&
и&>/dev/null
это не портативны.Считайте, что это дополнение к выбранному ответу. Вы можете узнать, какие формы POSIX, а какие нет.
Две формы POSIX участвуют:
-
Следовательно:
Последняя строка не в оригинальном вопросе, но она работает без жалоб в bash. (Также работает с / dev / tty, заменяющим / dev / null).
источник