`\time`、`t\ime`、`\cd`は実際に何をしますか? (シェルでバックスラッシュの利点)

`\time`、`t\ime`、`\cd`は実際に何をしますか? (シェルでバックスラッシュの利点)

/usr/bin/time組み込みシェル(bashとzsh)の違いを議論しながら、time誰かが\timegetを省略形で使用できると述べました/usr/bin/time

当初、これは簡単で良い近道のように見えましたが、いくつかの問題が発生しました。

  • なぜt\ime動作しますか?
  • \cdディレクトリを変更しないのに、なぜディレクトリを変更するのですか/usr/bin/cd

明らかに\foo同じではありません$(which foo)。今質問は次のとおりです。

bashとzshで観察される動作は\fooシェルのPOSIX定義に含まれていますか?それでは、なぜこのように動作しますか?


脚注1:/usr/bin/cd私のシステムでは

#!/bin/sh
builtin cd "$@"

答え1

t\imeまたは\cd(または、または、または"tim"e最終的にまたは解決されると考えることができる他のすべての引用と拡張の組み合わせ)は、合計を作成する別の方法です。'cd'${-##*}time${-+time}timecdcdtime

cdしかし、これは最終的にシェルの解析と解釈の間またはtimeそれ以降に解決されます。特に、これはシェルキーワードが認識されてから長い間発生します。ニックネーム交換が発生します。

したがって、シェルがその言語のキーワードを見つけると、シェルキーワードti\meとして認識されません。timeだから:

ti\me echo test

timeシェルは、キーワードの後に​​単純なコマンドが続くのではなく、単純なコマンドとして認識されます。

その後、引用が処理されますti\me(ここでバックスラッシュはmとにかく引用する必要がない文字を引用し、引用文字は削除されて取得されますtime)。time 注文する他のコマンドのように検索されます(の組み込みコマンド、関数、および実行可能ファイルのリストから。$PATHおそらく/bin/timeここにあります)。

シェル言語にはキーワードがなく、cd組み込みコマンド(あなたのコマンドよりも優先されます)のみがあります。ただし、(たとえば)のエイリアスを定義する場合も同様です。エイリアスの置換は非常に早く行われます。引用符が削除される前にエイリアスなしでエイリアスがある場合(バックスラッシュを含むエイリアスを許可するシェルはあまりありません)、次のように作成します。cdcd/usr/bin/cdcdalias cd=pushdcd\cd

\cd dir

cdエイリアスが置き換えられていないことを確認しようとしています。

簡単に言えば、コマンド名またはその一部を引用すると、そのコマンドがシェルキーワードとして処理されるのを防ぎます(while、、、、...などのキーワードはforif{time一部シェルのみ) 使用可能なエイリアスを無視します。

$PATHただし、コマンドが実行可能ファイルとして検証されることを強制するわけではありません。機能(こうすれば解決できますcommand time cmd...組み込み(組み込みコマンドを持つシェルenv time cmd...はわかりませんが、これを行うことでこの問題を解決できます。)time

引用は、一部のシェルでは/// typeset...一連の特殊な組み込み関数の動作にも影響します。バラよりdeclareexportlocalローカル変数の割り当てには引用符が必要ですか?もっと学ぶ。

関連情報