Bash: bagaimana cara mengetahui apakah output perintah terakhir berakhir dengan baris baru atau tidak?


10

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

Ini harus dipindahkan ke superuser.
ℝaphink

Saya suka versimu! Anda digunakan $()di satu tempat dan backticks di tempat lain. Anda bisa menggunakan $()keduanya.
Dijeda sampai pemberitahuan lebih lanjut.

Aku tahu. Tapi bagi saya lebih mudah untuk membaca dengan cara itu
GetFree

Saya tidak akan menggunakan tput colskarena itu hanya menampilkan nilai variabel COLUMNS, dan itu lebih lambat karena itu bukan shell builtin. Anda juga ingin memasukkan \e[K(sama dengan tput 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.
dlitz

1
Semuanya bisa dilakukan hanya sebagai:PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
dlitz

Jawaban:


6

Saya telah bereksperimen dengan yang berikut untuk meniru fitur dari zshdalam Bash:

$ unset PROMPT_SP; for ((i = 1; i <= $COLUMNS + 52; i++ )); do PROMPT_SP+=' '; done
$ PS1='\[\e[7m%\e[m\]${PROMPT_SP: -$COLUMNS+1}\015$ '

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 forloop dijalankan ~/.bashrc. Anda mungkin ingin shopt -s checkwinsizejika belum diatur.


Saya bertanya-tanya mengapa seseorang menurunkan setiap jawaban . Hmmm ... tidak ada penjelasan. Sangat membantu.
Dijeda sampai pemberitahuan lebih lanjut.

Berikut cara lain, tanpa menggunakan loop, untuk membuat string pad:printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
Dijeda hingga pemberitahuan lebih lanjut

Apa itu "tanda persen video terbalik"? Kata "video" membuat saya bingung, dan saya belum dapat menemukan jawabannya di Google.
davidchambers

1
@davidchambers: Latar belakang karakter ditampilkan dalam warna latar depan dan karakter itu sendiri ditampilkan dalam warna latar belakang. Lihat man 5 terminfodan cari "membalikkan video" untuk melihat beberapa dokumentasi yang menggunakan terminologi ini.
Dijeda sampai pemberitahuan lebih lanjut.

0

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.


Ide bagus. Satu-satunya masalah adalah ... apakah mungkin untuk mengetahui posisi kursor?
GetFree

0

zshmencoba menyelesaikan masalah Anda. Jika output terakhir berakhir tanpa baris baru, Anda akan mendapatkan:

$ echo -n 'abc'
abc%
$ 

Di mana %penggunaan latar belakang / latar belakang terbalik. Tidak yakin apakah ini portabel dengan bashcara apa pun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.