shopt 在命令行中有效,在脚本中运行时找不到

shopt 在命令行中有效,在脚本中运行时找不到

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

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

script.sh: 81: script.sh: shopt: not found

我在 bash shell 中运行此脚本,带有 shebang 标头#!/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/

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

答案1

根据评论形成答案:

许多人出于习惯使用sh而不是 来运行脚本bash。如果可移植性是一个问题,这是一个很好的做法,但许多人这样做是因为他们复制了他们见过的东西,却没有理解它。

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

#!/bin/bash

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

答案2

您需要退出 zsh 并激活 bash,如下所示:

exec bash

运行命令

source ~/.bashrc

之后你可以响应 zsh:

exec zsh

希望有帮助

相关内容