Neden echo -e “\\\ SOME_TEXT” `sadece bir ters eğik çizgi gösteriyor?


18

Bazıları Linux kabuğunda kaçan karakterde sahne arkasında neler olduğunu açıklayabilir mi? Aşağıdakini denedim ve çokça devam ettim, neler olup bittiğini anlamada başarılı olamadım:

root@sv01:~# echo -e "\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\\ Hello!"
\\\ Hello!
root@sv01:~# echo -e "\n Hello!"

 Hello!
root@sv01:~# echo -e "\\n Hello!"

 Hello!
root@sv01:~# echo -e "\\\n Hello!"
\n Hello!

Orada tamamen kayboldum, örneğin, neden üç ters eğik çizgi sadece bir eğik çizgi veriyor? Beklerdim: ilk ikisi bire kaçacak, üçüncüsü kaçacak hiçbir şey bulamayacak, böylece bir eğik çizgi kalacaktır (ilk deneyde çizgi), ama olan şey, üçüncü olanın sadece ortadan kaybolması.
Neden dörtte bir ters eğik çizgi alıyorum \\\\ Hello? Her çiftin bir ters eğik çizgi -> iki ters eğik çizgi vermesini beklerdim.

Ve neden kaçmak için son durumda üç ters eğik çizgiye ihtiyacım var? kaçmak için arka planda ne oluyor? ve durumdan nasıl farklı \\n?

Önceki satırlarda neler olup bittiğini açıkladığınız için teşekkür ederim.


echo -edavranış hiçbir şekilde standartlarla tanımlanmamıştır - bkz. pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html . Girdilerin herhangi bir yerinde değişmez bir ters eğik çizgi varsa çıktı tamamen uygulama tarafından tanımlanır ve izin verilen tek seçenek -n(standartlara uygun bir uygulamanın çıktılarında echo -eyazdırılacağı anlamına gelir -e).
Charles Duffy

... Eğer kabuk bash olduğundan% 100 emin olsanız bile o zaman bile echo -e güvenli değil: echoHer iki takdirde standardına uygun olarak davranır posixve xpg_echoçalışma zamanı seçenekleri etkindir veya eşdeğer inşa zamanlı seçenekleri ile derlenmiş eğer. Bunun printfyerine güvenli uygulama kullanmaktır - bunun yerine nasıl değiştirileceğini açıklayan yukarıdaki bağlantının UYGULAMA KULLANIMI ve RATIONALE bölümlerine printfbakın echo.
Charles Duffy

Yanıtlar:


28

Bu, çünkü bashve echo -ekombine. itibarenman 1 bash

Alınmamış ters eğik çizgi ( \), kaçış karakteridir. Bunun dışında sonraki karakterin değişmez değerini korur <newline>. [...]

Çift tırnak karakterleri çevreleyen hariç tırnak içindeki tüm karakterlerin değişmez değerini korur $, ` \, [...] Ters eğik çizgi şu karakterlerden biri tarafından takip sadece özel anlam korur: $`, ", \, veya <newline>.

Mesele şudur: çift tırnaklı ters eğik çizgi her zaman özel değildir.

echoGenel olarak çeşitli uygulamaları vardır , bu bir yerleşiktir bash; Burada önemli olan bu davranış:

Eğer -egeçerli olan aşağıdaki dizileri tanınır:
\\
ters eğik çizgi
[...]
\n
Yeni hat

Şimdi çözebiliriz:

  1. echo -e "\ Hello!"- özel bir şey, özel bir bashşey değil echo; \kalır.
  2. echo -e "\\ Hello!"- Birincisi , ikincisine kelimenin tam anlamıyla muamele etmeyi \söylüyor ; alır ve yukarıdaki gibi davranır.bash\echo\ Hello!
  3. echo -e "\\\ Hello!"- Birincisi , ikincisine kelimenin tam anlamıyla muamele etmeyi \söylüyor ; alır ve (çünkü ) o tanır olarak .bash\echo\\ Hello!-e\\\
  4. echo -e "\\\\ Hello!"- Birincisi , ikincisine kelimenin tam anlamıyla muamele etmeyi \söylüyor ; üçüncü, dördüncü için aynı şeyi söylüyor; alır ve (çünkü ) o tanır olarak .bash\echo\\ Hello!-e\\\
  5. echo -e "\\\\\ Hello!"- Birincisi , ikincisine kelimenin tam anlamıyla muamele etmeyi \söylüyor ; üçüncü, dördüncü için aynı şeyi söylüyor; sonuncusu özel değildir; alır ve (nedeniyle ) ilkini , son bozulmadan kalır olarak tanır .bash\echo\\\ Hello!-e\\\\

Ve bunun gibi. Gördüğünüz gibi, art arda dört ters eğik çizgi sonuç verir. Bu yüzden üçe sahip olmak için en az dokuz tanesine ihtiyacınız var. 9 = 4 + 4 + 1.

Şimdi \n:

  1. echo -e "\n Hello!"- Özel bir şey yok bash, echo aynı dizgeyi alır ve (yüzünden -e) \nyeni bir satır olarak yorumlanır .
  2. echo -e "\\n Hello!"- bashyorumlar \\olarak \; echoalır \n Hello!ve sonuç yukarıdaki ile aynıdır.
  3. echo -e "\\\n Hello!"- bashilk harfini yorumlar \\olarak \; echoalır \\n Hello!ve (nedeniyle -e) basılması gereken \\bir hazır bilgi olarak yorumlanır \.

Sonuçlar (farklı davranış nedeniyle) 'yerine veya farklı (farklı davranışlarla) olacaktır."bash-eecho


1
Çok teşekkür ederim! Yani iki kaçış basamağı var, bash tarafından atılan adım, ikincisi -ebash tarafından yargılanan metni yargılıyor, doğru mu? bu doğruysa, bu karışıklığı giderir. Nasıl seddavranacağından bahseder misiniz ? kaçış tekniğinde kendine özgü bir yapısı var mı? yani yankı gibi davranıyor -emu demek istedim ?
Mohammed Noureldin

2
@MohammedNoureldin Evet, iki adım var. Asıl sorunuz olduğu gibi sorun değil, karmaşıklığı artıralım sed. Yine de başka bir soru sorabilirsiniz ( sedsadece hakkında ), önce kendi araştırmanızı yapın.
Kamil Maciorowski

3
@MohammedNoureldin sedaynı temel ilkeleri izleyecektir: bash komut satırını kurallarına göre yorumlayacak, alıntıları ve kaçışları (ve belki de kaldırarak) ayrıştıracaktır. Bunun sonucu , kaçış kurallarına sedgöre yorumlayan geçilir . BTW, bunu tek bir alıntı dizge kullanarak basitleştirebilirsiniz , çünkü kaçış yorumlaması yapılmaz (bash ile) - bash tekli tırnak işaretlerini kaldırır ve içindekileri doğrudan komuta aktarır. bash
Gordon Davisson

Hala küçük bir problemim var echo -e "\\\n Hello!". Burada bash kaçmayı başaracak ve olacak \\n, sonra -eortaya çıkan iki ters eğik çizgiden kaçacak \\nve sonra olacaklar \n. şimdi kim \nyeni bir çizgi haline getirmek için yorum yapıyor? Normalde echo -e "\n Hello!"bash hiçbir şey yapmaz ve yeni satır olarak -eyorumlar \n. ancak ilk belirtilen durumda yorumlama işlemine başlamadan önce yorumlama işlemi yapılmıştır \n. Lütfen bunu açıklar mısınız?
Mohammed Noureldin 13:17

1
Tamam benim hatam, geceleri 2 gündür bunu okudum, bu yüzden görünüşe göre davaları karıştırmaya başladım, sanırım seddün gece kafamı karıştıran başka bir şey aldım (belki dün yanlış bir şey yaptım), ama şimdi Yine aynı ile denedim echo -eve sed, istisna aynı şeyi aldım, teşekkürler!
Mohammed Noureldin 13:17
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.