![从 zsh shell 运行 bash 脚本](https://linux22.com/image/18624/%E4%BB%8E%20zsh%20shell%20%E8%BF%90%E8%A1%8C%20bash%20%E8%84%9A%E6%9C%AC.png)
我在 上运行 bash 脚本时遇到问题zsh
。该脚本类似于下面的脚本,应该在 bash 下运行:
#!/bin/bash
echo "<235234>" | egrep -oe [0-9]+
但是,我的 shell 默认情况下位于zsh
,因此要运行上述脚本,我要做的就是在提示符/bin/bash
下键入zsh
,然后运行. script.sh
。
但是,这会导致错误,我得到:
zsh: no matches found: [0-9]+
(我应该235234
改为)。
此时我很困惑并有以下问题:
- 如果我在
bash
,为什么我会收到 报告的错误zsh
? - 为什么
egrep
正则表达式失败?正则表达式对我来说看起来是正确的。
注意:如果重要的话,我不应该修改脚本(该脚本由多个用户共享,我们不应该对其进行更改)。
谢谢
答案1
如果脚本正确开头#!/bin/bash
(在此之前不能有其他注释),则只需键入 即可执行它/path/to/script.sh
,而不要.
在开头输入它。这.
是一个 include 语句,它的意思是“执行该文件的内容,就像在命令行上键入的一样”(这在 Unix shell 术语中称为“采购”)。
运行 bash 并获取脚本应该可以工作。我猜测是因为您在某些情况下自动启动了 bash,但您更喜欢 zsh,所以您已将 bash 设置为自动切换到 zsh — 也许在exec zsh
您的~/.bashrc
.不要这样做:相反,您应该在登录时执行的文件中切换到 zsh,即~/.profile
,然后不要管.bashrc
。要zsh
在终端中执行,请设置SHELL
环境变量:
# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi
不幸的是,您无法修改该脚本,因为它有错误。即使在 bash 中,也应该将括号括起来。如果当前目录中有一个被调用的文件3+
,则调用egrep
将搜索一个或多个出现的数字3
,而不是一系列任意数字。如果有一个文件被调用3+
,并且有一个文件被调用4+
,则调用egrep
将在该文件中搜索3
s 4+
。在这里,bash 和 zsh 之间的区别仅在没有文件与提供的模式匹配时才发挥作用:bash 使用未替换的模式静默运行命令,而 zsh 发出错误信号(默认情况下)。