可以通过命令行运行自定义PS1设置的新zsh或bash shell吗?它应该覆盖由.bashrc和.zshrc分别设置的默认主题。类似于“zsh --myprompt =“ yes master?>”。编辑:我不想影响任何用户侧配置文件。我希望它适用于任何用户和任何配置。
--rcfile
(对于bash)或--rcs
(对于zsh)选项调用它。这样可以先读取用户的rcfile文件。例如,假设我们将该文件命名为/usr/local/share/.fancypromptrc,在bash中可按如下方式实现:source "$HOME/.bashrc"
export PS1="DOLLAZ $"
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,或类似的东西。
从命令行执行的任何操作都可能被配置文件覆盖。您需要稍微修改适当的文件才能使用类似于
# *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
中配置的任何内容。
PS1='...' bash --norc --noprofile
来完全关闭任何配置文件处理(zsh
也有类似的选项可用),这将防止对 PS1
进行任何进一步的修改,但这也可能会关闭很多其他配置。 - chepner我找到了答案。我们只需要创建一个带有自定义配置文件的目录,例如.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
目录中的配置文件。
这样写不就可以了吗:export PS1='yes master? >' zsh/bash
?
我认为这么简单的方法完全可以达到你想要的效果。
export
,如果用户的配置文件没有更改PS1
的值,它可能会起作用。 - chepner
--rcs
选项执行shell时,shell不会首先加载用户选项吗?在这种情况下,我会坚持我的解决方案,但是感谢您解决问题!:) 另外,我刚才在一个示例文件上测试了一下,但我不知道为什么,子shell没有使用--rcs
指定的文件。 - Wojciech Danilo