Хорошо известно, как передать стандартный вывод процесса в стандартный ввод другого процесса:
proc1 | proc2
Но что, если я хочу отправить стандартную ошибку proc1 в proc2 и оставить стандартный вывод в его текущем местоположении? Вы могли бы подумать, что bash
будет иметь команду в соответствии с:
proc1 2| proc2
Но, увы, нет. Есть какой-либо способ сделать это?
rc
другой оболочке. Например:proc1 |[2] proc2
. Разве это не приятно? Не в том,bash
хотя.Ответы:
Также есть процесс замещения . Что делает процесс заменой файла.
Вы можете отправить
stderr
в файл следующим образом:Но вы можете заменить процесс для файла следующим образом:
Вот конкретный пример, который отправляет
stderr
на экран и добавляет в файл журналаисточник
weston --help 2> >(less)
), и это сломало мою оболочку, мне пришлось выйти и снова войти в систему.weston --help
иless
ожидают взаимодействия с клавиатурой, но только 1 из них получает его, то вы можете оказаться в неловком положении. Попробуйте выполнить тестирование с чем-то вродеgrep
этого. Кроме того, вы можете обнаружить, что оба входа мыши / клавиатуры в любом случае идут на вторую команду, а не на вестон.Вы можете использовать следующий трюк для обмена
stdout
иstderr
. Тогда вы просто используете обычную функцию конвейера.При условии,
stdout
иstderr
оба указывают на то же место в начале, это даст вам то, что вам нужно.Что
x>y
нужно сделать,x
так это изменить дескриптор файла, чтобы он теперь отправлял свою информацию туда, кудаy
указывает дескриптор файла . Для нашего конкретного случая:3>&1
создает новый дескриптор,3
который будет выводиться на текущий дескриптор1
(оригинальный stdout), просто чтобы сохранить его где-нибудь для последнего пункта маркера ниже.1>&2
изменяет дескриптор1
(stdout) для вывода на текущий дескриптор2
(оригинальный stderr).2>&3-
изменяет дескриптор2
(stderr) для вывода на текущий дескриптор3
(оригинальный stdout), затем закрывает дескриптор3
(через-
конец в конце).По сути, это команда подкачки, которую вы видите в алгоритмах сортировки:
источник
1>&2-
здесь, а не просто1>&2
? Я не понимаю, почему мы хотели бы закрыть fd2
, если мы просто собираемся открыть / переназначить его немедленно.Bash 4 имеет эту особенность:
Zsh также имеет эту функцию.
-
С другими / более старыми оболочками, просто введите это явно как
FirstCommand 2> & 1 | OtherCommand
источник
OtherCommand
записывает объединенные данные где-то, возможно, где-то еще. Так что это не те же данные, и они потенциально собираются куда-то еще. Это примерно противоположно желанию ОП, не так ли?proc1
выводит в stdout и в stderr, и вы хотите, чтобы stderrproc2
перешел к стандартному выводу (в котором находится стандартный вывод proc1), тогда мой ответ выполнит это. Я дал ОП, что он просил , возможно, не то, что он хотел попросить. В этом заключается потенциальная двусмысленность. ОП принял ответ, который меняет stdout и stderr, но это не то, что он просил.Обмен - это здорово, так как он решает проблему. На тот случай, если вам даже не нужен оригинальный стандартный вывод, вы можете сделать это следующим образом:
Порядок жизненно важен; вы бы не хотели
Как это перенаправит все на
/dev/null
!источник
Ни один из них действительно не работал очень хорошо. Лучший способ сделать то, что вы хотели, это:
Это работает только в тех случаях, когда
command
не требуется ввод с клавиатуры. например:поместил бы ошибки gzip в меньше
источник