检测Bash是否正在运行脚本

时间:2013-03-15 23:17:22

标签: bash

我已将以下内容放在一起以检测Bash是否正在运行脚本:

################################################################################
# Checks whether execution is going through Bash, aborting if it isn't. TinoSino

current_shell="$(
  ps                  `# Report a snapshot of the current processes` \
      -p $$           `# select by PID` \
      -o comm         `# output column: Executable namename` \
  |\
  paste               `# Merge lines of files ` \
      -s              `# paste one file at a time instead of in parallel` \
      -               `# into standard output` \
  |\
  awk                 `# Pick from list of tokens` \
      '{ print $NF }' `# print only last field of the command output`
)"

current_shell="${current_shell#-}" # Remove starting '-' character if present

if [ ! "${current_shell}" = 'bash' ]; then

  echo "This script is meant to be executed by the Bash shell but it isn't."
  echo 'Continuing from another shell may lead to unpredictable results.'
  echo 'Execution will be aborted... now.'

  return 0

fi

unset current_shell
################################################################################

我没有特别要求您对代码进行审核,因为您将把我发送给CodeReview;我的问题是:

  • 你会怎样进行测试这个“执行警卫”放在我的脚本顶部是否确实可以可靠地

我正在考虑安装虚拟机,并在每台计算机上安装zshcsh等内容。但对我来说这看起来太费时间了。更好的方法吗?

如果你发现了一个立即的错误,请指出我。我想,只是瞪着挥舞着他们的腿等待被压扁的虫子应该被压扁。

2 个答案:

答案 0 :(得分:6)

这更好地写成

if [ -z "$BASH_VERSION" ]
then
   echo "Please run me in bash"
   exit 1
fi

至于测试,从/ etc / shells获取非bash shell列表,然后运行脚本,每个脚本都会验证您是否收到错误消息。

答案 1 :(得分:2)

如果对“保证”正确的结果并不重要,我只建议自己滚动。我不认为这样的保证是可能的,但大多数时候你最多只针对一些炮弹而只关心现代版本。很少有人应该关心版本检测。在离开POSIX时编写可移植代码需要知道你正在做什么。

不要打扰检测shell只是为了中止。如果人们想通过忽视那些他们的问题而放弃自己的脚步。