web-dev-qa-db-ja.com

tcshと同様のbashまたはksh93でPS1プロンプトを生成する方法

Tcshでは、私はデフォルトを持っています:

Prompt  [%m:%c3] %n%# 

次のようなプロンプトが表示されます。

[woehler:hacking/c/hello] ajcarr% 

そして

[woehler:~] ajcarr% 

言い換えれば、現在のディレクトリと、パス内のその上の次の2つまでです。

Ksh93またはbashでは、$HOME~で置き換えるのは簡単です。現在のディレクトリの名前だけを抽出するのと同じですが、%c3の動作を複製する方法をまだ見つけていませんtcshの。現在ksh93で私は持っています:

[ajcarr@Woehler] hello $ 

そして

[ajcarr@Woehler] ~ $ 

これを行う方法について何か提案はありますか?

7
Alun Carr

_ksh93_で:

_PS1='${PWD#${PWD%?/*/*/*}?/} \$ '
share/doc/libnl-3-dev $ _

PS1='[${HOSTNAME%%.*}:${PWD#${PWD%?/*/*/*}?/}] $USER% '
[Host:share/doc/libnl-3-dev] user% _
_

_$HOME_も_~_に置き換えたい場合は、何かもっと簡単なものが必要です:

_PS1='$(d=${PWD/#$HOME/"~"};printf %s "${d#${d%?/*/*/*}?/}") $ '
~/w/maemo $ cd sb2-pathmaps
w/maemo/sb2-pathmaps $ _

PS1='$(d=${PWD/#$HOME/"~"};printf %s "[${HOSTNAME%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
[Host:w/maemo/sb2-pathmaps] user% _
_

これはbashでも機能するはずですが、bashには独自のプロンプトエスケープ(例:_\h_ for _${HOSTNAME%%.*}_)とパスの短縮がありますメカニズム(_Prompt_DIRTRIM_を使用)。

また、bashは_ksh93_とは異なり、fork()コマンド置換ごとに個別のプロセスを$(...; printf ...)コマンド置換するため、より厄介なバリアントは本当に厄介ですビルトインだけが含まれています。これは、pdkshのようなmksh派生シェルにも当てはまります。


zshプロンプトエスケープはtcshとよく似ていますが、同一ではありません。

_zsh$ PS1='[%m:%3c] %n%# '
[Host:share/doc/libnl-3-dev] user% _
_

注意:

_$HOSTNAME_変数は、デフォルトでは_ksh93_に設定されていません。代わりにunameビルトインを使用できます(_PATH=/opt/ast/bin:$PATH_で有効にした後、_/opt/ast/bin_パスが存在する必要はありません):

_PS1='$(d=${PWD/#$HOME/"~"};h=$(uname -n); printf %s "[${h%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
_

Bashの_\h_エスケープやzshtcshの_%m_エスケープとは異なり、これはwillホスト名の変更を追跡します。

8
mosvy