Neden ters eğik çizgi ile bir kabuk komutu başlattınız?


Yanıtlar:


200
alias curl='curl --some --default --options'

İçin bir takma adınız varsa curlve kullanmak istemiyorsanız, önüne ters eğik çizgi koymak takma adı devre dışı bırakır ve doğrudan curl ikili dosyasını çalıştırır.

Bunun yalnızca etkileşimli bir kabuk için geçerli olduğunu unutmayın. Takma adlar komut dosyalarında etkili olmaz, bu nedenle orada gereksiz olur.


4
Takma adlar shopt -s expand_aliases, takma adı kullanmadan önce komut dosyalarında kullanılabilir
Alex

@lbaby Kornshell ile aynı. Sen dealias önünde ters eğik çizgi koyarak olası bir komut takma. Bu, Kornshell'de insanlar komut istemlerini içindeki dizinin adıyla tanımladığında çok yaygındır . Bu işlevin ilk satırının `\ cd" $ @ "` olduğuna dikkat edin.
David

1
Belirterek It değerinde \curlherhangi kabuk baypas değil işlevi adında curl. Bunun için, bash yerleşik komutunu kullanabilirsiniz command:command curl ...
Keith Thompson

7
Yazma A daha kolay anlaşılır bir yol \curl ...olduğunucommand curl ...
glenn Jackman

Unutmayın dash(ve muhtemelen diğer kabuklar, doğru basholmasa da expand_aliases) , komut dosyalarındaki takma adları genişletir.
Adrian Günter

163

(Bourne / POSIX) kabuk şartname söylüyor takma ad ikamesi komut kelimenin herhangi bir karakteri alıntı edildiğinde Bir etkileşimli kabukta bastırılır. Ters eğik çizgi bunu yapmanın bir yoludur, ancak alıntı yapmak için iyi bilinen başka yollar da vardır: tek ve çift tırnak. Aşağıdakilerin tümü takma ad değiştirmeyi bastırır:

 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"

Kullanımı \curlsadece en yaygın ve okunabilir yoldur. Bu standart bir özellik olduğundan, tüm Bourne-miras mermilerinde çalışmasını bekleyebilirsiniz.

\curlTeX komutuna benziyor değil mi? :-)


14
+1 \curl, aynı addaki bir takma adı neden atladığına dair belirli bir neden belirttiği için; kabuk işlevlerini değil , yalnızca diğer adların bu şekilde atlandığını unutmayın ; ya da atlamayı sağlayacaktır . command curl ...
mklement0

1
Son cümlenin amacını görmüyorum. Bu arada, yalnızca diğer adları atlayarak bahsedersiniz , ancak her türlü alıntı da anahtar kelimeleri
gniourf_gniourf

@ mklement0 Pek emin değilim… x 3 command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"basarNot command, lol!
Adrian Günter

3
@ AdrianGünter: Evet, command kendisini bir kabuk işleviyle değiştirirseniz , mekanizmayı yenersiniz . Ne örnek gösterir ki \ baypas değil fonksiyonları belirtildiği gibi. Olmayan bir Özyıkım örnek: date() { echo 'not date'; }; date; command date. Eğer kötü niyetli endişe ediyorsanız kurcalama ile command, bakınız stackoverflow.com/a/35931876/45375
mklement0

@ mklement0 Bunların hepsini anlıyorum, ama benim açımdan, eğer herhangi bir komut adının bir işlev olarak var olmadığını garanti edemezse (yani, yürütme ortamınız üzerinde kontrolünüz yoksa), o zaman da commandgeçersiz kılmamak. Kendi bağlantınızdan:Thus, with no control over the execution environment, you cannot write shell scripts that are fully immune to tampering, unless you know that your code will be executed by dash, ksh, or bash (with the workaround in place)
Adrian Günter
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.