Apa sajakah petunjuk shell yang informatif dan berguna? (Bash, csh, ksh, dll.)

8

Salah satu tip Terminal Mac OS X favorit saya adalah menambahkan proses menjalankan terakhir ke judul terminal menggunakan kode berikut di .bashrc Anda .

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

Sekarang saya ingin menyesuaikan Bash prompt saya dari default menjadi sesuatu yang lebih fungsional. Apa sajakah contoh shell prompt yang berguna?

Dave K
sumber

Jawaban:

6

Saya menggunakan dua-baris sederhana:

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

atau

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

jika root. Orang-orang memandang saya seolah-olah saya gila karena menggunakan prompt dua baris, tetapi saya benci hanya melihat bagian terakhir dari jalur saat ini, dan saya bekerja dengan jalur yang terlalu panjang untuk meletakkan semuanya pada baris yang sama dengan area input.

kekacauan
sumber
Jadi saya pasti frakin gila karena menggunakan prompt 3 baris, lol.
Ivan
7

Saya memiliki skrip ~/bin/setpromptyang dijalankan oleh saya .bashrc, yang berisi:

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

Script ini mengatur prompt ke nama host diikuti oleh :)jika perintah terakhir berhasil dan :(jika perintah terakhir gagal.

Eddie
sumber
4

Namun ini adalah yang paling menakjubkan yang pernah saya lihat:

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\]'

Cobalah. Ini memberikan informasi yang baik, tetapi sebenarnya akan menyebabkan beban pada kotak Anda meningkat hanya dengan menekan enter pada prompt!

Glen Solsberry
sumber
1
hah, sangat mengesankan!
Dave K
Terlihat bagus, tetapi tidak berfungsi pada kotak freebsd saya :(
Eugene Yarmash
@ eugene y: Beberapa jalur itu mungkin tidak ada di kotak FreeBSD ...
Glen Solsberry
Terlihat menyeramkan, tapi mengesankan!
siliconpi
3

Saya penggemar prompt bash Cygwin default:

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

atau tanpa warna:

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

seperti:

username@hostname
$ ls -l
spoulson
sumber
2

Saya suka memasukkan waktu di tambang. Memberi saya semacam built in di timesekitar perintah saya:

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

Meskipun setelah melihat beberapa dari ini, itu membuat saya ingin membuat milik saya sedikit lebih pintar!

Glen Solsberry
sumber
2

Ini milik saya (gulir ke kanan untuk melihat bit yang lebih menarik):

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

Inilah hasilnya:

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

Ketika saya di dalam repositori Git :

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

Saya memilih untuk menggunakan beberapa jeda baris dan "penggaris horizontal" untuk membuatnya lebih mudah untuk memindai buffer, dan begitu banyak nama jalur tidak mendorong kursor terlalu jauh ke kanan.

Ivan
sumber
1

Dalam ksh:

Dalam profil saya., Saya mengatur var berikut (jadi var ini hanya ditetapkan sekali per sesi, tidak peduli berapa banyak su yang saya lakukan:

PCH=\>

Di .kshrc saya, saya punya:

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

Saya menjadi root dengan alias berikut, daripada "su" (kroot adalah pengguna root dengan shell ksh bukannya sh (solaris) atau bash (linux):

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

Saya juga mendefinisikan dua fungsi ini:

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

dan akhirnya di akhir .kshrc saya punya:

lprompt

Semua ini memberi saya secara otomatis pengaturan akhir dari prompt saya untuk menunjukkan apakah saya root (dan pada gilirannya jika saya memiliki orangtua yang root), direktori kerja saat ini, nama host, dan status keluar dari proses terakhir. sprompt menjatuhkan nama host, menyusutkan jalur ke hanya nama nama, dan menghapus spasi:

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>#>

Alias ​​root / me adalah bourne dari administrasi pra-sudo pada Solaris dan kebiasaan lama telah mati keras. Saya ragu ada orang yang akan menerapkan hal yang sama hari ini. Fungsi yang berubah dengan cepat dan status yang ada terus menjadi sangat berharga bagi saya.

jj33
sumber
1

Saya memiliki prompt yang sederhana, tetapi menggunakan warna untuk memberikan info tambahan:

drewble:~$ 

Warna nama host (drewble, dalam hal ini) berbeda pada setiap mesin - ketika saya mendapatkan mesin baru yang saya kerjakan, saya memilih warna yang sewenang-wenang untuk mesin itu. Dengan begitu, ketika saya memiliki banyak terminal terbuka, mudah untuk mengetahui mesin mana yang mereka masukkan SSH dan mengurangi kesalahan yang saya buat dengan berada di mesin yang salah. Selain itu, ketika saya melakukannya sudo -s, saya memasukkan nama host di semua huruf besar dan warna merah usus besar, sekali lagi, ini mengurangi kesalahan dengan membuatnya jelas Anda bertindak sebagai root. Path (direktori home saya, ~dalam hal ini) berwarna hijau terang, yang membantu memisahkan jalur output; jika sesuatu menciptakan banyak output, mudah untuk menggulir ke atas dan melihat di mana output dimulai.

# 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\] "`
Drew Stephens
sumber
1

Ini bukan shell prompt, tetapi itu adalah penyesuaian yang mungkin sesuai dengan semangat dari apa yang Anda minta.

Saya mengatur variabel lingkungan berikut:

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

Dengan cara ini, jika saya memiliki beberapa terminal terbuka melalui layar atau apa pun, saya tidak akan kehilangan sejarah ketika mereka saling beradu perubahan.

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

Ini menampilkan:

hostname:~
$ 

Dengan 'hostname' berwarna hijau jika kode pengembalian perintah yang terakhir dieksekusi adalah '0' dan merah jika itu> '0'.

jtimberman
sumber
1

Mirip dengan jawaban chaos , saya agak suka

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

yang memberi saya

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

Dengan menyertakan pengguna / host pada baris pertama, saya dapat dengan mudah menyalin seluruh garis path ketika saya menggunakan SCP , atau rsync untuk mengirim beberapa file ke direktori itu.

Zoredache
sumber
Ide bagus Saya bisa melihat memiliki jalur scp lengkap menjadi sangat berguna. Baris kedua mungkin ditingkatkan dengan menambahkan waktu seperti yang disarankan gms8994.
Dave K
0

Untuk bash aku suka

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

yang mengakibatkan:

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

Jadi Anda mendapatkan nama host, tanggal dan waktu, jalur lengkap, dan kemudian nama pengguna pada baris baru, dengan prompt. Itu untuk meminimalkan pembungkus baris dalam direktori. Saya masuk dan keluar dari kotak sepanjang hari, jadi yang bisa saya lakukan untuk menjaganya tetap baik. Saya juga memiliki set dempul untuk mencatat semuanya. Saya bisa kembali dan melihat log, dan melihat persis apa yang saya lakukan ketika. Juga berguna untuk mengetahui urutan kejadian di beberapa jendela terminal sekaligus.

Ronald Pottol
sumber
0

Prompt normal saya adalah

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

Ini memberi saya pengguna saat ini, direktori host saat ini saat ini ( tanpa mengganti $ HOME dengan ~), screenjendela saat ini dan pengembalian kesalahan terakhir. Karena saya biasanya memiliki 16 atau lebih layar windows terbuka, mengetahui yang saat ini berguna.

ahli statika
sumber
0

Zsh prompt saya:

[andrew@hostname ~]%

Biasanya, merah dan putih dengan direktori saat ini dalam warna pink. Jika root maka abu-abu gelap dengan nama host merah. Jika $?bukan 0 maka% akhir ditampilkan dengan warna merah.

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=""
}
theecereceive
sumber