16

如何wget从 subshel​​l 进程中获取退出代码?

所以,主要问题是$?等于0。在哪里可以$?=8建立?

$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "$?"
0

tee实际上,它可以在没有的情况下工作。

$> OUT=$( wget -q "http://budueba.com/net" ); echo "$?"
8

但是${PIPESTATUS}数组(我不确定它是否与该案例有关)也不包含该值。

$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[1]}"    

$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[0]}"
0

$> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[-1]}"
0

所以,我的问题是 - 我怎样才能wget通过tee和 subshel​​l 获得退出代码?

如果有帮助,我的 bash 版本是4.2.20.

4

3 回答 3

22

通过使用$(),您正在(有效地)创建一个子shell。因此,PIPESTATUS您需要查看的实例仅在您的子shell 中可用(即在 中$()),因为环境变量不会从子进程传播到父进程。

你可以这样做:

  OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt"; exit ${PIPESTATUS[0]} );
  echo $? # prints exit code of wget.

您可以使用以下方法实现类似的行为:

  OUT=$(wget -q "http://budueba.com/net")
  rc=$? # safe exit code for later
  echo "$OUT" | tee -a "file.txt"
于 2012-02-14T13:42:26.867 回答
5

使用local变量时要注意这一点:

local OUT=$(command; exit 1)
echo $? # 0

OUT=$(command; exit 1)
echo $? # 1
于 2017-03-17T09:49:11.647 回答
0

首先复制 PIPESTATUS 数组。任何读取都会破坏当前状态。

declare -a PSA  
cmd1 | cmd2 | cmd3  
PSA=( "${PIPESTATUS[@]}" )

我使用 fifos 来解决 sub-shell/PIPESTATUS 问题。在反引号命令中看到 bash pipestatus?
我还发现这些很有用: bash 脚本:如何在管道中保存第一个命令的返回值?
https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/70675#70675

于 2013-11-02T04:03:19.823 回答