Po co uruchamiać polecenie powłoki odwrotnym ukośnikiem?

Odpowiedzi:

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

Jeśli masz alias curli nie chcesz go używać, umieszczenie odwrotnego ukośnika z przodu wyłącza alias i uruchamia bezpośrednio plik binarny curl.

Zauważ, że dotyczy to tylko interaktywnej powłoki. Aliasy nie działają w skryptach, więc nie byłoby to konieczne.

John Kugelman
źródło
4
Aliasów można używać w skryptach, używając shopt -s expand_aliasesprzed użyciem aliasu
Alex
@lbaby Same in Kornshell. Ci dealias ewentualnego alias polecenia przez umieszczenie backslash przed nim. Jest to bardzo powszechne w Kornshell, gdy ludzie definiują wiersze poleceń z nazwą katalogu w nich zawartym . Uwaga: pierwszym wierszem tej funkcji jest `\ cd" $ @ ".
David W.
1
Warto to zauważyć \curl nie omija żadnej funkcji powłoki o nazwie curl. W tym celu możesz użyć wbudowanego polecenia bash command:command curl ...
Keith Thompson
7
Łatwiejszym do zrozumienia sposobem pisania \curl ...jestcommand curl ...
glenn jackman
Zauważ, że dash(i ewentualnie inne powłoki, chociaż masz rację bashbez nich expand_aliases) , rozszerza aliasy w skryptach.
Adrian Günter,
163

Specyfikacja powłoki (Bourne / POSIX) mówi, że podstawianie aliasu w powłoce interaktywnej jest pomijane, gdy cytowany jest dowolny znak słowa polecenia. Ukośnik odwrotny to jeden ze sposobów, aby to zrobić, ale istnieją również inne dobrze znane sposoby cytowania: pojedyncze i podwójne cudzysłowy. Wszystkie poniższe elementy powstrzymają podstawianie aliasów:

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

Używanie \curlto tylko najbardziej powszechny i ​​czytelny sposób. Ponieważ jest to znormalizowana funkcja, można oczekiwać, że będzie działać we wszystkich powłokach dziedzictwa Bourne'a.

\curlwygląda trochę jak polecenie TeX, prawda? :-)

Jens
źródło
14
+1 za podanie konkretnego powodu, dla którego \curlpomija się aliasy o tej samej nazwie; zauważ, że w ten sposób omijane są tylko aliasy , a nie funkcje powłoki ; command curl ...zapewniłoby obejście albo .
mklement0
1
Nie widzę sensu ostatniego zdania. Nawiasem mówiąc, wspominasz tylko o pomijaniu aliasów , ale wszelkie cytowania będą również pomijać słowa kluczowe.
gniourf_gniourf
@ mklement0 Nie do końca upewnij się… command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"drukuje Not command, lol!x 3.
Adrian Günter
3
@ AdrianGünter: Tak, jeśli zastąpisz command się funkcją powłoki, pokonasz ten mechanizm. Jak pokazuje twój przykład, \ nie omijasz funkcji . Non-autodestrukcyjne przykład: date() { echo 'not date'; }; date; command date. Jeśli martwisz się złośliwym manipulowaniem przy użyciu command, zobacz stackoverflow.com/a/35931876/45375
mklement0
@ mklement0 Rozumiem to wszystko, ale mam na myśli to, że jeśli nie można zagwarantować, że żadna inna nazwa polecenia nie istnieje jako funkcja (tzn. brakuje kontroli nad środowiskiem wykonawczym), wówczas nie można polegać na commandnie zostać zastąpionym. Z własnego linku: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