ftp -v -n <<! > /tmp/ftp$$ 2>&1
open $TARGET_HOST
user $TARGET_USER $TARGET_PWORD
binary
cd $TARGET_PUT_DIR
put $RESULTS_OUT_DIR/$FILE $FILE
bye
!
我明白<<!是一个"此处文档"并将命令传递给FTP,直到到达分隔符"!"但是我似乎无法理解这个重定向:
> /tmp/ftp$$ 2>&1
谁能解释一下这里发生了什么?首先,可以将heredoc列在最后而不影响将要发生的事情。Heredocs通常写在最后,但<<NAME
,但实际上可以写在命令的任何地方。<<
相对于两次>
重定向的顺序并不重要,因为前者改变了stdin,后者改变了stdout和stderr。
如果这样写会更清楚:
ftp -v -n > /tmp/ftp$$ 2>&1 <<!
...
!
第二,解释输出重定向:
> /tmp/ftp$$
将stdout重定向到一个名为/tmp/ftp1234
的文件,其中1234
是当前shell进程的PID。这是一种使用相对唯一的名称创建临时文件的特殊方法。如果shell脚本并行运行几次,每次拷贝都会写入不同的临时文件。2>&1
重定向stderr (fd 2)到stdout (fd 1),也就是说,它向同一个文件/tmp/ftp$$
发送错误消息。