mata merah





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 lalat dari irisan daging, nama folder dari isinya. Saya memutuskan untuk menambahkan "frame" untuk $ PWD dengan menambahkan baris "-" di bagian atas dan bawah. Bagaimana cara mengetahui jumlah karakter dalam sebuah string? Ada juga variabel sistem $ COLUMNS untuk ini.... Dan untuk dengan cepat membentuk string dengan jumlah karakter "-" yang diperlukan, gunakan perintah printf :



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? Duduk di depan komputer untuk waktu yang lama, tidak tidur. Di stackoverflow.com saya menemukan pertanyaan menarik , penulis bertanya: "bagaimana cara mengubah warna pada prompt baris perintah menjadi merah jika perintah terakhir gagal?" Ini membawa saya pada ide tentang mata merah. Mari tambahkan ke fungsi info dengan mengingat status penyelesaian dari perintah terakhir:



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 , mataku jadi merah, tapi kamu bisa menambahkan yang lain. Mari tambahkan cek untuk variabel $ debian_chroot :



[[ $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
"#" "$"?)



(*) (*)



All Articles