Давайте объясним вам мое сомнение.
Все мы знаем, что >&
является синтаксисом оболочки для «сворачивания файлового дескриптора в другой».
Таким образом, 2>&1
означает, что я хочу перенаправить stderr на стандартный ввод, это просто и понятно:)
Вещь, которую я не понимаю, это (давайте объясним это на примере)
Приведенный выше код не работает ... но он работает отлично:
ncftpput -u $user -p $pass $host $remote_dir $local_file 2>&1 | zenity --text-info --title "Putting files..." --width 600 --height 300
Я не понимаю, почему, если я поставлю 2>&1
перенаправление на работу zenity и если я не не пишите 2>&1
перенаправление не работает. Почему?
По соглашению приложения выводят два файловых дескриптора: 1 (stdout
) и 2 (stderr
). Трубчатый элемент оболочки перенаправляет stdout
одного процесса на stdin
другого. Таким образом, приложения могут отделять сообщения об ошибках или состояния от их нормального вывода и все еще быть пригодными для использования при передаче своих выходных данных.
Похоже, что вывод, который вы хотите передать на zenity
, отправляется на stderr
. Во второй командной строке часть 2>&1
говорит, что нужно перенаправить все выходные сигналы ncftpput
на stderr
на stdout
. Это заставляет это быть передано к zenity
.