从 zsh shell 运行 bash 脚本

Ame*_*ina 11 bash zsh

我在 .bash 上运行 bash 脚本时遇到问题zsh。该脚本类似于下面的脚本,应该在 bash 下运行:

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+
Run Code Online (Sandbox Code Playgroud)

但是,默认情况下我的 shell 是 on zsh,所以要运行上面的脚本,我所做的就是/bin/bash在我的zsh提示符下输入,然后运行. script.sh.

但是,这会导致错误,我得到:

zsh: no matches found: [0-9]+
Run Code Online (Sandbox Code Playgroud)

(我应该得到235234)。

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

  1. 如果我在bash,为什么我会收到由 报告的错误zsh
  2. 为什么正则egrep表达式失败?正则表达式在我看来是正确的。

注意:万一重要,我不应该修改脚本(脚本由多个用户共享,我们不应该对其进行更改)。

谢谢

Gil*_*il' 19

如果脚本正确地以#!/bin/bash(在此之前不能有其他注释)开头/path/to/script.sh,则应该通过键入 来执行它,而不要.在开头输入。这.是一个包含语句,它的意思是“执行这个文件的内容,就好像它已经在命令行上输入一样”(这在 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
Run Code Online (Sandbox Code Playgroud)

很遗憾您无法修改脚本,因为它有问题。即使在 bash 中,也应该引用括号。如果3+当前目录中有一个文件被调用,则调用egrep将搜索一个或多个出现的数字,3而不是一系列任意数字。如果有一个被调用的文件3+和一个被4+调用的文件,则调用egrep3在文件中搜索s 4+。在这里,bash 和 zsh 之间的区别仅在没有文件与提供的模式匹配时才起作用:bash 以未替换的模式静默运行命令,而 zsh 发出错误信号(默认情况下)。