Yas*_*ani 8 linux bash pipe exit-code
当我跑
curl | tee test.txt; echo ${PIPESTATUS[0]}
Run Code Online (Sandbox Code Playgroud)
我正确地看到
curl:尝试“curl --help”或“curl --manual”以获取更多信息
2
但是当我尝试使用“/bin/sh”运行完全相同的命令时:
sh -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"
Run Code Online (Sandbox Code Playgroud)
我得到
curl:尝试“curl --help”或“curl --manual”以获取更多信息
sh: 1: 替换错误
Bad substitution
请问我们如何解决问题?
你通过不使用来解决它sh
。
的PIPESTATUS
可变具体地,并且在${var[idx]}
阵列中一般语法,是特征特定于击壳。他们不存在POSIX SH,甚至炮弹做有阵列可能会使用不同的语法。
碰巧一些 Linux 发行版将它们符号链接/bin/sh
到 Bash。然而,其他发行版将其符号链接到dash,Debian Almquist Shell。两者都与 POSIX sh脚本兼容,但只有 Bash 接受${PIPESTATUS[…]}
语法。
因此,如果您想使用它,请bash -c "…"
改为运行。
'/bin/sh' 或 busybox 的解决方法
status=0
eval ` { ls /dontexists || echo status="$?"; } | tee /dev/null`
echo "# status=${status}"
Run Code Online (Sandbox Code Playgroud)
痕迹 :
busybox sh ~/bin/test.sh
+ status=0
+ ls /dontexists
+ tee /dev/null
ls: /dontexists: No such file or directory
+ echo status=1
+ eval status=1
+ status=1
+ echo # status=1
# status=1
Run Code Online (Sandbox Code Playgroud)