Uzun komut satırlarının bir sonraki satıra sarılmasını nasıl sağlayabilirim?


108

Ubuntu'da uzun zamandır beni rahatsız eden bir şey dikkatimi çekti; bir komut satırına terminal genişliğinden daha uzun (daha geniş) bir komut yazarken, yeni bir satıra sarılmak yerine, Aynı satırdaki sütun 1 ve komut satırımın başlangıcını üzerine yazmaya başlar. (Aslında gerçek komutun üzerine yazılmaz, ancak görsel olarak görüntülenen metnin üzerine yazılır).

Bunu görmeden açıklamak zor, ama diyelim ki terminalim 20 karakter genişliğinde (Mine daha çok 120 karakter gibidir - ama bir örnek uğruna) ve ben de İngiliz alfabesini yankılamak istiyorum. Yazdığım şey şudur:

echo abcdefghijklmnopqrstuvwxyz

Ama anahtarım çarpmadan önce terminalim nasıl görünüyor?

pqrstuvwxyzghijklmno

Girdiğimde girişte yankı

abcdefghijklmnopqrstuvwxyz

bu yüzden komutun doğru bir şekilde alındığını biliyorum. Sadece "o" dan sonra yazmamı kapattı ve aynı satırda başladı.

Ne olacağını umuyorum, bu komutu yalnızca 20 karakter genişliğindeki bir terminale girersem şu olurdu:

echo abcdefghijklmno
pqrstuvwxyz

Arka plan: Kabuğum olarak bash kullanıyorum ve bu satırı ~ / .bashrc dosyasında kullanıyorum:

set -o vi

VI komutları ile komut satırında dolaşabilmek. Şu anda Ubuntu 10.10 sunucusunu kullanıyorum ve sunucuya Putty ile bağlanıyorum.

Çalıştığım başka herhangi bir ortamda, uzun bir komut satırı yazarsam, komutum terminal genişliğinden daha uzun olduğunda ve yazmaya devam ettiğimde üzerinde çalıştığım satırın altına yeni bir satır ekler. 2 farklı hat. Fakat Ubuntu'yu kullanmayı hatırlayabildiğim sürece, uzun komutlarım sadece 1 satır işgal eder.

Bu aynı zamanda tarihteki önceki komutlara geri döndüğümde de olur (Esc'ye, ardından önceki komutlara geri dönmek için 'K' ye basın) - terminal genişliğinden daha uzun bir önceki komuta geldiğimde komut satırı karışık ve komutta nerede olduğumu söyleyemem.

Uzun komutun tamamını görmek için bulduğum tek çözüm, geçerli komutu VI düzenleyicide açan "Esc-V" yi tıklatmak.

.Bashrc dosyamda tuhaf bir şey olduğunu sanmıyorum. "Set -o vi" satırını yorumladım ve hala sorun yaşadım.

Yeni bir Putty kopyası indirdim ve konfigürasyonda herhangi bir değişiklik yapmadım - bağlanmak için sadece ana bilgisayar adımı yazdım ve hala sorunum var, bu yüzden Putty ile bir şey olduğunu sanmıyorum (gerekmedikçe) bazı yapılandırma değişiklikleri yap)

Başka biri bu sorunu yaşadı mı ve birileri nasıl düzeltebileceğini düşünebiliyor mu?

Düzenle

Benim .bashrc dosyamdı. Aynı profili makineden makineye kopyaladım ve $ PS1'imde bir şekilde onu fırlatan özel karakterler kullandım. Şimdi $ PS1'imin standart bash değişkenlerini yapıyorum.

.Bashrc'deki bahşiş için @ ændrük'e teşekkür ederiz!

... Düzenlemeyi Sonlandır ...


1
Sorunun .bashrc dosyanızdan kaynaklanmadığından emin olmak için, geçici olarak bir kopyasını değiştirmenizi öneririz /etc/skel/.bashrc. Değişikliklerin geçerli olması için yeniden bağlanmanız gerekeceğini ve kendi .bashrc'nizi yedeklediğinizden emin olun.
ændrük

1
Hangi terminal uygulamasını kullanıyorsunuz? Tanımladığınız davranış olağan değil, kesinlikle bir varsayılan değil.
João Pinto,

Çalıştığım mermilerde (ve Cisco CLI'da), ekran dışı olsa bile yazdığınız satırı yeniden görüntülemek için Ctrl-L de yazabilirsiniz. Sizin durumunuzda, bu hala bahsettiğiniz kırık çıktıya neden olabilir, ama merak ediyorum.
belacqua

3
Çözüm açıklayan bir "cevap" oluşturmaktan çekinmeyin ve kabul edildi olarak işaretleyin. Biraz saçma görünebilir, ancak doğru bir cevaba sahip olmak siteyi düzenli tutmaya yardımcı olur ve gelecekte benzer sorunları yaşayan diğerlerine daha etkili bir şekilde rehberlik edebilir.
ændrük

Gereğince ServerFault bu cevap , kullanmaktput smam
Samveen

Yanıtlar:


136

PS1'inizdeki yazdırılamayan tüm baytların içinde bulunduğundan emin olun \[ \]. Aksi takdirde, bash onları istemi boyunca sayar. Satırın ne zaman kaydırılacağını belirlemek için istemin uzunluğunu kullanır.

Örneğin, burada bash bilgi istemini 19 sütun genişliğinde sayarken, terminal tarafından görüntülenen bilgi istemi yalnızca 10 sütun genişliğindedir ( My promptcamgöbeği ile >yazılmış ve varsayılan renkte yazılmıştır):

PS1='\e[36mMy prompt\e[0m>'         # bash count: 19, actual: 10

burada sadece istemi 10 sütun genişliğinde sayar çünkü özel \[ile \]kaçış arasındaki baytları yok sayar :

PS1='\[\e[36m\]My prompt\[\e[0m\]>' # bash count: 10, actual: 10

Yine de iyi uygulama için, tputzor kodlamadan ziyade terminal çıkışlarını üretmek için kullanın :

cyan=$(tput setaf 6) # \e[36m
reset=$(tput sgr0)   # \e[0m
PS1='\[$cyan\]My prompt\[$reset\]>'

Bkz http://mywiki.wooledge.org/BashFAQ/053 ve ayrıca http://wiki.bash-hackers.org/scripting/terminalcodes daha üstünde için tput.


3
Bu, kabul edilen cevabın sağlamadığı problemin harika bir açıklaması
Jamie Cook

Kodunun son satırında PS1='...'tek tırnak engellemez neden: $cyanve $resetikame dan?
andrybak

2
@ andrybak, değiştirilmelerini $cyanve $resetdeğiştirilmelerini önlerler , ancak PS1bilgi istemi her basıldığında değerlendirilir. Bunu deneyerek PS1='$var> 've sonra varçeşitli değerler vererek , istemin nasıl değiştiğini görebilirsiniz. Ardından PS1="$var> " istemin statik kaldığını fark edin; $varAtama sırasında genişletilmiş, her zaman PS1değerlendirilmez.
geirha

1
Bu harika. Bunu gönderdiğiniz için çok teşekkür ederiz! Köşeli parantezlerden kaçmayı çok daha kolay ve okunabilir hale getirir.
phyatt

Bu işi nasıl yaparım PS1=${PS1}"\e]2;$@\a". DenedimPS1=${PS1}"\[\e]2;\]$@\[\a\]"
Ramana Reddy, 10

59

Sanırım kendi PS1rengini yapılandırdın değil mi?

Sadece renk setinizden önceki teklifinizin \[içinde olduğunuzdan emin olunPS1

Örneğin:

PS1='\[\e[0;32m\u@\w/:\[\e[m '

Benim PS1 oldu export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '- Uzun süre bu birini kullanarak oldum - bu ... uyumlu KSh var
BrianH

2
Vay. Sonsuza dek beri uç istemleri kullanıyorum ve daha önce hiç bu problem yaşamadım. Bunu asla çözemezdim. Teşekkürler.
bchurchill

3
Basit tırnak kullanırken \ [kullanılması, istenmeyen bir eğik çizgi oluşturur. Ayrıca, en iyi oylanan cevabında da belirtildiği gibi, büyülü karakterlerin sonunda] kullanılmalı
igorsantos07

2
-1 çalışmıyor. Yazdırılmayan bölümü \[başlangıçta ve \]sonunda sarmanız gerekir .
wjandrea

@ igorsantos07 içindeki çift ters eğik çizgi, \\[bir düzenlemenin neden olduğu bir yazım hatasıydı. Düzelttim.
wjandrea

11

Benzer bir sorun yaşadım ve sonunda basit bir çözüm buldum.

.bashrcDosyanıza şu satırı ekleyin :

COLUMNS=250

Sonra source ~/.bashrcistediğiniz efekti elde etmek için yazın.


Dar terminatör alt bölümleri gibi bazı durumlarda, sorun promt renk karakterlerinde değil, sadece yanlış bir COLUMNS değerindedir. Bu cevap beni çok rahatsız edici bir delikten çıkardı!
Sala

1
Oturumu kapatmak gerekli değildir. Do source .bashrc. Hemen isteminiz hemen güncellenecek
Sergiy Kolodyazhnyy

1
Ben shopt yoktu çünkü bulundu setwinsizebenim partisi yüzünden seti nedenle, şu, gördüğünüz sütunları güncellenmesi değildi unix.stackexchange.com/a/167911/8337
rogerdpack

1
export COLUMNS=250Takip ettim export TERM=xtermve çok mutlu oldum.
Philip Kearns


3

Yapılması gereken basit bir şey, PS1'i ayarlamadan önce aşağıdaki satırı eklemek olacaktır:

stty columns 1000

Örneğin,

stty columns 1000
PS1='\[\e[0;32m\u@\w/:[\e[m '

ancak bu, ls ve man gibi diğer unix komutlarını etkiler.


1
Bu OSX'te çalışır.
raskhadafi

4
Bu aynı zamanda vim'i de kötü şekilde etkiler. Lütfen bunu kullanmayın.
justhalf

0

Tmux'a bağlandığımda bu sorunu yaşadım. Sorun, ipythonarka planda ( ctrl + z) bir oturumum olması ve bir şekilde satır sarımını kırmasıydı. Sonlandırdığımda ( fg, ctrl+d+d) terminalim düzgün çalışmaya başladı

Bu nedenle, durdurulmuş etkileşimli istemleri kontrol edin.


0

Ben de aynı konuyu hafif bir bükülme ile yaşadım ve çözümümü de paylaşacağımı düşündüm, sadece küçük nüansımı eklemek için: D

İlk PS1’im

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$"

Karşılaştığım sorun terminal başlığımı ve komut istemini değiştirmeye çalışmamdı. Bunu yapan yolu ekleyerek oldu \[\033]0;\]Title\aiçin PS1 değişkeninin.

Şimdi PS1'im şuydu:

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[\033]0;\]Title\a"

Bu benim için sarma hattını berbat etti. Sonunda bash \asonunda olmaktan hoşlanmıyor gibi görünüyordu . Bunu atlatmak için başlığı değiştirmiş gibi görünen bir değişkene koydum.

TITLE="\033]0;Title\a"
PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[$TITLE\]"

0

\[ve \]benim için işe yaramadı. İstemi nasıl oluşturduğum (harici bir programdan) veya istemimin "dinamik" olduğu konusunda farklı bir şey olduğunu tahmin ediyorum.

Bunu okuduktan sonra , renk kodlarını 0x01ve 0x02baytlarıyla gerçekten kaçabileceğinizi öğrendim .

Örneğin, Chalk'ın özel bir sürümünü kullanıyorum ve renkleri kullanarak şunu sardım:

const Chalk = require('@nasc/chalk');

const chalk = new Chalk.constructor({
  wrapper: {
    pre: '\1',
    post: '\2',
  }
});
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.