web-dev-qa-db-ja.com

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

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

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

現在、Bashプロンプトをデフォルトからより機能的なものにカスタマイズしようとしています。シェルプロンプトの便利な例を教えてください。

8
Dave K

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

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

または

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

ルートの場合。人々は私が2行のプロンプトを使用することに夢中になっているように私を見ますが、私は嫌い現在のパスの最後の部分しか見ていません、そして私は全体を置くには長すぎるパスで作業します入力領域と同じ行にあるもの。

6
chaos

~/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} "

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

7
Eddie

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

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キーを押すだけで、ボックスの負荷が実際に増加します。

4
Glen Solsberry

私はデフォルトのCygwinbashプロンプトのファンです:

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
3
spoulson

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

'-------------------------------------------------------------------------------\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)$ 

バッファーのスキャンを容易にするために、複数の改行と「水平定規」を使用することを選択しました。そのため、パス名が長いと、カーソルが右に移動しすぎないようになります。

2
Ivan

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

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

これらのいくつかを見た後、それは私を少し賢くしたいと思います!

2
Glen Solsberry

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

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

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

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

1
deinspanjer

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

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

それは私に与えます

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

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

1
Zoredache

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

これらすべてにより、デフォルトでプロンプトの終わりが自動的に設定され、自分がルートであるかどうか(さらに、ルートである親があるかどうか)、現在の作業ディレクトリ、ホスト名、および最後のプロセスの終了ステータスが示されます。 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
jj33
  export PS1="\[`if [[ $? = 0 ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi`:\w\n$ "

これは以下を表示します:

hostname:~
$ 

最後に実行されたコマンドの戻りコードが「0」の場合は緑色の「ホスト名」、>「0」の場合は赤色。

1
jtimberman

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

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
Drew Stephens

Bashの場合は好きです

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

その結果:

myserver Mon Sep 07 07:43:11/u08
ルート>

したがって、プロンプトを使用して、新しい行にホスト名、日付と時刻、フルパス、およびユーザー名を取得します。これは、ディレクトリ内の深い行の折り返しを最小限にするためです。私は一日中箱の内外にいるので、まっすぐに保つためにできることはすべて良いことです。また、すべてをログに記録するようにPuTTYを設定しています。戻ってログを確認し、いつ何をしていたかを正確に確認できます。また、複数のターミナルウィンドウでイベントのシーケンスを一度に把握するのにも便利です。

0
Ronald Pottol

私の通常のプロンプトは

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

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

0
staticsan

私の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=""
}
0
theotherreceive