如何在Bash脚本中执行Zsh shell命令

8
我想在Bash脚本中执行Zsh函数命令。以下是一个示例:

~/.zshrc

hello () {
  echo "Hello!"
}

hello.sh

#!/bin/bash
hello

在zsh中执行上述bash脚本。
(zsh) $ ./hello.sh
hello command not found

我也尝试使用heredocs:
#!/bin/bash
/bin/zsh - <<'EOF'
  hello
EOF

使用heredocs执行上述脚本也会出现命令未找到的错误。有什么建议吗?

谢谢!


在你的bash脚本中定义函数。在脚本中调用在.zshrc中定义的函数有什么意义?你不应该这样做(即使在Zsh脚本中,除非你有充分的理由)。此外,如果你深入了解,bash和zsh并不完全兼容。 - 4ae1e1
一个有效的例子是virtualenwrapper的workon命令。即使你在bash中定义相同的函数或者源代码,当前的zsh shell也不会反映出给定的虚拟环境。 - abhiomkar
2
如果您需要当前的shell环境,您可以使用函数(而不是脚本;当然,该函数可以保存在文件中并进行源代码处理),或者传递环境变量(或作为命令行参数)。在非交互式脚本中源代码交互式init文件是不好的做法,更不用说shell不兼容问题了。 - 4ae1e1
那样的话,我需要确保我的脚本在 zsh 和 bash shell 中都可以被作为源文件使用。谢谢! - abhiomkar
没问题。即使是兼容POSIX的东西也可以编写(当然不适合心脏不好的人...),只要你注意,为bash和zsh编写代码应该很容易。 - 4ae1e1
1个回答

13

你可以像这样使用它:

#!/bin/bash

/bin/zsh -i -c hello

-i :强制shell交互

如果shell是交互式的,则从/etc/zshrc读取命令,然后再从$ZDOTDIR/.zshrc(通常为$HOME/.zshrc)读取。

-c :在此shell中运行命令


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接