这个问题当然与关于执行一个命令。
这个问题的解决方案要么涉及启动子 shell(这是不可能的,因为需要获取资源而不是执行)要么涉及修改你的,~/.zshrc
如果你想分发执行此操作的脚本,这是不可能的。(或者说,修改用户的配置文件是你不会做的事情)
问题是 zsh 没有--init-file
像 bash 那样的参数(这是我第一次看到 bash 具有 zsh 没有的功能)
我会对我的问题做出回答,但是它实在太丑陋了,我希望有人知道解决它的技巧!
答案1
本网站告诉我们存在$ZDOTDIR
,这使得一个非常丑陋的解决方案成为可能:
/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
/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>。