Azure DevOps Bash步骤重定向到/dev/stdout时报'No such device or address'错误
问题分析与解决思路
核心原因
从你提供的/proc/self/fd输出能看到,Bash进程的stdout(文件描述符1)指向的是socket:[27965],而非传统终端设备。Azure DevOps流水线的Bash步骤并非运行在交互式终端环境中,stdout/stderr实际上是连接到流水线日志收集服务的socket。
/dev/stdout是指向当前终端的符号链接,但当前环境没有可用终端设备,直接写入这个链接会触发No such device or address错误。同理,/dev/tty、/dev/pts/0这类终端设备文件,由于流水线未分配交互式终端,也无法正常写入。
解决办法
无需显式重定向到stdout
echo等命令默认就会输出到stdout,Azure DevOps会自动收集这部分输出到流水线日志中。直接简化代码即可:- bash: | echo "Hello World to stdout"必须重定向时使用文件描述符
如果需要将其他输出流(比如某个命令的stderr)重定向到stdout,直接使用文件描述符&1(对应stdout)或&2(对应stderr),而非设备文件:# 将stderr合并到stdout输出 some_command >&1 # 单独重定向stdout some_command >&1
这种方式直接操作当前进程的文件描述符,不管它是socket还是终端,都能正常工作。
内容的提问来源于stack exchange,提问作者wesaw
相关产品推荐
相关产品推荐

