有益で便利なシェルプロンプトは何ですか?(Bash、csh、kshなど)


8

私のお気に入りのMac OS X ターミナルのヒントの1つは、最後の実行プロセスを.bashrcの次のコードを使用してターミナルタイトルに追加することです。

trap 'printf "\033]0;  `history 1 | cut -b8-`  \007"' DEBUG

次に、Bashプロンプトをデフォルトからより機能的なものにカスタマイズしようとしています。シェルプロンプトの便利な例は何ですか?

回答:


6

シンプルな2ライナーを使用します。

[\w]\n\u@\h>

または

[\w]\n\u@\h#

ルートの場合。私は2行のプロンプトを使用することに夢中になっているように見えますが、現在のパスの最後の部分しか見たくないので、長すぎるパスをすべて同じ行に配置することはできません。入力エリア。


だから、私は3行のプロンプトを使用するために狂気の狂人でなければなりません、笑。
イワン

7

~/bin/setpromptが実行するスクリプトがあり.bashrc、次のものが含まれています。

RESET="\[\017\]"
NORMAL="\[\033[0m\]"
RED="\[\033[31;1m\]"
YELLOW="\[\033[33;1m\]"
WHITE="\[\033[37;1m\]"
SMILEY="${WHITE}:)${NORMAL}"
FROWNY="${RED}:(${NORMAL}"
SELECT="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"

# Throw it all together 
PS1="${RESET}${YELLOW}\h${NORMAL} \`${SELECT}\` ${YELLOW}>${NORMAL} "

このスクリプトは、:)最後のコマンドが成功した:(かどうか、最後のコマンドが失敗したかどうかが後に続くホスト名にプロンプ​​トを設定します。


4

しかし、これは私が今まで見た中で最も素晴らしいものです:

PS1='\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[0;28m\]Managing \033[1;31m\]\j\[\033[0m\]\[\033[1;30m\]/\[\033[0m\]\[\033[1;31m\]$(ps ax | wc -l | tr -d '\'' '\'')\[\033[0m\]\[\033[1;30m\] \[\033[0m\]\[\033[0;28m\]jobs.\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[0;28m\]CPU Load: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/loadavg) && echo ${temp%% *}) \[\033[0m\]\[\033[0;28m\]Uptime: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/uptime) && upSec=${temp%%.*} ; let secs=$((${upSec}%60)) ; let mins=$((${upSec}/60%60)) ; let hours=$((${upSec}/3600%24)) ; let days=$((${upSec}/86400)) ; if [ ${days} -ne 0 ]; then echo -n ${days}d; fi ; echo -n ${hours}h${mins}m)\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]$(ls -l | grep "^-" | wc -l | tr -d " ") \[\033[0m\]\[\033[0;28m\]files using \[\033[0m\]\[\033[1;31m\]$(ls --si -s | head -1 | awk '\''{print $2}'\'')\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[1;31m\]\u\[\033[0m\]\[\033[0;31m\]@\[\033[0m\]\[\033[1;31m\]\h \[\033[0m\]\[\033[1;34m\]\w\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]\t\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:. \[\033[0m\]\[\033[1;37m\]$ \[\033[0m\]'

試してみます。良い情報が得られますが、プロンプトでEnterキーを押すだけで、ボックスの負荷が実際に増加します。


1
とても印象的です!
Dave K

よさそうですが、私のfreebsdボックスでは動作しません:(
Eugene Yarmash

@eugene y:それらのパスのいくつかはおそらくFreeBSDのボックスにない...
Glen Solsberry

怖いですが、印象的です!
Siliconpi、2011年

3

私はデフォルトのCygwin bashプロンプトのファンです。

PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '

または色なし:

PS1='\n\u@\h \n\$ '

次のようになります。

username@hostname
$ ls -l

2

私は自分の時間を含めるのが好きです。time私のコマンドの周りに組み込みのようなものを与えます:

PS1="[\t \u@\h:\w]$ "

これらをいくつか見た後、私は鉱山をもう少しスマートにしたいと思います!


2

これが私のものです(右にスクロールすると、さらに興味深いビットが表示されます)。

'-------------------------------------------------------------------------------\n${debian_chroot:+($debian_chroot)}[\w]\n\u@\h\[\033[1;33m\]\[\033[0m\]($(__git_ps1 "%s")$(parse_git_dirty))$ 

結果は次のとおりです。

-------------------------------------------------------------------------------
[~]
user@host()$ 

私がGit リポジトリ内にいるとき:

-------------------------------------------------------------------------------
[~/path_to_repo]
user@host(master)$ 

バッファのスキャンを簡単にするために、複数の改行と「水平定規」を使用することを選択します。そのため、長いパス名によってカーソルが右に遠くに移動することはありません。


1

kshの場合:

私の.profileで、次の変数を設定します(したがって、この変数は、いくつの 'su'を実行しても、セッションごとに1回だけ設定されます。

PCH=\>

私の.kshrcには:

if let "${SPID:-0} != $$"; then
    PCHS="$PCHS$PCH"
fi

「su」ではなく、次のエイリアスでrootになります(krootは、sh(solaris)またはbash(linux)ではなくkshシェルを持つrootユーザーです):

alias root='PCH=\# su -m kroot'
alias me="PCH=\> su -m $USER"

これら2つの関数も定義しました。

function lprompt {
  PS1=$HOST' $? $PWD '"$PCHS "
}
function sprompt {
  PS1='$?":"${PWD##*/}'"$PCHS "
}

そして最後に.kshrcの最後に私は持っています:

lprompt

これらすべてにより、デフォルトでプロンプトの終わりが自動設定され、自分がrootであるかどうか(つまり、親がrootだった場合)、現在の作業ディレクトリ、ホスト名、および最後のプロセスの終了ステータスが示されます。spromptは、ホスト名を削除し、パスをベース名のみに縮小し、スペースを削除します。

g3 0 /home/jj33 > expr 1 / 0
expr: division by zero
g3 2 /home/jj33 > expr 1 / 1
1
g3 0 /home/jj33 > root
Password: 
g3 0 /home/jj33 ># me
g3 0 /home/jj33 >#> ^D
g3 0 /home/jj33 ># sprompt
0:jj33># me
g3 0 /home/jj33 >#> sprompt
0:jj33>#>expr 1 / 0
expr: division by zero
2:jj33>#>

root / meエイリアスは、Solarisでのsudo以前の管理から生まれたものであり、古い習慣は根絶されています。最近、まったく同じものを実装する人はいないでしょう。迅速に変化する機能と現在のステータスは、私にとって非常に貴重なものです。


1

簡単なプロンプトがありますが、色を使用していくつかの追加情報を提供します。

drewble:~$ 

ホスト名の色(この場合、drewble)はマシンごとに異なります-作業する新しいマシンを取得するとき、そのマシンに任意の色を選択します。そうすれば、多数の端末を開いているときに、どのマシンにSSH接続されているかが簡単にわかり、間違ったマシン上にいることによるミスを減らすことができます。さらに、そうするときsudo -sは、ホスト名をすべて大文字にし、コロンを赤に着色します。これにより、ルートとして機能していることが明確になり、間違いが減ります。パス(~この場合、私のホームディレクトリ)は明るい緑色で表示され、出力の行を分割するのに役立ちます。何かが大量の出力を作成する場合、上にスクロールして出力がどこから始まったかを簡単に確認できます。

# Color the hostname
HOSTNAME=`hostname|sed -e 's/\..*$//'`
if [ $HOSTNAME = 'Caligula' ] || [ $HOSTNAME = 'Caligula.local' ]; then
    export HOST_COLOR="\[\033[1;35m\]"
fi
if [ $HOSTNAME = 'drewble' ]; then
    export HOST_COLOR="\[\033[1;34m\]"
fi
if [ $HOSTNAME = 'davinci' ]; then
    export HOST_COLOR="\[\033[1;31m\]"
fi

# Color the colon red & capitalize hostname if root
COLON_COLOR='0m'
if [ ${UID} -eq 0 ]; then
    COLON_COLOR='1;31m'
fi
if [ ${UID} -eq 0 ]; then
    HOSTNAME="`echo $HOSTNAME|tr '[a-z]' '[A-Z]'`"
fi

# Set the actual prompt
PS1=`echo -ne "$HOST_COLOR$HOSTNAME\[\033[00m\]\[\e[$COLON_COLOR\]:\[\033[01;32m\]\w\[\033[00m\]\\[\033[01;33m\]\$\[\033[00m\] "`

1

これはシェルプロンプトではありませんが、あなたが求めているものの精神に合うかもしれないカスタマイズです。

次の環境変数を設定しました。

if [ -z "$PROMPT_COMMAND" ]; then
    export PROMPT_COMMAND='history -a'
else
    export PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
fi

このようにして、画面などで複数の端末を開いている場合でも、互いの変更が変化しても履歴が失われることはありません。


1
  export PS1="\[`if [[ $? = 0 ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi`:\w\n$ "

これは表示します:

hostname:~
$ 

最後に実行されたコマンドの戻りコードが「0」の場合は緑色で「hostname」、>「0」の場合は赤色で表示されます。


1

カオスの答えと同様に、私はちょっと好きです

\u@\h:\w\n\u@\h:\$

それは私に与えます

root@host-10548:/var/www/site.org
root@host-10548:$

最初の行にユーザー/ホストを含​​めることで、SCPまたはrsyncを使用してファイルをそのディレクトリに送信するときに、パス行全体を簡単にコピーできます。


素晴らしいアイデア。完全なscpパスがあると非常に便利です。2行目は、提案されたgms8994のような時間を追加することで改善される可能性があります。
Dave K

0

私が好きなバッシュについて

PS1 = "\ h \ d \ t \ w \ n \ u>"

その結果:

myserver Mon Sep 07 07:43:11 / u08
root>

そのため、プロンプトで、ホスト名、日付と時刻、完全パス、ユーザー名を新しい行で取得します。これは、ディレクトリ内の深い行の折り返しを最小限にするためです。私は一日中箱に出入りしているので、それをまっすぐに保つためにできることはすべて良いことです。私はまたすべてを記録するためにパテをセットしました。私は戻ってログを見て、いつ何をしていたかを正確に見ることができます。複数の端末ウィンドウで一連のイベントを一度に把握するのにも便利です。


0

私の通常のプロンプトは

\u@\h $PWD $WINDOW [$?] \$

これにより、現在のユーザー、現在のホストの現在のディレクトリ($ HOMEを〜で置き換えない)、現在のscreenウィンドウ、および最後のエラーが返されます。私は通常16以上の画面ウィンドウを開いているので、現在の画面ウィンドウを知っていると役に立ちます。


0

私のzshプロンプト:

[andrew@hostname ~]%

通常は赤と白で、現在のディレクトリはピンクです。ルートの場合、濃い灰色でホスト名が赤になります。$?が0でない場合、最後の%は赤で表示されます。

function precmd {

   ERR=$?

   if [ $UID -eq 0 ]; then
       MYPROMPT="$(print '%{\e[1;30m%}[%{\e[0m%}')$(print '%{\e[1;31m%}%n%{\e[0m%}')@$(print '%{\e[1;31m%}%m%{\e[0m%}') $(print '%{\e[1;35m%}%3c%{\e[0m%}')$(print '%{\e[1;30m%}]%{\e[0m%}')"
   else
       MYPROMPT="[$(print '%{\e[1;31m%}%n%{\e[0m%}')@%m $(print '%{\e[1;35m%}%3c%{\e[0m%}')]"
   fi

   if [ $ERR -ne 0 ]; then
       ERROR="$(print '%{\e[1;31m%}%#%{\e[0m%}') "
       export PS1=$MYPROMPT$ERROR
   else
       export PS1="$MYPROMPT%# "
   fi

   export RPS1=""
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.