Sebagian besar waktu output dari perintah berakhir dengan karakter baris baru. Tapi terkadang tidak, jadi prompt shell berikutnya dicetak di baris yang sama bersama dengan output.
Contoh:
root @ hostname [~] # echo -n hello
helloroot @ hostname [~] #
Saya selalu menemukan itu sangat menjengkelkan.
Sekarang, saya bisa menambahkan "\ n" di awal variabel PS1, tetapi sebagian besar waktu itu akan mencetak satu baris tambahan yang tidak saya butuhkan.
Apakah mungkin untuk mengetahui apakah output perintah terakhir berakhir dengan baris baru atau tidak?
Solusi:
(Terima kasih kepada Dennis)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
di satu tempat dan backticks di tempat lain. Anda bisa menggunakan$()
keduanya.tput cols
karena itu hanya menampilkan nilai variabel COLUMNS, dan itu lebih lambat karena itu bukan shell builtin. Anda juga ingin memasukkan\e[K
(sama dengantput el
) untuk menghapus spasi yang dimasukkan sehingga Anda tidak mendapatkan banyak spasi spasi saat menyalin dan menempel dalam case default. Akhirnya, Anda harus menyertakan semua keajaiban ini di antara\[
dan\]
atau jika bash akan mencoba menebak posisi kursor Anda dan itu akan berantakan ketika Anda mengedit perintah / sejarah Anda.PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
Jawaban:
Saya telah bereksperimen dengan yang berikut untuk meniru fitur dari
zsh
dalam Bash:Ini mengeluarkan tanda persen video terbalik, diikuti oleh sekelompok ruang untuk membuatnya membungkus ke baris berikutnya, lalu kembali kereta, diikuti oleh tanda dolar dan spasi. Anda dapat menambahkan lolos prompt setelah "\ 015" untuk menyesuaikan prompt Anda.
Menggunakan ini tergantung pada bagaimana terminal Anda menangani pembungkus garis margin kanan (margin otomatis). Panjang PROMPT_SP arbitrer, tetapi harus setidaknya 80 atau apa pun lebar terminal Anda yang biasa. Anda mungkin perlu memberikan hard-code pada nilai tersebut jika $ COLUMNS belum ditetapkan pada saat
for
loop dijalankan~/.bashrc
. Anda mungkin inginshopt -s checkwinsize
jika belum diatur.sumber
printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
man 5 terminfo
dan cari "membalikkan video" untuk melihat beberapa dokumentasi yang menggunakan terminologi ini.Tidak itu tidak mungkin. Bash sendiri tidak memproses atau melihat output dari program yang telah dimulai.
Saya baru saja sadar bahwa mungkin saja menulis program untuk diatur
PROMPT_COMMAND
, yang akan memeriksa posisi kursor saat ini dan mengeluarkan baris baru jika kursor tidak berada di tepi kiri.sumber
zsh
mencoba menyelesaikan masalah Anda. Jika output terakhir berakhir tanpa baris baru, Anda akan mendapatkan:Di mana
%
penggunaan latar belakang / latar belakang terbalik. Tidak yakin apakah ini portabel denganbash
cara apa pun.sumber