nix-shell
将 PS1 更改为其自己的格式。
[nix-shell:~/snm]$
我尝试在 ~/.bashrc 中添加对“$IN_NIX_SHELL”的检查,但它不起作用。
我发现的唯一解决方法是运行
nix-shell --run bash
答案1
从 Nix 2.4 [1] 开始,有 NIX_SHELL_PRESERVE_PROMPT 环境变量,它可以nix-shell
保留原始的PS1
.可以通过添加
home.sessionVariables = {
NIX_SHELL_PRESERVE_PROMPT=1;
};
答案2
虽然NIX_SHELL_PRESERVE_PROMPT
是支持它的 Nix 版本的最佳选择,但对于旧版本存在一种解决方法,该解决方法滥用了以下事实:虽然nix-shell
设置了自己的设置,但PS1
它确实不是设置自己的PROMPT_COMMAND
.这让你PS1
再次改变就在之前显示提示(读取:后 nix-shell
PROMPT_COMMAND
通过设置PS1
(然后取消设置本身)来更改它) 。例如,如果您想要一个仅显示 的提示>
,您可以转到
PROMPT_COMMAND='export PS1="> "; unset PROMPT_COMMAND'
export PS1="> "
使该变量在nix-shell
应该完成的时间点运行一次
答案3
一个包装脚本nix-shell
基于PROMPT_COMMAND
解决方案Sara J
#!/usr/bin/env bash
# run nix-shell with a custom prompt string
# based on /etc/bashrc
# Provide a nice prompt if the terminal supports it.
if [ "$TERM" != "dumb" ] || [ -n "$INSIDE_EMACS" ]; then
PROMPT_COLOR="1;31m"
((UID)) && PROMPT_COLOR="1;32m"
if [ -n "$INSIDE_EMACS" ]; then
# Emacs term mode doesn't support xterm title escape sequence (\e]0;)
PS1="\n\[\033[$PROMPT_COLOR\][\u@\h:\w]\\$\[\033[0m\] "
else
PS1="\n\[\033[$PROMPT_COLOR\][\[\e]0;\u@\h: \w\a\]\u@\h:\w]\\$\[\033[0m\] "
fi
if test "$TERM" = "xterm"; then
PS1="\[\033]2;\h:\u:\w\007\]$PS1"
fi
fi
# https://unix.stackexchange.com/a/729431/295986
export PROMPT_COMMAND="export PS1=${PS1@Q}; unset PROMPT_COMMAND"
exec nix-shell "$@"