让我们解释一下我的疑问。
我们都知道这>&
是 shell 语法,表示“将一个文件描述符折叠到另一个文件描述符中”。
这2>&1
意味着我想将 stderr 重定向到 stdin,这很简单明了 :)
我不明白的是这个(让我们用一个例子来解释一下)
ncftpput -u $user -p $pass $host $remote_dir $local_file | zenity --text-info --title "Putting files..." --width 600 --height 300
上面的代码不起作用......但是这个可以完美地工作:
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
按照惯例,应用程序在两个文件描述符上生成输出:1 ( stdout
) 和 2 ( stderr
)。shell 的管道功能将stdout
一个进程的 重定向到stdin
另一个进程的 。这样,应用程序可以将错误或状态消息从其正常输出中分离出来,并且在通过管道传输其输出时仍然可用。
似乎您要通过管道传输的输出正在zenity
发送到stderr
。在第二个命令行中,该2>&1
部分表示将所有输出重定向ncftpput
到。这会导致它通过管道传输到。stderr
stdout
zenity