从zsh shell运行bash脚本


11

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

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

但是,我的外壳程序默认是打开的zsh,因此要运行上述脚本,我需要/bin/bashzsh提示符下键入,然后运行. script.sh

但是,这将导致错误,并且我得到:

zsh: no matches found: [0-9]+

(我应该得到235234)。

在这一点上,我感到困惑,并有以下问题:

  1. 如果我在bash,为什么会报错zsh
  2. 为什么正则egrep表达式失败?正则表达式对我来说似乎正确。

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

谢谢

Answers:


19

如果脚本以正确的开头#!/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+,则对的调用egrep3在文件中搜索4+。在这里,只有没有文件匹配提供的模式时,bash和zsh的区别才会发挥作用:bash会以未替换的模式静默运行命令,而zsh会发出错误消息(默认情况下)。


谢谢@Guilles。这非常有帮助。奇怪的是我没有exec zsh我的~/.bashrc,也没有我的~/.profile.profile我的主目录中甚至都没有)。我不记得我是如何制作zsh默认外壳的。另外,对于造成的混乱,我们深表歉意,但是我剧本的第一行是shebang #!/bin/bash。这样,我仍然不知道为什么从中获取文件zsh不起作用(如果您对此有任何想法,请告诉我)。无论哪种情况,我都会与管理员联系以更新脚本,尽管会在正则表达式中添加引号。
阿梅利奥·瓦兹奎兹·雷纳

在zsh中采购它的问题是的第二个论点egrep
伊格纳西奥·巴斯克斯
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.