В баш.
У меня возникли трудности с определением того, что мне следует использовать?
все мои скрипты используют ">> / dev / stderr"
при bash подскажите, если попробую:
echo test >>/dev/stderr
работает
echo test >> /dev/stderr
работает
echo test >/dev/stderr
работает
echo test > /dev/stderr
работает
echo test >>&2
FAILS!
echo test >> &2
FAILS!
echo test >&2
работает
echo test > &2
FAILS!
Я готов изменить все свои сценарии на >&2
.
Похоже, что он также имеет большое влияние на ssh (после su SomeUser
), где >>/dev/stderr
не будет работать вообще (разрешение запрещено), только >&2
будет работать.
bash
ssh
io-redirection
stderr
Водолей Сила
источник
источник
su
того, как проблема возникает, обновил вопросsu -c 'some command'
, что эта команда выполняется/bin/sh
, а неbash
так, поэтому/dev/stderr
не гарантируется наличие специфического для bash поведения (такого как моделирование для целей перенаправления, когда оно недоступно).Ответы:
>& n
это оболочка синтаксис непосредственно дублировать дескриптор файла . Файловый дескриптор 2 является stderr; Вот как это работает. Вы можете дублировать и другие файловые дескрипторы, а не только stderr. Вы не можете использовать режим добавления здесь, потому что дублирование файлового дескриптора никогда не усекается (даже если ваш stderr является файлом) и>&
является одним токеном, поэтому вы не можете поместить в него пробел - но>& 2
работает.>> name
другой допустимый синтаксис, гдеname
имя файла (и токен>>
). В этом случае вы используете имя файла/dev/stderr
, которое в зависимости от ОС (в Linux это символическая ссылка/proc/self/fd/2
) также означает стандартную ошибку. Режим добавления и усечения завершают работу, когда stderr является терминалом, потому что это не может быть усечено. Если ваша стандартная ошибка - файл, он будет усечен:Если вы видите ошибку с
/dev/stderr
over ssh, возможно, администратор сервера применил некоторые меры безопасности, предотвращающие работу этой символической ссылки. (Например, вы не можете получить доступ/proc
или/dev
). Хотя я ожидаю, что любой из них вызовет все виды странных поломок, использование синтаксиса дубликатов файловых дескрипторов является вполне разумным (и, вероятно, немного более эффективным) подходом. Лично я предпочитаю это.источник
>>
, спасибо за указание на это! Кроме того, я пропустил шагsu SomeUser
после подключения через SSH.bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/foo
усечет! (даже с2>&1 |tee /tmp/foo
), что идеально подходит для регистрации, и будет отлично работать после того, как я все это изменить>&2
. Так что я думаю, что только прямое использование файла/dev/stderr
позволяет усекать, а не дублировать дескриптор, круто, спасибо!Случаи сбоев возникают из-за того, что синтаксис bash для использования
&
в перенаправлениях определяет один>
и требует, чтобы он существовал непосредственно рядом со&
знаком:источник
Используйте
'>'
для перенаправления (усечения, если существует) или'>>'
(добавляет, если существует).Используйте
'>&'
для дублирования потока, например, если вы хотите, чтобы стандартный вывод И стандартная ошибка в одном и том же файле, вы перенаправляете в файл,'> output.log'
а также ошибка с'2>&'
источник