ユーザーの.bashrcファイルで定義された関数があり、コマンドプロンプトで現在のgitブランチ名を表示します。
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
PS1="\\[$(tput setaf 7)\\]\\w \$(parse_git_branch)> \\[$(tput sgr0)\\]"
Sudo to suを実行すると、PS1が引き継がれているように見え、コマンドを実行するたびにエラーbash: parse_git_branch: command not found
が発生します。
他のユーザーにSudoを実行したときに、自分のユーザーではなくそのPS1が使用されるようにするには、どうすればよいですか?
編集:これは、ソースa Python virtualenvを使用した後にのみ発生するようです。virtualenvをソースする前にSudosuを実行した場合、このエラーは発生しません。
どこかでexpor PS1
したことがありますか(例:Python virtualenv)?私はいつも.bashrc
または.bash_profile
にこの行を持っています:
export -n PS1 # unexport PS1 so sub-processes will not inherit it
したがって、Sudo
の前にexport -n PS1
を試してください。
PS1
はSudo
によってリセットされておらず、デフォルトで保持されています。関数はbash環境の一部ですが、Sudo
によって保持されません。あなたはいくつかのことのどれでもすることができます:
Sudo su -
を使用すると、ログインシェルが取得され、PS1
がリセットされます。env_reset
を設定して、環境を「クリーンアップ」します。おそらくenv_keep
を使用します。Sudo_PS1
を設定すると、Sudoはその値をPS1
に配置します。Sudo -i
と同様のsu -
を使用します(シェルをsudoers
ファイルに追加する必要があります)Sudo_COMMAND
の変数.bashrc
を確認し、PS1
をリセットしますSudo
が保持する変数のリスト(バージョンによって異なる場合があります。ソースのenv.c
を確認してください)には、次のものが含まれます。
DISPLAY COLORS LS_COLORS HOSTNAME PS1 PS2 TZ
これはハードコードされたリストであり、env_keep
と同じものではありません(つまり、「env_keep -=
」はリストを変更しません)。
Sudo -V
をrootとして実行して、保持または削除された変数の完全なリストを表示します(Sudo
バージョン> = v1.7の場合)。
最後の提案として、関数が存在するかどうかを確認することで、PS1
をより堅牢にすることができます。
PS1="\\[$(tput setaf 7)\\]\\w \$(type -t parse_git_branch >/dev/null && parse_git_branch)> \\[$(tput sgr0)\\]"