使用nix-shell时如何保留PS1?

使用nix-shell时如何保留PS1?

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;
  };

1:https://discourse.nixos.org/t/nix-2-4-released/15822

答案2

虽然NIX_SHELL_PRESERVE_PROMPT是支持它的 Nix 版本的最佳选择,但对于旧版本存在一种解决方法,该解决方法滥用了以下事实:虽然nix-shell设置了自己的设置,但PS1它确实不是设置自己的PROMPT_COMMAND.这让你PS1再次改变就在之前显示提示(读取: nix-shellPROMPT_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 "$@"

相关内容