Tek bir alıntı yazdığımda terminal hangi moda giriyor?


11

'Terminalde tek tırnak girdiğimde başka bir moda geçiyor ve komutlar yürütülmüyor. Bu mod nedir ve ne zaman kullanıyoruz?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#

30
ve neden kök olarak çalışıyorsun?
Zanna

13
Terminaliniz öncekiyle aynı modda - kabuğunuz farklı bir modda (bir dizenin diğeriyle tamamlanmasını bekliyor ')
ohno

Yanıtlar:


26

Etkili bir şekilde, kabuk tam bir komut / ifade ister ve bu nedenle bilgi PS2istemi dizesini görüntüler .

Gönderen man bash:

telkin

Etkileşimli olarak yürütülürken, bash bir komutu okumaya hazır olduğunda birincil istem PS1'i ve bir komutu tamamlamak için daha fazla giriş gerektiğinde ikincil istem PS2'yi görüntüler.

Ve bundan biraz önce:

  PS2    The value of this parameter is  expanded
          as  with  PS1  and used as the secondary
          prompt string.  The default is ``> ''.

Bu nedenle, belgeleri okumaktan tahmin edebileceğiniz gibi, mermilerin farklı amaçlarla birden fazla istemi vardır. PS1İstemi senin olduğu root@sai:~#sen komutları girin normalde gösterir dizesi. >olduğu PS2istemi. Başkaları da var: PS3için selectkomut bloğu ve PS4birlikte ayıklama için set -xkomuta. Bu durumda daha çok ilgileniyoruz PS2.

Kabuğun PS2istemi göstermesinin birçok yolu vardır (ve yeni bir satırda bir komutun doldurulması gerekli olabilir). Aynı istem here-docyeniden yönlendirme gerçekleştirdiğinizde kullanılır (bu örnekte sonlandırma dizesini gördüğünüzde bir komutun tamamlandığı kabul edilir EOF):

$ cat <<EOF
> line one
> line two
> EOF
line one
line two

Çok uzun bir komutun devamı \, aynı istemin görünmesine neden olacak ve hemen (!) Yeni satır eklenerek yapılabilir :

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

Yeni satırdan önce komut satırında dikey çizgiler, mantık işleçleri veya özel anahtar sözcükler göründüğünde, tüm son ifadeler girilene kadar komutun eksik olduğu kabul edilir:

$ echo Hello World | 
> wc -l
1

$ echo Hello World &&                                                                                                    
> echo "!"
Hello World
!

$ for i in $(seq 1 3); do
> echo "$i"
> done
1
2
3 

$ if [ -f /etc/passwd ]
> then
>     echo "YES"
> fi
YES

Sizin durumunuzda, tek bir alıntı tek tırnaklar arasındaki kelimenin tam anlamıyla yorumlanmasını gerektirir. Böylece, Zanna'nın işaret ettiği gibi, newline + ls+ newline'dan oluşan bir komuta giriyorsunuz . Bu tür yürütülebilir bir dosya adı bulunamaz (ve genellikle komut dosya adları yalnızca alfasayısal karakterlerin yanı sıra alt çizgi, tire ve noktalardan oluşmalıdır). İçlerinde özel karakterler içeren dosya adlarına sahip olmak mümkün olsa da, her zaman önlenir.

NOT : En örnekte görüldüğü gibi böyle bir davranışın Bourne benzeri dahil kabukları, özgüdür bash, dash(Ubuntu üzerinde o sembolik olarak edilir /bin/sh), kshve mksh. cshve türevleri bu şekilde davranmaz:

$ tcsh                                                    
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%  

Ancak, etkileşimli modda daha fazla giriş gerektiğinde cshhala istem2? olarak yükselir :

$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3  

Ayrıca bakınız:


Bağlantı What's the difference between <<, <<< and < < in bash?çevrimdışı / yanlış.
Tico

@Tico Teşekkürler düzeltildi. Cevap, saniyede milli kaplumbağaların internet hızında yazılmıştır, bu da sadece kısmen kopyalanmış bağlantıyla sonuçlanmıştır. Şimdi düzeltildi
Sergiy Kolodyazhnyy

3
Bu arada, zsh size gerçekten ne beklediğini söyleyecek kadar kibar, eğer komutunuzun geçerli olduğunu düşündüğünüzde ancak bir şeyden kaçmayı unuttuysanız, bazen yararlıdır.
Kevin

30

Kabuk sadece kapanış teklifini bekliyor. Girdiğinizde, genellikle yaptığı şeyi yapar ve girilen komutu yürütmeye çalışır.

Tırnak işaretleri kabuğun özel karakterleri yorumlamamasına neden olur, yani genişletmeler gerçekleştirilmez. Tek tırnak, özel karakterlerin tüm yorumunu tamamen bastırır. Normalde bir yeni satır komutları ayırır, ancak burada yeni satırları tırnak işareti ile komutun bir parçası olarak eklediniz.

Gibi bir komut <newline>ls<newline>olmadığı için bulunmaz.

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.