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


9

/usr/bin/timeと組み込みシェル(bashとzsh)の違いについて議論している間time、誰かが\timeを取得するための省略形として使用できると述べました/usr/bin/time

最初は無害なショートカットのように見えましたが、次にいくつかの質問が浮上しました。

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

したがって、明らかに、\fooと同等ではありません$(which foo)。質問は今です:

\foobashとzshの両方で観察された動作は、シェルのPOSIX定義によって何らかの方法でカバーされていますか?そうである場合、それが動作するのはなぜですか?


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

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

unix.stackexchange.com/questions/12762/…も参照してください。\ commandは、コマンドのエイリアスを無視するように指示するtcsh機能が具体的に文書化されていることに注意してください。
simpleuser

回答:


14

t\imeor \cd(またはor "tim"eまたは'cd'or ${-##*}timeまたは${-+time}およびその他の引用と展開のすべての組み合わせで、最終的にtimeor に解決されると考えられますcd)、つまり、cdおよびを記述する別の方法timeです。

ただし、最終的には、シェル構文の解析と解釈に解決されるcdtime、後で解決されます。特に、シェルのキーワード認識とエイリアスの置換が行われた後、それはかなりの時間発生します。

したがって、シェルがその言語でキーワードを探しているときti\metimeシェルのキーワードとして認識されません。だから:

ti\me echo test

単純なコマンドがtime後に続くキーワードとは対照的に、シェルは単純なコマンドとして認識します。

次に、引用符ti\meが処理され(ここで、バックスラッシュが引用符をm必要としない文字を引用しているため、引用符文字が削除され、取得されますtime)、time コマンドが他のコマンドと同様に検索されます(組み込みのリスト内) 、関数、および実行可能ファイル$PATH。ほとんどの場合、/bin/timeここにあります)

の場合cdcdシェル言語にはキーワードがありません。cd組み込みコマンド(これはに優先します/usr/bin/cd)のみです。ただし、cd(のようなalias cd=pushd)のエイリアスを定義した場合も同じです。エイリアスの置換は非常に早い段階で行われるため、引用を削除する前に、のエイリアスがある場合cdとない場合\cd(バックスラッシュを含むエイリアスを許可するシェルは多くないことに注意してください)、次のように記述します。

\cd dir

cdエイリアスが置換されていないことを確認しています。

簡単に言うと、コマンド名またはその一部を引用すると、それがシェルのキーワード(キーワードは、、、...のようなものwhileforありif一部のシェルのみのキーワード{ですtime)として表示されなくなり、エイリアスをバイパスします。 。

しかし内の実行可能ファイルに解決するには、そのコマンドを強制していない$PATHコマンドは、まだ間最初に検索され、機能(あなたが行うことによって回避することができますcommand time cmd...)と組み込みコマンドあなたが行うことによって回避することができます(env time cmd...私は知りませんが、組み込みtimeコマンドを持つシェル)。

一部のシェルでは、引用符がtypeset/ declare/ export/ local...ファミリーの特別な組み込みの動作に影響を与える可能性があることに注意してください。ローカル変数の割り当てには引用符が必要ですか?を参照してください詳細については。


だから、違いtimecd観測された挙動の違いにリードはつまり、timeあるキーワードcdある組み込みコマンド
JonasSchäfer2016年

1
@JonasWielicki、それtimeはキーワードであり、そうでcdはありません。(cdまたはtime、またはのエイリアスがある場合、それは別の問題になります)。これcdは組み込みであるか、現時点では発生していません(引用の影響に関する限り)。ただし、一部のシェルには、構文解析が他のビルトインとは異なるため、キーワードとビルトインの中間にあるビルトインがいくつかあります。それはの場合ですexport/ typeset/ declare。私はおそらくこの答えにそれについていくつかのメモを追加する必要があります。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.