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

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

这个问题当然与关于执行一个命令

这个问题的解决方案要么涉及启动子 shell(这是不可能的,因为需要获取资源而不是执行)要么涉及修改你的,~/.zshrc如果你想分发执行此操作的脚本,这是不可能的。(或者说,修改用户的配置文件是你不会做的事情)

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

我会对我的问题做出回答,但是它实在太丑陋了,我希望有人知道解决它的技巧!

答案1

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

  1. /distdir/my-cmd

    使用特定于 shell 的方法来替换 init 文件,否则将无可救药地失败。

    case $(basename $SHELL) in
        zsh)  OLD_ZDOTDIR="$ZDOTDIR" ZDOTDIR="/distdir" zsh -i ;;
        bash) bash --init-file "/distdir/.zshrc" -i ;;
        *)    echo "Unrecognized shell $SHELL"; exit 1 ;;
    esac
    
  2. /distdir/.zshrc

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

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

    # ignore profile, login & logout rc files, as we want no login shells
    case $(basename $SHELL) in
        zsh)
            test -f "$OLD_ZDOTDIR/.zshenv" && . "$OLD_ZDOTDIR/.zshenv"
            test -f "$OLD_ZDOTDIR/.zshrc"  && . "$OLD_ZDOTDIR/.zshrc"
            ;;
        bash)
            test -f ~/.bashrc        && source ~/.bashrc
            test -f /etc/bash.bashrc && source /etc/bash.bashrc
            ;;
    esac
    
    do_our_stuff!
    
    PS1="myenv! $PS1" #tell the user he’s in a modified shell
    

答案2

不幸的是,这个功能在 zsh 中仍然缺失,但是陳氏,一个可以实现你想要的功能的小脚本。引用它的 README:

用法:zshi <init-file> [zsh-flag]...

与普通文件相同zsh [zsh-flag]...,只是在所有标准 Zsh 启动文件之后会获取额外的 <init-file>。

相关内容