私はbashを使い始めたばかりですが、tcshで簡単なことをプロンプトに表示させたいのですが、適切なgoogle検索を行ってもまだ実行できません。
次のように、プロンプトに現在のディレクトリと親ディレクトリのみを含めるようにしたいと思います。
/parent/currentdir $
Tcshでは、これは以下によって実現されます。
set Prompt = "%C2 %"
ただし、これまでのbashでは、同じ出力を取得するにはpwdを解析する必要があることがわかりました。
行うような簡単な方法はありませんか?
export PS1="$(some_command) $"
Bashの プロンプトコントロール 機能はかなり静的です。さらに制御したい場合は、プロンプトに変数を含めることができます。 promptvars
オプション をオフにしていないことを確認してください。
PS1='${PWD#"${PWD%/*/*}/"} \$ '
単一引用符に注意してください。変数の展開は、PS1
変数が定義されているときではなく、プロンプトが表示されたときに行われる必要があります。
表示内容をさらに制御したい場合は、コマンド置換を使用できます。たとえば、上記のスニペットは、ホームディレクトリの~
の省略形を失います。
PS1='$(case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac; printf %s "$HPWD") \$ '
このコードはかなり扱いにくいので、PS1
変数に固定する代わりに、 Prompt_COMMAND
variable を使用してコードを実行し、HPWD
を設定してから、プロンプトでそれを使用します。
Prompt_COMMAND='case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac'
PS1='$HPWD \$'
短縮されたプロンプトはディレクトリの変更時にのみ変更されるため、プロンプトが表示されるたびに再計算する必要はありません。 Bashは現在のディレクトリの変更時に実行するフックを提供していませんが、cd
およびそのいとこをオーバーライドすることで シミュレート できます。
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
case $PWD in
$HOME) HPWD="~";;
$HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
$HOME/*) HPWD="~/${PWD##*/}";;
/*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
*) HPWD="$PWD";;
esac
}
PS1='$HPWD \$'
PS1
は環境変数ではなくシェル設定であるため、エクスポートする必要はなく、エクスポートする必要もないことに注意してください。 bash PS1
設定は、他のシェルでは理解されません。
追伸素敵なインタラクティブシェルエクスペリエンスが必要な場合は、 zsh に切り替えてください。これらすべて(tcshやchpwd
などを含むプロンプト%
の展開)はネイティブ機能です。
PS1='%2~ %# '
親ディレクトリと現在のディレクトリを取得するための構文は、Munaiの answer から取得されます。
ただし、Gillesが指摘したように、そのコードは現在のディレクトリのみを表示します.bashrc
は読み込まれますが、システムを他のフォルダに移動しても変更されません。
これを.bashrc
ファイルは、プロンプトを現在のディレクトリに自動的に更新します。
Prompt_command () {
PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
Prompt_COMMAND=Prompt_command
設定Prompt_DIRTRIM=2
で十分です。
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export Prompt_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"'
ホームディレクトリに「〜」が付いた、よりシンプルなものになる場合があります。
function PWDN {
echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev
}