如何用zsh编写bash脚本?



我目前正在使用默认的zsh shell在MacOS上学习bash脚本。我尝试使用bash语法read -p,但它返回-p: no coprocess。我想问一下:在zsh中编写bash时可以使用bash语法吗?因为我发现zsh风格的read即使在开始添加#!/usr/bin/env bash行也可以工作,

在testSpace.sh文件中:

#!/usr/bin/env bash
ts() {
source ~/.local/bin/testSpace.sh
}
zshread () {
read "?type some input: "
echo $REPLY
}
bashread () {
read -p "type some input: "
echo $REPLY
}

shell输出:

~/.local/bin $ source testSpace.sh
~/.local/bin $ zshread
type some input: ttt
ttt
~/.local/bin $ bashread
bashread:read:1: -p: no coprocess
ttt
~/.local/bin $

在这种情况下没有必要使用shebang#!/usr/bin/env bash。当您运行脚本或二进制文件时,exec()命令执行shebang后指定的文件。但是,如果您在命令行中显式指定解释器,则shebang将被忽略。

你可以在这里阅读更多关于shebang的工作原理。

在这种特殊情况下,使文件可执行并将其作为脚本运行将不会产生预期的结果,因为使用zsh的source内置命令将强制使用zsh解释器,这将忽略shebang。

如果您需要使用bash在zsh中执行一个函数,您可以运行bash并在-c选项后传递您的脚本。

bashread () {
bash -c '
read -p "type some input: "
echo $REPLY
'
}

接下来,在zsh解释器中,sourcefunctions.sh文件。现在,当调用bashread函数时,将执行bash,并由bash解释read -p "type some input: "行。
还可以通过在函数中插入readlink -e /proc/$$/exe行来检查进程可执行文件。

bashread () {
readlink /proc/$$/exe
bash -c '
readlink /proc/$$/exe
read -p "type some input: "
echo $REPLY
'
}

这个示例函数的输出:

$ bashread                                                                                                                                                                        
/usr/bin/zsh
/usr/bin/bash
type some input: test
test
$ 

注意bash代码是单引号'…,以防止ZSH解释器扩展。

相关内容

  • 没有找到相关文章

最新更新