【问题标题】:Return value race condition in shell scriptshell脚本中的返回值竞争条件
【发布时间】:2024-05-23 00:45:01
【问题描述】:

在 shell 脚本中使用 wget 并获取其返回值。
示例:

wget www.google.com   
if [ $? = 0 ]  
then  
  echo "success"  
else  
  echo "fail"  
fi

Linux 运行许多 shell 脚本,包括上面的一个。假设在shell脚本中执行wget后,操作系统将控制权交给其他一些shell脚本,当再次开始执行上面的shell脚本时,$?返回值不会是wget 的返回值。

有什么方法可以避免 linux 中的 shell 脚本返回值竞争条件?

问候,
苏克迪普·辛格

【问题讨论】:

  • 基本上,你说的是永远不会发生的事情。你不需要担心这个。来自男人,$?扩展到最近执行的前台管道的退出状态。
  • 即使存在竞争条件,您也可以通过在if 语句中直接使用wget 来避免它:if wget www.google.com; then ...

标签: linux bash shell sh race-condition


【解决方案1】:

这里没有竞争条件,因为每个脚本都在不同的子 shell 中运行,并且子 shell 内的变量/环境不会被另一个正在运行的子 shell 进程覆盖。

【讨论】:

  • 但是没有竞争条件这一事实仍然不是一个很好的理由command; if [ $? = 0 ]; …
【解决方案2】:

在 shell 比较中,对于 if 语句,您有两种选择: 整数和字符串:

for string you have to use :
if [ "$var" = "mystr" ];then 
 mycode
fi;

对于整数选项,您必须使用:

if [ 1 -eq $myvar ];then 
 mycode 
fi;

注意事项:

 e = equvalent, l = less, g = great ,t = than
-eq ==
-le <=
-ge >=    
-gt >
-lt <

【讨论】:

  • 这与实际问题无关。