从 zsh shell 运行 bash 脚本

从 zsh shell 运行 bash 脚本

我在 上运行 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改为)。

此时我很困惑并有以下问题:

  1. 如果我在bash,为什么我会收到 报告的错误zsh
  2. 为什么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将在该文件中搜索3s 4+。在这里,bash 和 zsh 之间的区别仅在没有文件与提供的模式匹配时才发挥作用:bash 使用未替换的模式静默运行命令,而 zsh 发出错误信号(默认情况下)。

相关内容