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


13

我正在写一个脚本围绕复制一些文件,并尝试使用shopt -s dotglob ,使CP复制点文件.jshint和诸如此类的东西。

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

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

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

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


感谢您的提醒,我将尽一切可能选择答案。除了这个问题之外,还没有一个好的答案。
Kurtosis

3
尝试使用更简单的#!/bin/bash标题吗?
ish 2012年

哪个Ubuntu版本?
ish 2012年

2
@izx是正确的答案,shopt是内置的bash,sh没有shopt,错误消息看起来像来自的错误消息dash。因此,最有可能的错误是运行bash脚本shdash默认情况下在Ubuntu中)。即使sh是的符号链接bash,使用运行bash脚本也与使用运行bash脚本sh不同bash
geirha

Answers:


23

从评论中得出答案:

许多出于习惯的人使用sh而不是来运行脚本bash。如果要考虑可移植性,那么这是一个好习惯,但是许多人这样做是因为他们在复制自己见过的内容而没有理解。

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

#!/bin/bash

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


5
要完全跨系统,我更喜欢: #!/usr/bin/env bash 因为知道要使用哪种bash是env的工作(例如,如果您已修补它)。
shrikeh 2014年

-1

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

exec bash

运行命令

source ~/.bashrc

之后,您可以响应zsh:

exec zsh

希望能有所帮助


嗯 1)我不认为OP使用的是zsh,2)~/.basrc在这种情况下,AFAIK 是在启动时由bash运行的,因此无需显式调用它,3)OP的命令在哪里执行?和4)使用exec两次会使您失去在初始zsh shell中所做的任何环境更改,如果仅调用bash不会发生这种情况。
xenoid

就我而言,需要接受环境更改,并且更改确实存在。我刚刚重新启动计算机,所有更改都被保留。也许它只是特定于我尝试设置的蟒蛇
David Kabii
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.