Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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 Shell脚本未在Mac OS上运行_Bash_Shell - Fatal编程技术网

Bash Shell脚本未在Mac OS上运行

Bash Shell脚本未在Mac OS上运行,bash,shell,Bash,Shell,我有一个相当于执行部署的非常简单的bash脚本。这是我的密码: #!/usr/bin/env bash function print_help { echo ' Deploy the application. Usage: -r reinstall -h show help ' } reinstall=false while getopts "rh" opt; do case ${opt} in r

我有一个相当于执行部署的非常简单的bash脚本。这是我的密码:

#!/usr/bin/env bash

function print_help
{
  echo '
     Deploy the application.

   Usage:
    -r          reinstall
    -h          show help
    '
}

reinstall=false
while getopts "rh" opt; do
  case ${opt} in
    r)
      echo "clean"
      reinstall=true
      ;;
    h)
      echo "help"
      print_help
      exit 0
      ;;
  esac
done
我按如下方式调用脚本:

. deploy.sh -h
无论我做什么,这两个选项(即-r,-h)都不会产生相应的
echo
,在
-h
的情况下,不会调用
print\u help
功能


我做错了什么?

如果点和脚本名称之间有空格,那么您不是在启动脚本,而是将其源代码提供给当前的shell会话

如果您想运行scipt,您应该执行以下操作:

# chmod +x ./deploy.sh
# ./deploy.sh -h
如果您为其提供源代码,scipt中的函数和变量将在您当前的shell会话中可用,这将允许您执行以下操作:

# . ./deploy.sh
# print_help

getopts
使用全局变量
OPTIND
跟踪当前处理的参数。它解析的每个选项都会递增/更改
OPTIND
,以跟踪下一个参数

如果调用
getopt
而不更改
OPTIND
,它将从上次结束的位置开始。如果它已经解析了第一个参数,它会希望从第二个参数继续解析,等等。因为在第二次(或以后)编写脚本时没有第二个参数,只有
-h
getopt
将失败,因为它认为它已经解析了
-h


如果要重新解析当前shell中的参数,只需重置
OPTIND=1
。或者启动一个新的shell,它将自动将
OPTIND
重置为
1

您正在寻找脚本的来源。请发布正在寻找它的脚本。是否重置了getopts环境变量?从手册页
每当调用shell时,OPTIND应初始化为1。
这是我的整个脚本,所以我想我没有重置变量…
我调用脚本如下:。deploy.sh-h
-从何处调用脚本?顺便说一句,请参阅re:legacy ksh函数声明语法中最后一个表中的条目。bash支持它(像许多其他POSIX之前的kshism一样)的向后兼容性;但是,对于新代码,最好使用没有前面的
函数的
print_help(){…}
。@user1934428,参数也可以传递到bash 3.2中的
source
。在MacOS附带的版本和更新版本之间,这种行为不会受到影响;这并不完全显而易见(至少对于还没有读过卡米尔库克对这个问题的评论的人来说是如此)(“脚本不会被执行”不是真的;在中寻找脚本确实会在当前shell中执行其内容;问题是OP的代码不是幂等的;解释器会根据它是同一shell中的第一次调用还是后续调用来执行它)。(…也就是说,
.deploy.sh-h
将按照OP的预期工作,但除非重置
OPTIND
,否则每个shell只能工作一次).@CharlesDuffy脚本在来源时必须执行,否则其中的任何变量都无法解释。我只想让我的aswer更易于理解,因为它可能被理解;但我们不应该以牺牲正确性为代价追求清晰性——“但脚本不会被执行”语句是完全错误的。否则,有人可能会认为,他们可以源代码脚本只获取其函数和变量定义,而不会产生任何其他副作用。如果您这样调用它
.deploy.sh-h
,它将终止当前的shell,因为case开关中有一个出口0,这是我在使用时从未想到的功能打印帮助并使选项不可用,因为每次调用脚本时都必须打开一个新的shell!!@Delabelle:我认为退出是故意的,部署脚本的来源是从其他脚本中完成的,而不是从交互式命令行(这没有多大意义)@user1934428,根据OP,代码的生产用途来自Python。在Python解释器启动的瞬态shell子流程中寻找一些东西没有任何价值——OP接受这个答案是为了解决他们的问题。两者都支持“没有太多意义”结论。@CharlesDuffy:有趣的是,你在哪里看到的?我甚至没有看到问题中提到的Python,因为我们只能从bash命令行或其他bash脚本中获取bash脚本的源代码,我不明白Python是如何填充这里的,特别是因为在这个问题中没有Python标记。谢谢!我喜欢rlook这个。当然,寻源根本没有任何意义。而且,由于这是整个脚本,正如OP所说,整个脚本毫无意义。它除了向stdout写入内容外,什么都不做!它只设置了一个变量,其他任何地方都不使用它。