nix-shellを使用するときにPS1を保存する方法は?

nix-shellを使用するときにPS1を保存する方法は?

nix-shellPS1を独自の形式に変更します。

 [nix-shell:~/snm]$ 

~/.bashrcに "$IN_NIX_SHELL"のチェックを追加しようとしましたが、うまくいきませんでした。

私が見つけた唯一の回避策は、次を実行することです。

nix-shell --run bash

答え1

Nix 2.4 [1]以降、nix-shellソースを保存できるNIX_SHELL_PRESERVE_PROMPT環境変数をPS1追加することで追加できます。

  home.sessionVariables = {
    NIX_SHELL_PRESERVE_PROMPT=1;
  };

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

答え2

これをサポートするNixバージョンに最適なオプションですが、独自の設定を指定している間に、次の事実を悪用する以前のNIX_SHELL_PRESERVE_PROMPTバージョンの回避策があります。nix-shellPS1いいえ自分で設定すると、もう一度変更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 "$@"

関連情報