【问题标题】:How can I get the return value of `wget` from a sh script into an `int` variable如何从 sh 脚本中获取`wget`的返回值到`int`变量中
【发布时间】:2020-01-18 03:13:47
【问题描述】:

操作系统:Linux raspberrypi 4.19.58-v7l+ #1245 SMP Fri Jul 12 17:31:45 BST 2019 armv7l GNU/Linux 板子:树莓派 4

我有一个脚本:

#!/bin/bash

line=$(head -n 1 /var/www/html/configuration.txt)
file=/var/www/html/4panel/url_response.txt
if [ -f "$file" ]; then
    wget_output=$(wget -q -i "$line" -O $file --timeout=2)
    echo "$?"
else
    echo > $file
    chown pi:pi $file 
fi

我从 C++ 程序中调用:

int val_system = 0;
val_system = system("/var/www/html/4panel/get_page.sh");
std::cout<<"System return value: "<<val_system<<std::endl;

如果脚本有问题,echo "$?"会输出wget的返回值,但val_system永远是0。

system() 是否返回 echo "$?" 的值?在这种情况下,0 是正确的。如果是这种情况,我该如何将wget 的返回值放在val_system 中?

我遇到了echo "$?"总是返回8的情况,基本上我输入了一个错误的URL并且:

  • 我已尝试删除echo "$?",但val_system 仍返回0;
  • 删除echo "$?" 后,我将wget 行更改为wget -q -i "$line" -O $file --timeout=2,val_system 现在返回2048。

我的尝试都没有结果,我来这里寻求指导。如何让 val_system / system() 返回 echo "$?" 返回的内容?

如何从脚本中获取 wget 的返回值到调用脚本的 C++ 程序中的 int 变量中?

【问题讨论】:

  • 你用macos吗?
  • 我在 macos 和 freebsd 上测试了相同的结果,是的,这是新的,看到返回值是 256 的倍数。所以我看到的是当我执行 exit 1 时,它返回 256 ,当exit 2时,返回512,以此类推。检查上面链接中的答案之一,它解释了原因。
  • 伟大的收获!也许你是对的。我得到 2048 作为退出状态,这意味着 256*8。而 8 是wget 的“真实”退出状态。我会更多地测试它。我认为您可以根据此制定答案。
  • 是的。这是对的 !我尝试了不同的退出状态,它们都是 256 的倍数。

标签: c++ bash shell system


【解决方案1】:

返回的整数值system() 包含有关已执行命令状态及其退出代码的额外信息,请参阅system() 和Status Information。您需要使用WEXITSTATUS 宏提取退出代码,例如:

std::cout << "System return value: " << WEXITSTATUS(val_system) << std::endl;

【讨论】:

  • 嗯...我在问题中写了我已经尝试过但没有用。
  • 这是整个脚本,它没有返回它应该返回的内容。这就是我要说的。这就是我在这里发帖的原因。
  • 正如我在问题中所写:如果我输入了错误的 URL,echo "$?" 返回 8,如果我删除 echo "$?",则 system() 将返回 2048
  • 你也应该保留另一个答案,因为它是正确的
【解决方案2】:

如果您想回显状态并返回它,您需要将$? 的值保存到一个变量中,然后显式退出。

wget_output=$(wget -q -i "$line" -O $file --timeout=2)
status=$?
...
echo $status
...
exit $status

如果您不需要在调用wget 和脚本结束之间执行echo 或任何其他命令,您可以依靠脚本以最后一个状态退出(即对应于隐式调用 `wget)。

【讨论】:

  • 会尝试 exit 的东西,但与此同时,我仍然不明白为什么 system() 即使删除了 echo "$" 也不会返回正确的值。
猜你喜欢
  • 2022-12-04
  • 2021-03-11
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多