【问题标题】:How to execute Zsh shell commands in Bash Script如何在 Bash 脚本中执行 Zsh shell 命令
【发布时间】:2015-11-12 06:53:46
【问题描述】:

我想在 Bash 脚本中执行 Zsh 函数命令。这是一个例子:

~/.zshrc

hello () {
  echo "Hello!"
}

你好.sh

#!/bin/bash
hello

在zsh中执行上面的bash脚本

(zsh) $ ./hello.sh
hello command not found

我也尝试过使用 heredocs:

#!/bin/bash
/bin/zsh - <<'EOF'
  hello
EOF

用 heredocs 执行上面的脚本也会说 command not found 错误。

有什么建议吗?

谢谢!

【问题讨论】:

  • 在 bash 脚本中定义函数。在脚本中调用.zshrc 中定义的函数有什么意义?你不应该这样做(即使在 Zsh 脚本中,除非你有正当理由)。此外,如果深入,bash 和 zsh 并不完全兼容。
  • 一个有效的例子是 virtualenwrapper 的 workon 命令。即使你在 bash 中定义了相同的函数或者 source 它,当前的 zsh shell 也不会反映在给定的虚拟环境中。
  • 如果你需要当前的 shell 环境,你可以使用一个函数(而不是一个脚本;当然这个函数可以保存在一个文件中并获取源)或者传递环境变量(或者作为命令行论据)。在非交互式脚本中获取交互式初始化文件在任何情况下都是不好的做法,更不用说 shell 不兼容问题了。
  • 是有道理的,在这种情况下,我需要确保我的脚本在 zsh 和 bash shell 中是可用的。谢谢!
  • 没问题。鉴于即使是与 POSIX 兼容的东西也可以编写(当然不适合胆小的人......),只要你注意,为 bash 和 zsh 编写代码应该很容易。

标签: bash shell zsh


【解决方案1】:

你可以这样使用它:

#!/bin/bash

/bin/zsh -i -c hello

-i : 强制 shell 交互

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

-c : 在这个 shell 中运行一个命令

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-24
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2020-12-08
    • 2011-10-16
    相关资源
    最近更新 更多