web-dev-qa-db-ja.com

ユーザーの.bashrcで定義された関数は、sudosuのときにエラーを引き起こします

ユーザーの.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を実行した場合、このエラーは発生しません。

3
skyler

どこかでexpor PS1したことがありますか(例:Python virtualenv)?私はいつも.bashrcまたは.bash_profileにこの行を持っています:

export -n PS1 # unexport PS1 so sub-processes will not inherit it

したがって、Sudoの前にexport -n PS1を試してください。

3
pynexj

PS1Sudoによってリセットされておらず、デフォルトで保持されています。関数は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)\\]"
7
mr.spuratic