Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
检测Bash是否正在运行脚本_Bash - Fatal编程技术网

检测Bash是否正在运行脚本

检测Bash是否正在运行脚本,bash,Bash,我将以下内容放在一起,以检测脚本是否由Bash运行: ################################################################################ # Checks whether execution is going through Bash, aborting if it isn't. TinoSino current_shell="$( ps `# Report a snapshot

我将以下内容放在一起,以检测脚本是否由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
################################################################################
我并不是特别要求你对它进行代码审查,因为你会把我送到代码审查;我的问题是:

您将如何测试放在脚本顶部的这个执行保护程序是否确实可靠地完成其工作? 我正在考虑安装虚拟机,并在每台机器上安装zsh、csh等东西。但对我来说,这看起来太耗时了。更好的方法


如果你发现一个直接的错误,请向我指出。我认为,仅仅是挥舞着双腿等待被压扁的臭虫就应该被压扁。

这最好写成

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

对于测试,从/etc/shells获取非bash shell的列表,然后使用每个shell运行脚本,验证您是否收到了错误消息

这最好写为

if [ -z "$BASH_VERSION" ]
then
   echo "Please run me in bash"
   exit 1
fi
对于测试,从/etc/shells获取非bash shell的列表,然后使用每个shell运行脚本,验证您是否收到了错误消息

推荐 愚蠢的 如果保证正确的结果并不重要,我只建议您自己滚动。我认为这样的保证是不可能的,但大多数时候你最多只关注几个shell,而只关注现代版本。很少有人会关心版本检测。在POSIX之外编写可移植代码需要知道您在做什么

不要为了中止而费心检测外壳。如果人们想通过忽视射门来射中自己的脚,那就是他们的问题

推荐 愚蠢的 如果保证正确的结果并不重要,我只建议您自己滚动。我认为这样的保证是不可能的,但大多数时候你最多只关注几个shell,而只关注现代版本。很少有人会关心版本检测。在POSIX之外编写可移植代码需要知道您在做什么


不要为了中止而费心检测外壳。如果人们想通过忽视射门来射中自己的脚,那就是他们的问题。

你是如何开始你的剧本的/foo.sh或bash foo.sh或sh foo.sh?假设在同一个目录下,你是如何开始你的脚本的/foo.sh或bash foo.sh或sh foo.sh?假设在相同的目录下,并且保证不会导出到Bash调用的子shell?部分问题得到了回答:read/etc/shell,我不知道它的存在。谢谢但是我不确定你的-z$BASH_版本,我可能错了。啊,退出太难了,我认为最好还是回去。这不是默认情况。从理论上讲,没有什么能阻止您在另一个shell中导出名为BASH_VERSION的变量,当然,就像没有什么能阻止您将dash符号化到BASH以击败原始脚本一样。我开始怀疑这个系统阅读以下内容:[[在所有Shell中都无法识别,如果无法识别,它将返回失败并继续运行脚本的其余部分。如果这是源代码或函数,则返回是合适的,但您没有提到这一点,因此我将其视为独立脚本。至于do/done,这是一个输入错误:PAnd这保证不会导出到Subshell的invo被Bash搞晕了?部分问题得到了回答:read/etc/shell,我不知道它的存在。谢谢。我不确定你的-z$Bash_版本,但我可能是错的。啊,退出太难了,我认为最好还是返回。默认情况下不会发生。理论上没有什么可以阻止你在下一个版本中导出名为Bash_的变量呃shell当然,就像没有什么能阻止你将dash符号化到bash来击败你的原始脚本一样。我开始怀疑这个系统,读到以下内容:[[不是在所有shell中都能识别,如果不能识别,它将返回失败并继续运行脚本的其余部分。如果这是源代码或函数,则返回是合适的,但您没有提到这一点,因此我将其视为独立脚本。至于do/done,这是一个拼写错误:PRe:滚动自己的脚本是愚蠢的->您完全正确t、 这些脚本中有你知道的Ubuntu的APT软件包吗?我检查了dpkg查询-S。我应该使用经过测试的脚本。不同意让它们自食其果。向上投票来奖励这个想法:使用已经存在的东西。只需要找出如何一致地部署它。例如,包发行版B哪个解释器让我的眼睛受伤。Re:自己翻滚->你完全正确。这些脚本中有你知道的Ubuntu的APT包吗?我检查了dpkg查询-s。我应该只使用经过测试的脚本。不同意让它们射中自己的脚。向上投票来奖励这个想法:使用一些有用的东西已经存在了。只需要找出如何一致地部署它。例如,package DistribWhat_解释器使我的眼睛受伤。