我目前正在使用默认的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解释器中,source
functions.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解释器扩展。