使用自定义命令行参数运行新的zsh和bash shell

5
可以通过命令行运行自定义PS1设置的新zsh或bash shell吗?它应该覆盖由.bashrc和.zshrc分别设置的默认主题。类似于“zsh --myprompt =“ yes master?>”。编辑:我不想影响任何用户侧配置文件。我希望它适用于任何用户和任何配置。
4个回答

2
请创建自己的“shim”rcfile文件,让用户可以使用--rcfile(对于bash)或--rcs(对于zsh)选项调用它。这样可以先读取用户的rcfile文件。例如,假设我们将该文件命名为/usr/local/share/.fancypromptrc,在bash中可按如下方式实现:
source "$HOME/.bashrc"
export PS1="DOLLAZ $"

在zsh中,这可能看起来像这样:
source "${ZDOTDIR:-$HOME}/.zshrc"
export PS1="DOLLAZ $"

那么用户将使用 bash --rcfile /usr/local/share/.fancypromptrc 启动bash。在zsh中,它将是 zsh --rcs /usr/local/share/.fancypromptrc

这样,用户就不必修改他们的rcfile了,如果他们已经设置了PS1,它仍将被替换。我唯一能想象到这种方法不起作用的情况是,如果他们有一个覆盖PS1的PROMPT_COMMAND,或类似的东西。


谢谢!这与我的答案类似。如果我理解正确的话,使用--rcs选项执行shell时,shell不会首先加载用户选项吗?在这种情况下,我会坚持我的解决方案,但是感谢您解决问题!:) 另外,我刚才在一个示例文件上测试了一下,但我不知道为什么,子shell没有使用--rcs指定的文件。 - Wojciech Danilo
你仍然需要从你的shim rcfile中获取用户的.bashrc/.zshrc,就像上面的例子一样。你使用的是哪个版本的zsh? - Harmony Orb
我的系统上的zsh版本是5.0.5。 - Wojciech Danilo
奇怪,我正在运行5.0.2版本,它在那里工作。如果您发布包含“zsh --version”、“zsh --rcs somefile”输出以及“somefile”的内容的gist,或许我们可以找出问题所在。 - Harmony Orb

0

从命令行执行的任何操作都可能被配置文件覆盖。您需要稍微修改适当的文件才能使用类似于

# *After* you make any changes to PS1
if [[ -n $MY_PS1 ]]; then
    PS1=$MY_PS1
fi

如果您调用shell,如下所示:

MY_PS1='yes master? > ' bash   # or zsh

那么,MY_PS1 将会被使用,而不是在 .{bash,zsh}rc 中配置的任何内容。


好的,谢谢。确实应该可以工作,但我需要一个适用于任何用户的解决方案,而不会影响用户的配置文件 - 这可能吗?我已经在问题中添加了这个限制条件。 - Wojciech Danilo
你可以使用 PS1='...' bash --norc --noprofile 来完全关闭任何配置文件处理(zsh 也有类似的选项可用),这将防止对 PS1 进行任何进一步的修改,但这也可能会关闭很多其他配置。 - chepner

0

我找到了答案。我们只需要创建一个带有自定义配置文件的目录,例如.zshrc

source $ZDOTDIR_ORIG/.zshrc
export PS1="[x] "$PS1

然后使用脚本执行子shell,记住ZDOTDIR变量的原始值,将其保存在ZDOTDIR_ORIG名称下,就像这个伪Python代码:

if os.environ.has_key('ZDOTDIR'):
    zdotdir = os.environ['ZDOTDIR']
else:
    zdotdir = os.path.expanduser('~')

os.environ["ZDOTDIR"] = shellConfPath
os.environ["ZDOTDIR_ORIG"] = zdotdir

然后执行shell。它将使用ZDOTDIR目录中的配置文件。


-1

这样写不就可以了吗:export PS1='yes master? >' zsh/bash

我认为这么简单的方法完全可以达到你想要的效果。


嗯,我不知道为什么,但它确实有效。我正在使用Python从执行shell,使用python的函数设置子环境,但它被覆盖了。尝试这种方法时,它只是起作用,没有被子配置覆盖,耶 :) - Wojciech Danilo
1
这个不起作用。删除关键字export,如果用户的配置文件没有更改PS1的值,它可能会起作用。 - chepner
@chepner:没错!我被终端中的测试搞混了。它对于子进程不起作用。它只是在当前 shell 中导出值。 - Wojciech Danilo

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