なぜバックスラッシュでシェルコマンドを開始するのですか?


回答:


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

のエイリアスがcurlあり、それを使用したくない場合は、バックスラッシュを前に置くとエイリアスが無効になり、curlバイナリが直接実行されます。

これは対話型シェルでのみ適用されることに注意してください。エイリアスはスクリプトでは有効にならないため、そこでは不要です。


4
エイリアスshopt -s expand_aliasesは、エイリアスの使用前に使用することでスクリプトで使用できます
Alex

@lbaby Kornshellでも同じです。あなたはdealiasの前にバックスラッシュを置くことで可能コマンドエイリアスを。Kornshellでは、ユーザーがディレクトリの名前を使用してコマンドプロンプトを定義する場合、これは非常に一般的です。この関数の最初の行は `\ cd" $ @ "`であることに注意してください。
デビッドW.

1
という名前の\curlシェル関数をバイパスしないことは注目に値しcurlます。そのためには、組み込みコマンドのbashを使用することができますcommandcommand curl ...
キース・トンプソン

7
書き込みが容易に理解できる方法が\curl ...あるcommand curl ...
グレン・ジャックマン

その注意dash(あなたがのために正しいですが、おそらく他のシェルをbashせずにexpand_aliasesないスクリプトでエイリアスを展開します。
エイドリアン・ギュンター

163

(Bourne / POSIX)シェル仕様では、コマンドワードの任意の文字が引用符で囲まれている場合、インタラクティブシェルでのエイリアス置換が抑制されると記載されています。バックスラッシュはそのための1つの方法ですが、引用符には他のよく知られた方法もあります。単一引用符と二重引用符です。次のすべてがエイリアスの置換を抑制します。

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

使用\curlは、最も一般的で読みやすい方法です。これは標準化された機能であるため、すべてのBourne遺産シェルで機能することが期待できます。

\curlTeXコマンドのように見えますか?:-)


14
+1 \curlは、同じ名前のエイリアスをバイパスする具体的な理由を示します。この方法では、シェル関数ではなくエイリアスのみがバイパスされることに注意してください。どちらかを確実にバイパスしますcommand curl ...
mklement0 14

1
最後の文の要点はわかりません。ちなみに、バイパスするエイリアスについてのみ言及していますが、あらゆる種類の引用はキーワード
gniourf_gniourf 2016

@ mklement0かなり...保証するものではありませcommand() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"プリントNot command, lol!のx 3
エイドリアン・ギュンター

3
@AdrianGünter:はい、command それ自体をシェル関数に置き換えると、メカニズムが無効になります。あなたの例が示しているの\ は、前述のように関数をバイパスしないことです。非自滅的な例:date() { echo 'not date'; }; date; command date。あなたが悪意のあるが心配している場合は改ざんcommand、参照stackoverflow.com/a/35931876/45375
mklement0

@ mklement0私はそれをすべて理解していますが、私のポイントは、他のコマンド名が関数として存在しないことを保証できない場合(つまり、実行環境を制御できない場合)は信頼できないということです。command上書きされません。あなた自身のリンクから: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)
エイドリアン・ギュンター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.