Echo “bar” -n neden echo -n “bar” dan farklıdır?


10

Karşılaştırmak

echo -n "bar"

ile

echo "bar" -n

Eski yapar ben ikincisi değil iken, (bir satır olmadan baskılar "bar") yapmak gerekiyordu düşünüyorum. Bu bir hata mı yoksa tasarım mı? Seçenekleri hareket ettirememeniz neden birçok cli programından farklı? Örneğin tail -f /var/log/messages, tam olarak aynıdır tail /var/log/messages -f. Bazen ikincisini istediğimi unuttuğumda yaparım, çünkü dahili olarak seçenekler ve argümanlar genellikle getopt tarafından yeniden düzenlenir .

Güncelleme: evet aslında sorumu nerf-ed. Bazı cevapların mantıklı olması için tarihi incelemeniz gereken nerfleri çıkardım.


3
Gördüğüm kadarıyla, fark olduğu hemen belli. echo -n "bar""bar" verirken echo "bar" -n, "bar -n" verir
phunehehe

Yanıtlar:


18

Diğerlerinin de gözlemlediği gibi, "-n" herhangi bir yere yerleştirildiyse, echokomuttan hemen sonra yorumlanır .

Tarihsel olarak, UNIX yardımcı programlarının hepsi böyle idi - sadece komut adından hemen sonra seçenekleri aradılar. POSIX eski yolu doğru olarak belirttiği için (daha fazla bilgi için bkz. Kılavuz 9 ve ayrıca man 3 getoptbir Linux sisteminde) daha esnek stile öncülük eden BSD veya GNU idi (yanlış olabilirim de ). Her neyse, bu günlerde çoğu Linux yardımcı programı yeni stili kullanıyor olsa da, bunun gibi bazı kısıtlamalar var echo.

EchoPOSIX'in ortaya çıktığı anda oyunda temelde birbiriyle çelişen en az iki versiyonun mevcut olması, standartlar açısından karışıklıktır . Bir yandan, ters eğik çizgiden kaçan karakterleri yorumlayan ancak argümanlarını tam anlamıyla ele alan ve hiçbir seçeneği kabul etmeyen SYSV stiliniz var. Öte yandan, bir baş harfini -nözel bir durum olarak ele alan ve kesinlikle her şeyi tam anlamıyla çıkaran BSD stiliniz var . Ve echoçok uygun olduğu için, bir davranışa veya diğerine bağlı olan binlerce kabuk komut dosyanız var:

echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --

"Her şeyi tam anlamıyla ele alın" anlamsallığı nedeniyle, echoşeyleri kırmadan yeni bir seçenek eklemek bile imkansızdır . GNU üzerinde esnek seçenekler şeması kullansaydı, cehennem gevşeyecekti.

Bu arada, Bourne kabuğu uygulamaları arasında en iyi uyumluluk için printfdeğilecho , kullanın .

echoÖzellikle esnek seçenekleri neden kullanmadığını açıklamak için GÜNCELLENDİ .


beklenen getopt davranışı olduğunu söyleyen tek kişi olduğunuz için oy verin.
Geoffrey Bachelet

@jander echo neden "bekletme" olur? Bence bu bir gnu coreutil mi?
xenoterracide

@xeno: Cevabımı güncelledim. Temel olarak, GNU bir şeyleri kırmak istemedi.
Jander

1
Olmayan ilk seçenek sonra seçenekleri Kabul özgüdür GNU kullanarak kamu ve program GNU libc 'nin getopt tesisler. Kullanıcı, ortam değişkenini ayarlayarak her zaman geriye doğru uyumlu davranışlar elde edebilir POSIXLY_CORRECT.
Gilles 'SO- kötü olmayı bırak'

1
Belirli bir durum için echo, seçenekleri tanıyan -eveya -Eseçenek olarak kullanan uygulamalar da vardır . Taşınabilirlik için, ile başlamayın -veya benzeri bir şey kullanmayın printf %s -e.
Gilles 'SO- kötü olmayı bırak'

9

Diğer cevaplar, -n'nin yankı dizesinin bir parçası haline geldiğini görmek için man sayfasına bakabileceğiniz noktaya gelir. Bununla birlikte, md5sum olmadan bunu araştırmanın kolay olduğunu ve neler olduğunu biraz daha az şifreli hale getirdiğini belirtmek istiyorum.

[11:07:44][dasonk@Chloe:~]: echo -n "bar"
bar[11:07:48][dasonk@Chloe:~]: echo "bar" -n
bar -n

3
Tam olarak + 1'leyin. Bir boru hattı beklediğiniz şeyi yapmıyorsa, her bir parçayı ayrı ayrı test edin.
Mikel

6

Vay canına, herkesin açıklamaları uzundur.

Bu kadar basit:

-n dizeden önce görünüyorsa bir seçenektir, aksi takdirde yankılanacak başka bir dizedir.

Çıkarın | md5sum ve çıktının farklı olduğunu göreceksiniz.


5

Basit denetimden, bu tasarımın bir hatası değil ...

echo "bar" -n | md5sum

a3f8efa5dd10e90aee0963052e3650a1

Bu komutu kendiniz deneyin:

echo "bar -n" | md5sum

Ortaya çıkan md5'in

a3f8efa5dd10e90aee0963052e3650a1

Ekoda -n kullanımını karıştırdınız.

İlk örnek kodunuzda

echo -n "bar" | md5sum

-n, bu yankıdan sonra yeni satır koyma derim.

İkinci örneğiniz

echo "bar" -n | md5sum

-n işlevini tam metin olarak ele alıyor.

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.