You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell中here-document后> /tmp/ftp$$ 2>&1重定向如何工作?

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
!
> /tmp/ftp$$ 2>&1重定向逻辑说明

Shell解析重定向规则是从左到右顺序执行,这段可以拆成两部分逐段理解:

  • 第一部分> /tmp/ftp$$
    >默认对应标准输出流(文件描述符为1,也就是程序正常运行时打印的提示内容),作用是把原本要输出到终端的内容,重定向写入指定文件。
    其中$$是Shell内置的特殊变量,值为当前执行这条命令的Shell进程ID(PID),所以最终生成的日志文件名类似/tmp/ftp24589,带PID后缀的命名方式可以避免多个脚本实例同时运行时,日志文件互相覆盖的问题。
    这一步执行时,Shell会自动创建目标文件(如果文件已存在就先清空原有内容),把ftp进程的标准输出流绑定到这个文件的写句柄上,ftp运行时的正常提示(比如-v参数开启的连接日志、传输进度、成功提示这类内容)都会直接写入这个文件,不会打印到终端。
  • 第二部分2>&1
    2对应标准错误流(文件描述符为2,也就是程序运行出错时打印的报错信息,比如连接超时、认证失败、目标目录不存在、文件传输失败这类提示),默认也是输出到终端。
    >&是文件描述符复制语法,&1指代当前标准输出流(fd1)已经绑定的句柄,也就是前一步打开的/tmp/ftp$$日志文件。这一步执行后,ftp的报错信息也会和正常输出一样,写入同一个日志文件。

这里要特别注意顺序不能写反:如果把2>&1放在> /tmp/ftp$$前面,执行2>&1时标准输出还指向终端,错误流会被绑定到终端,后续再把标准输出改绑到文件时,错误流不会跟着变更,最终就会出现正常输出写文件、报错信息还是打印到终端的情况。

实际作用

这段重定向的核心目的是把ftp命令执行全程产生的所有输出(包括正常提示、报错信息)全部静默收集到/tmp目录的临时日志文件中,不会干扰终端的正常输出。后续脚本如果要判断FTP传输是否成功,直接读取这个临时日志匹配关键字(比如传输成功标识、报错关键字)即可,不需要实时捕获终端输出。这种写法是POSIX标准兼容写法,在所有常见Shell环境下都可以正常运行,兼容性比简写的&>写法更好。

内容的提问来源于stack exchange,提问作者yoonsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:54:23