我在 .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
)。
此时我很困惑,有以下问题:
bash
,为什么我会收到由 报告的错误zsh
?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+
调用的文件,则调用egrep
将3
在文件中搜索s 4+
。在这里,bash 和 zsh 之间的区别仅在没有文件与提供的模式匹配时才起作用:bash 以未替换的模式静默运行命令,而 zsh 发出错误信号(默认情况下)。
归档时间: |
|
查看次数: |
32396 次 |
最近记录: |