Hai, Saya mempersembahkan untuk perhatian Anda sebuah tutorial kecil tentang cara merancang prompt baris perintah dengan mata merah.
Setiap orang yang bekerja di konsol beberapa Linux mungkin mencatat fitur yang nyaman untuk menampilkan folder saat ini, nama pengguna, nama server dan sesuatu yang lain tergantung pada distra di baris prompt. Saya selalu menyukainya juga. Tapi kadang-kadang ternyata seperti ini:
Sulit untuk "membuat" dalam baris tiga karakter, tentu saja kursor berpindah ke baris berikutnya, tetapi lebih membuat marah daripada membantu. Dan pada titik tertentu, saya berkata pada diri sendiri:
Saya memutuskan untuk mengambil kembali semua ruang baris perintah dan tidak pernah memberikannya kepada siapa pun lagi. Pertanyaannya adalah bagaimana cara mengubah teks command prompt? Ternyata sangat sederhana, cukup ubah variabel sistem khusus `PS1`.
Ya, Anda dapat menyetel teks undangan baru langsung di terminal. Tapi bagaimana Anda menyimpan perubahan? Dan bahkan tanpa informasi tentang katalog terbaru, Anda entah bagaimana merasa tidak nyaman, terus-menerus bertanya pada diri sendiri: "Di mana saya?" File ~ / .bashrc akan membantu , di dalamnya Anda dapat menyimpan perubahan PS1, dan agar informasi tentang direktori saat ini tidak memakan ruang kerja, saya memutuskan untuk menempatkannya bukan DI, tetapi DI ATAS baris perintah. Tambahkan baris berikut ke file ~ / .bashrc :
PS1='$PWD\n# '
Perhatikan tanda kutip tunggal, jika kita menggunakan tanda kutip ganda, alih-alih penunjuk ke variabel $ PWD ( variabel sistem yang menyimpan path lengkap dari folder saat ini, analog dengan perintah pwd) , nilainya (direktori saat ini) akan ditulis ke string prompt dan diubah saat berpindah dari folder foldernya tidak akan. Ini terlihat seperti ini: Baris
perintah benar-benar gratis, tetapi nama folder menyatu dengan konten jika Anda menjalankan perintah ls . Kita harus memisahkan
printf -v line "%${COLUMNS}s"
Perintah ini akan membuat variabel $ line dan mengisinya dengan spasi sebesar $ COLUMNS tetapi kita tidak membutuhkan spasi tetapi "-", untuk ini kita menggunakan trik berikut:
line=${line// /-} # -
Mari tambahkan kode ini ke ~ / .bashrc
printf -v line "%${COLUMNS}s"
line=${line// /-}
PS1='\n$line\n$PWD\n$line\n# '
Bagus, tetapi jika kita mengubah ukuran jendela terminal sekarang, ukuran "garis" tidak akan berubah dan keindahannya akan hilang:
Untuk memperbaiki situasi ini, kita akan mentransfer kode baru ke fungsi info dan menambahkannya ke PS1:
info () {
printf -v line "%${COLUMNS}s"
line=${line// /-}
printf "\n$line\n$PWD\n$line\n# "
}
PS1='$(info)'
Anda dapat menggabungkan bisnis dengan kesenangan dengan menambahkan "sisipkan" dengan nama host ke pembatas atas. Sisipan dengan nama akan berada di tengah, untuk ini kita perlu menghitung pusat garis (dengan mempertimbangkan panjang nama host dan karakter tambahan):
info () {
name_length="{ $HOSTNAME }"
name_length=${#name_length}
top_line_left=$[(COLUMNS-name_length)/2]
top_line_right=$[COLUMNS-(top_line_left+name_length)]
printf -v top_line "%${top_line_left}s{_S_${HOSTNAME}_S_}%${top_line_right}s"
printf -v bot_line "%${COLUMNS}s"
bot_line=${bot_line// /-}
top_line=${top_line// /-}
top_line=${top_line//_S_/ }
printf "\n$top_line\n$PWD\n$bot_line\n# "
}
PS1='$(info)'
Saya telah melampirkan nama host dalam tanda kurung kurawal dengan spasi, tetapi alih-alih spasi di sekitar $ HOSTNAME , karakter "_S_" digunakan, yang kemudian diubah menjadi spasi. Ini diperlukan karena semua spasi di baris terakhir diganti dengan "-", dan spasi harus tetap berada di dalam sisipan. Mari tambahkan warna, untuk ini kita akan menyiapkan variabel dengan kode untuk mengubah warna teks di terminal, saya menggunakan warna berikut:
RED='\e[31m' #
GRN='\e[32m' #
YLW='\e[33m' #
BLU='\e[34m' #
MGN='\e[35m' #
DEF='\e[0m' #
BLD='\e[1m' #
DIM='\e[2m' #
Mari tambahkan variabel ini ke kode kita:
info () {
name_length="{ $HOSTNAME }"
name_length=${#name_length}
top_line_left=$[(COLUMNS-name_length)/2]
top_line_right=$[COLUMNS-(top_line_left+name_length)]
printf -v top_line "%${top_line_left}s{_S_$DEF$BLD$HOSTNAME${DEF}_S_$GRN}%${top_line_right}s"
printf -v bot_line "%${COLUMNS}s"
bot_line=$GRN${bot_line// /-}$DEF
top_line=${top_line// /-}
top_line=$GRN${top_line//_S_/ }$DEF
printf "\n$top_line\n$BLD$BLU$PWD$DEF\n$bot_line\n# "
}
PS1='$(info)'
Silakan, sisi kanan terlihat kosong, Anda dapat meletakkan tanggal dan waktu di sana:
printf -v date "%(%a %d %b %T)T"
Untuk menempatkan ini di sebelah kanan, Anda perlu menambahkan sejumlah spasi setelah $ PWD , apa, mari kita hitung:
center_space=$[COLUMNS-${#date}-${#PWD}]
((center_space<0)) && center_space=1
...
printf "\n$top_line\n$BLD$BLU$PWD$DEF%${center_space}s$DIM$date\n$bot_line\n# "
Bisakah kamu lebih baik? Tentu saja, mari tambahkan keluaran status git jika kita berada di folder dengan proyek git :
git_tst= git_clr=
[[ -d .git ]] && {
git_tst=($(git status -c color.ui=never -sb))
git_tst="GIT ${git_tst[*]} " #
git_clr=(GIT $(git -c color.ui=always status -sb))
git_clr="GIT ${git_clr[*]} " #
}
...
center_space=$[COLUMNS-${#date}-${#PWD}-${#git_tst}]
...
printf "\n$top_line\n$BLD$BLU$PWD$DEF%${center_space}s$git_clr$DIM$date\n$bot_line\n\$ "
Perhatikan bahwa git_clr dan git_tst ditulis pertama kali sebagai larik, lalu dikonversi menjadi variabel. Ini diperlukan untuk menghapus jeda baris dari keluaran status git . Tapi dimana matanya? Sekarang akan ada mata O_o, mari buat array dengan satu set mata dasar:
eyes=(O o ∘ ◦ ⍤ ⍥)
Dan mari kita hitung jumlahnya:
en=${#eyes[@]}
Mari tambahkan simbol mulut:
mouth='_'
Dan mari kita membuat generator wajah acak:
face () {
printf "$YLW${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}$DEF"
}
Mata akan terletak di tepi bidang informasi, Anda perlu memperhitungkannya saat menghitung jumlah ruang di tengah, kami akan menyiapkan variabel terpisah untuk ini:
face_tst='O_o o_O'
...
center_space=$[COLUMNS-${#date}-${#PWD}-${#git_tst}-${#face_tst}]
printf "\n$top_line\n$(face) $BLD$BLU$PWD$DEF%${center_space}s$git_clr$DIM$date $(face)\n$bot_line\n\$ "
Bagaimana cara membuat mata Anda menjadi merah?
info () {
error=$?
...
}
Dan mari kita ubah fungsi wajah sehingga ia memeriksa variabel $ error dan, bergantung pada nilainya, mewarnai mata dengan warna merah atau kuning:
face () {
[[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}
Nah
[[ $debian_chroot ]] && chrt="($debian_chroot)" || chrt=
...
name_length="{ $HOSTNAME$chrt }"
...
printf -v top_line "%${top_line_left}s{_S_$DEF$BLD$HOSTNAME$chrt${DEF}_S_$GRN}%${top_line_right}s"
Dan mari kita ubah teks di judul jendela terminal:
PS1='$(info)'; case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;$(face 1) \w\a\]$PS1";; esac
Judul akan menampilkan wajah dan direktori saat ini, tetapi kita harus sedikit memodifikasi fungsi wajah sehingga menggambar wajah tanpa kode warna, mereka akan ditampilkan di judul hanya sebagai teks, kita akan memberikan fungsi wajah beberapa parameter (misalnya "1"), tambahkan tanda centang di dalam fungsi, jika argumen pertama diberikan, keluarkan moncong tanpa pewarnaan:
face () {
[[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
[[ $1 ]] && printf "${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}" \
|| printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}
Skrip akhir:
RED='\e[31m' #
GRN='\e[32m' #
YLW='\e[33m' #
BLU='\e[34m' #
MGN='\e[35m' #
DEF='\e[0m' #
BLD='\e[1m' #
DIM='\e[2m' #
eyes=(O o ∘ ◦ ⍤ ⍥) en=${#eyes[@]} mouth='_'
face () {
[[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
[[ $1 ]] && printf "${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}" \
|| printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}
info () { error=$? git_tst= git_clr=
[[ -d .git ]] && {
git_tst=($(git -c color.ui=never status -sb))
git_tst="GIT ${git_tst[*]} " #
git_clr=($(git -c color.ui=always status -sb))
git_clr="GIT ${git_clr[*]} " #
}
[[ $debian_chroot ]] && chrt="($debian_chroot)" || chrt=
name_length="{ $HOSTNAME$chrt }"
name_length=${#name_length}
face_tst='O_o o_O'
top_line_left=$[(COLUMNS-name_length)/2]
top_line_right=$[COLUMNS-(top_line_left+name_length)]
printf -v top_line "%${top_line_left}s{_S_$DEF$BLD$HOSTNAME$chrt${DEF}_S_$GRN}%${top_line_right}s"
printf -v bot_line "%${COLUMNS}s"
printf -v date "%(%a %d %b %T)T"
top_line=${top_line// /-}
top_line=$GRN${top_line//_S_/ }$DEF
bot_line=$GRN${bot_line// /-}$DEF
center_space=$[COLUMNS-${#date}-${#PWD}-${#git_tst}-${#face_tst}]
((center_space<0)) && center_space=1
printf "\n$top_line\n$(face) $BLD$BLU$PWD$DEF%${center_space}s$git_clr$DIM$date $(face)\n$bot_line\n\$ "
}
PS1='$(info)'; case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;$(face 1) \w\a\]$PS1";; esac
Itu saja, terima kasih atas perhatiannya!) Berlangganan, seperti, itu saja, proyek ada di bilah info github Buat, ciptakan, coba!)
pemeriksaan perawatan
"#" "$"?)
(*) (*)