Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如果脚本是bash,则让任意可执行文件继承errexit_Linux_Bash - Fatal编程技术网

Linux 如果脚本是bash,则让任意可执行文件继承errexit

Linux 如果脚本是bash,则让任意可执行文件继承errexit,linux,bash,Linux,Bash,我有一个可执行脚本文件夹,其中一些有Python shebangs,而另一些有Bash shebangs,等等。我们有一个cron作业,每晚运行这个脚本文件夹,希望任何脚本中的任何错误都会退出该作业 脚本的运行方式如下:for FILE in$FILES;do./$FILE;完成 脚本由不同的人提供,虽然Python脚本总是在出错后退出,但有时开发人员会忘记在Bash脚本中添加set-e 我可以使用for循环bash-e,但是我需要检测当前脚本是否是bash/Python/etc 我可以从父脚本

我有一个可执行脚本文件夹,其中一些有Python shebangs,而另一些有Bash shebangs,等等。我们有一个cron作业,每晚运行这个脚本文件夹,希望任何脚本中的任何错误都会退出该作业

脚本的运行方式如下:
for FILE in$FILES;do./$FILE;完成

脚本由不同的人提供,虽然Python脚本总是在出错后退出,但有时开发人员会忘记在Bash脚本中添加
set-e

我可以使用for循环
bash-e
,但是我需要检测当前脚本是否是bash/Python/etc

我可以从父脚本
set-e
,然后从
source
脚本,但我仍然需要知道每个脚本使用的是哪种语言,我更希望它们作为子脚本运行,这样脚本贡献者就不必担心搞乱父脚本

grep
ing shebangs是一个很短的调整,但是知道Bash的灵活性,如果没有一种方法可以像导出变量一样“导出”影响所有子脚本的选项,我会感到惊讶。而且,通常有很多情况下我忘记了“set-e”,所以知道更多的防愚选项可能会很好


我看到了一些继承
-e
的选项,用于命令替换中涉及的子shell,但不是一般的子shell。

免责声明:永远不要这样做!这对所有相关人员都是一个巨大的伤害。您将在有细致错误处理的脚本和没有错误处理的脚本中引入失败

无论如何,没有人喜欢在StackOverflow上被告知“不要那样做”,所以我的建议是识别脚本,并用它们的shebang字符串加上
-e
:

for f in ./*
do
  # Determine if the script is a shell script
  if [[ $(file -i "$f") == *text/x-shellscript* ]]
  then
    # Read the first line
    read -r shebang < "$f"

    # The script shouldn't have been identified as a shell script without
    # a shebang, but check anyways
    if [[ $shebang != "#!"* ]]
    then
      echo "No idea what $f is" >&2
      continue
    fi
    # Strip off the #! and run it with -e and the file
    shebang=${shebang#??}
    $shebang -e "$f"
  else
    # It's some other kind of executable, just run it directly
    "$f"
  fi
done
下面是一个没有错误处理的脚本,它现在停止工作:

#!/bin/bash
my-service start
ret=$?
if [ $ret -eq 127 ]
then
  # Use legacy invocation instead
  start-my-service
  ret=$?
fi
exit "$ret"
#!/bin/sh
err=$(grep "ERROR" file.log)
if [ -z "$err" ]
then
  echo "Run was successful"
  exit 0
else
  echo "Run failed: $err"
  exit 1
fi

开发人员不要“忘记”将
set-e
添加到他们的脚本中,他们选择不这样做(例如)。我认为没有任何机制可以自动继承shell选项设置。有用的要点/示例!在我的特殊情况下,Bash脚本都遵循相同的模式:1-2个命令运行SQL查询并转储CSV。因此,当我们忽略它时,它可能会导致滚过一个失败的查询。但是,现在我将重新思考我评论中的“因此知道更多的防愚选项可能会很好”部分。也许最好在这个特殊的地方写一点额外的代码,不要用太大的锤子。如果人们在没有错误处理的情况下添加shell脚本,我会添加一些初始检查,git hook,或者,如果在未发现任何错误(例如字符串
#已处理的错误
设置-e