调用 zsh,然后 *source* 另一个文件(进入交互模式时)

fly*_*eep 7 zsh shell command-line

这个问题当然是相关的,但不同的到了一个关于执行命令

该问题的解决方案涉及启动一个子shell——这是不可能的,因为需要采购而不是执行——或者修改你的~/.zshrc,如果你想分发一个执行它的脚本,这是不可能的。(或者更确切地说,修改用户的配置文件是你不做的事情)

问题是 zsh 没有--init-file像 bash 那样的参数(我第一次看到 bash 具有 zsh 没有的功能)

我会为我的问题提供答案,但它真的很丑,我希望有人知道规避它的技巧!

fly*_*eep 3

这个网站告诉我们有一个$ZDOTDIR,它使得一个非常丑陋的解决方案成为可能:

\n\n
    \n
  1. /distdir/my-cmd:

    \n\n

    使用特定于 shell 的方法来替换 init 文件,否则就会失败。

    \n\n
    case $(basename $SHELL) in\n    zsh)  OLD_ZDOTDIR="$ZDOTDIR" ZDOTDIR="/distdir" zsh -i ;;\n    bash) bash --init-file "/distdir/.zshrc" -i ;;\n    *)    echo "Unrecognized shell $SHELL"; exit 1 ;;\nesac\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. /distdir/.zshrc:

    \n\n

    命名为.zshrc,因为名称在 zsh 中硬编码,但 bash 可以通过 传递任意命名的文件--init-file。也可以将其命名为例如our_stuff.sh,并创建一个.zshrc仅包含. ./our_stuff.sh.

    \n\n

    因为我们实际上不想替换init 文件,但为了附加另一个文件,我们必须煞费苦心地重新创建获取它们的内置序列。

    \n\n
    # ignore profile, login & logout rc files, as we want no login shells\ncase $(basename $SHELL) in\n    zsh)\n        test -f "$OLD_ZDOTDIR/.zshenv" && . "$OLD_ZDOTDIR/.zshenv"\n        test -f "$OLD_ZDOTDIR/.zshrc"  && . "$OLD_ZDOTDIR/.zshrc"\n        ;;\n    bash)\n        test -f ~/.bashrc        && source ~/.bashrc\n        test -f /etc/bash.bashrc && source /etc/bash.bashrc\n        ;;\nesac\n\ndo_our_stuff!\n\nPS1="myenv! $PS1" #tell the user he\xe2\x80\x99s in a modified shell\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n