Bashまたはksh93でtcshに似たPS1プロンプトを生成する方法

Bashまたはksh93でtcshに似たPS1プロンプトを生成する方法

tcsh にはデフォルト値があります。

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

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

[woehler:hacking/c/hello] ajcarr% 

そして

[woehler:~] ajcarr% 

つまり、現在のディレクトリとその上の次の2つのディレクトリがパスに含まれます。

ksh93またはbashから$HOMEbyに置き換えるのは現在のディレクトリの名前を抽出するのと同じくらい簡単ですが、tcshの動作を複製する方法が見つかりませ~んでした。%c3現在、ksh93には次のものがあります。

[ajcarr@Woehler] hello $ 

そして

[ajcarr@Woehler] ~ $ 

これを行う方法について提案がある人はいますか?

ベストアンサー1

存在する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独自のプロンプトエスケープ(例:\hfor ${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% '

\hbash または%mescape inzshまたはtcshthis から脱出するのとは異なります。〜するホスト名の変更を追跡します。

おすすめ記事