shopt 在命令行中工作,在脚本中运行时找不到

Kur*_*sis 14 bash scripts

我正在编写一个脚本来复制一些文件,并尝试使用shopt -s dotglob cp 来复制诸如之类的点文件.jshint

我可以shopt -s dotglob直接在 bash 提示符下运行,没有错误。但是,运行脚本会引发错误:

script.sh: 81: script.sh: shopt: not found
Run Code Online (Sandbox Code Playgroud)

我在 bash shell 中运行这个脚本,带有 shebang header #!/usr/bin/env bash。错误行:

shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/
Run Code Online (Sandbox Code Playgroud)

在谷歌上找不到任何有用的东西,知道这里有什么问题吗?

Sco*_*nce 25

从评论中形成答案:

许多人出于习惯使用sh而不是bash. 如果考虑可移植性,这是一个很好的做法,但许多人这样做是因为他们在复制他们看到的东西而不理解它。

除非您的脚本需要在非桌面 Linux 系统上运行(例如,在 Android 设备上运行 shell 脚本完全不同),否则我建议在开头使用 Bash shebang 行:

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

这一行,当它是脚本的第一行时,决定调用哪个解释器(如 bash 或 sh、Python 等 shell)来执行它。如果您使用上面的行,假设您使用默认 shell,您将获得与从命令行相同的行为(几乎)。如果出于可移植性或偏好的原因,您使用不同的 shebang 行,请注意您必须查阅所引用的 shell 的文档,即使您引用的 shell 是 Bash 的符号链接。

  • 为了完全跨系统,我更喜欢:`#!/usr/bin/env bash`,因为 env 的工作是知道要使用哪个 bash(例如,如果你已经修补了它)。 (5认同)