в чем разница между `>> / dev / stderr` (с пробелом) и`> & 2`?

Терминалы работают не так.

Терминальные сеансы представляют собой чистые потоки байтов, поэтому все, что вы можете отправлять на терминалы, - это управляющие символы ASCII, которые заставляют терминал выполнять специальные действия (например, BS = переместить курсор на один пробел назад) и управляющие последовательности эмуляции терминала. (почти всегда вариант VT100 в наши дни), которые заставляют терминал выполнять специальные действия (например, очистить экран или установить / очистить обратное видео). Единственный из них, который может вас заинтересовать, - это управляющий символ ASCII BEL , кодовая точка 7, который предназначен для вызова терминального звонка. Но то, что он делает, полностью зависит от программного обеспечения терминала пользователя. Он может воспроизводить (фиксированный) звук, мигать экран (визуальный звонок), что-то еще или вообще ничего.

10
20.12.2016, 22:36
3 ответа

> & n - синтаксис оболочки для прямого дублирования файлового дескриптора . Дескриптор файла 2 - stderr; вот как это работает. Вы также можете дублировать другие файловые дескрипторы, а не только stderr. Вы не можете использовать здесь режим добавления, потому что дублирование дескриптора файла никогда не обрезается (даже если ваш stderr является файлом), а > & - это один токен, поэтому вы не можете поместить в него пробел, но > & 2 работает.

>> имя - это другой разрешенный синтаксис, где имя - это имя файла (а токен - >> ). В этом случае вы используете имя файла / dev / stderr , которое зависит от ОС (в Linux это символическая ссылка на / proc / self / fd / 2 ) также означает стандартную ошибку. Режимы добавления и усечения в конечном итоге делают одно и то же, когда stderr является терминалом, потому что его нельзя усечь. Однако если стандартная ошибка - это файл, он будет усечен:

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

Если вы видите ошибку с / dev / stderr через ssh, возможно, администратор сервера применил некоторые меры безопасности, препятствующие работе этой символической ссылки. (Например, вы не можете получить доступ к / proc или / dev ).Хотя я ожидал, что это вызовет все виды странных поломок, использование синтаксиса дублированного файлового дескриптора является вполне разумным (и, вероятно, немного более эффективным) подходом. Лично я предпочитаю это.

23
27.01.2020, 19:59

Случаи сбоя возникают из-за того, что синтаксис bash для использования и в перенаправлениях указывает один > и требует, чтобы он существовал непосредственно рядом с ] & знак:

[n]> & word

8
27.01.2020, 19:59

Используйте '>' для перенаправления (усекает, если существует) или '>>' (добавляет, если существует).

Используйте '>&' для дублирования потока, например, если вам нужен стандартный вывод и стандартная ошибка в одном файле, вы перенаправляете в файл '> output.log', а также ошибку с помощью '2>&'

myjob.sh > output.log 2>&
2
27.01.2020, 19:59

Теги

Похожие вопросы