从zsh shell运行bash脚本

Modified on: Sat, 30 Jun 2018 04:40:30 +0800

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

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

但是,我的shell默认在zsh上,所以要运行上面的脚本我在/bin/bash提示,然后我运行. script.sh

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

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

(我应该改为235234。)

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

  1. 如果我在bash中,为什么我会收到zsh报告的错误?
  2. 为什么egrep regexp失败?正则表达式对我来说是正确的。
  3. 醇>

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

    由于

最佳答案

如果脚本正确地以#!/bin/bash开头(之前你没有其他评论),你只需输入/path/to/script.sh,开头没有..是一个include语句,它意味着“执行此文件的内容,就像它在命令行中输入一样”(这在unix shell术语中称为“sourcing”)。

运行bash并获取脚本应该可行。我猜这是因为你在某些情况下自动启动了bash,但是你更喜欢zsh,你已经设置了bash来自动切换到zsh - 也许你的exec zsh。不要这样做:相反,你应该切换到登录时执行的文件中的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发出错误信号(默认情况下)。

作者:Gilles

相关问答

添加新评论