Bash: Son komutun çıktısının yeni satırla bitip bitmediğini nasıl anlayabilirim?


10

Çoğu zaman bir komutun çıktısı yeni satır karakteri ile biter. Ancak bazen gelmez, bu nedenle bir sonraki kabuk istemi çıktı ile birlikte aynı satıra yazdırılır.

Misal:

root @ hostname [~] # echo -n merhaba
helloroot @ hostname [~] #

Bunu her zaman çok sinir bozucu buldum.
Şimdi, sadece PS1 değişkeninin başına "\ n" ekleyebilirdim, ama çoğu zaman ihtiyacım olmayan ekstra bir satır yazdıracak.

Son komutun çıktısının bir satırsonu ile bitip bitmediğini bilmek mümkün müdür?


Çözüm:
(Dennis sayesinde)

PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '

Bu süper kullanıcıya taşınmalıdır.
inkaphink

Versiyonunu beğendim! $()Bir yerde kullandın , başka bir yerde geri döndün. Her $()ikisinde de kullanabilirsiniz .
sonraki duyuruya kadar duraklatıldı.

Biliyorum. Ama benim için bu şekilde okumak daha kolay
GetFree

Ben zaten tput colsçünkü sadece COLUMNS değişkenin değerini çıktısını kullanmazdım , ve daha yavaş çünkü bir kabuk yerleşik değildir. Ayrıca , varsayılan durumda kopyalama ve yapıştırma sırasında bir grup sondaki boşluk almamanız için eklenen beyaz alanı silmek için \e[K(buna eşdeğer tput el) eklemek isteyeceksiniz . Son olarak, tüm bu büyüyü \[ve \]bash arasına eklemeniz gerekir, imleç konumunuzu ikinci olarak tahmin etmeye çalışır ve komutunuzu / geçmişinizi düzenlediğinizde bozulur.
dlitz

1
Her şey şu şekilde yapılabilir:PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
dlitz

Yanıtlar:


6

Bash'teki özelliği taklit etmek için aşağıdakileri zshdeniyorum:

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

Yüzde ters bir video işareti, ardından bir sonraki satıra sarmak için bir dizi boşluk, ardından bir satır başı ve ardından bir dolar işareti ve bir boşluk yayınlar. İsteminizi özelleştirmek için "\ 015" öğesinden sonra bilgi istemi kaçışları ekleyebilirsiniz.

Bunu kullanmak, terminalinizin sağ kenar boşluğu satır kaydırmasını (otomatik kenar boşlukları) nasıl işlediğine bağlıdır. PROMPT_SP uzunluğu isteğe bağlıdır, ancak en az 80 veya normal terminal genişliğiniz ne olursa olsun olmalıdır. $ COLUMNS henüz fordöngünün çalıştığı zamana kadar ayarlanmamışsa bu değeri sabit olarak kodlamanız gerekebilir ~/.bashrc. shopt -s checkwinsizeÖnceden ayarlanmamışsa isteyebilirsiniz .


Birinin neden her cevabı düşürdüğünü merak ediyorum . Hmmm ... açıklama yok. Ne kadar yardımcı.
sonraki duyuruya kadar duraklatıldı.

Pad dizesini oluşturmak için bir döngü kullanmadan başka bir yol printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
daha vardır

"Ters video yüzde işareti" nedir? "Video" kelimesi kafamı karıştırdı ve Google'da cevabı bulamadım.
davidchambers

1
@davidchambers: Karakterin arka planı ön plan renginde ve karakterin kendisi de arka plan renginde görüntülenir. Bkz man 5 terminfove bu terminolojiyi kullanan bazı belgelere bakın "ters videoda" arayın.
sonraki duyuruya kadar duraklatıldı.

0

Hayır mümkün değil. Bash, başlattığı programın çıktısını işlemez veya görmez.

Sadece imlecin geçerli konumunu kontrol edecek ve imleç sol kenarda değilse yeni satır gönderecek şekilde ayarlanacak bir program yazmanın mümkün olabileceğini düşündüm PROMPT_COMMAND.


İyi bir fikir. Tek sorun ... imleç konumunu bilmek mümkün mü?
Get Free ''

0

zshsorununuzu çözmeye çalışır. Son çıktı bir satırsonu olmadan sona ererse, şunları elde edersiniz:

$ echo -n 'abc'
abc%
$ 

Nerede %ters arka plan / ön plan kullanır. bashHerhangi bir şekilde taşınabilir olup olmadığından emin değilim .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.