Bashが組み込み単語の代わりに予約語で時間を実装するのはなぜですか? [コピー]

Bashが組み込み単語の代わりに予約語で時間を実装するのはなぜですか? [コピー]

Bashリファレンスマニュアルによると

時間を予約語として使用すると、シェルの組み込み、シェル機能、パイプのタイミングを指定できます。外部時間コマンドでは簡単に測定できません。

  1. ただし、予約語timeと外部コマンドのみを比較し、time問題を解決しません。

    timeBashが組み込みコマンドの代わりに予約語で実装されるのはなぜですか?

    これはどのような利点をもたらしますか?

  2. (組み込みまたは外部)コマンドで実装できる他の予約語は何ですか?彼らは指揮者に比べてどんな利点がありますか? (彼らの強みが共通なのか、それともユニークなのかを把握しようとする)

    例えば、

    • 予約語[[...]]と組み込みコマンドtestまたは[
    • 予約語selectと組み込みコマンドread

答え1

引用したテキストは、timeこれがキーワードである理由をすでに説明しています。

時間を予約語として使用すると、シェルの組み込み、シェル機能、パイプのタイミングを指定できます。外部時間コマンドでは簡単に測定できません。

time組み込み関数だけでは、パイプラインで費やされる時間を正しく測定できません。たとえば、次のようになります。

$ time sleep 2 | sleep 4

real    0m4.002s
user    0m0.000s
sys     0m0.002s

ここで、時間はパイプライン全体にかかった時間である4秒を返します。組み込みコマンドで実装されている場合、シェル構文は、組み込みの有無にかかわらず、コマンドが特定の場合に引数のみを表示できるため、2秒しか返すことができませんsleep 2

組み込み関数で実装できない他のキーワードは、構造化構造に使用されるキーワードです。たとえば、for, while, until, case, do, done, select, if, then, else, function単純なtimeコマンド境界によって制限されず、解釈される行を処理できる必要があります。

同じ理由で、これらのキーワードが実装するコマンドと引数だけでなく、解析する完全なシェル入力にアクセスできます。たとえば、[コマンドパラメータはシェルの拡張と処理によって影響を受けるため、*テストでは確実に使用できず、>予期しない結果を持つリダイレクトとして扱われます。

一方、[[シェルの干渉なしに許容されるすべての構文を使用できるようにシェルの動作が変更されています。

以下は、動作の違いを示すいくつかの例です。

$ if [ * = "*" ]; then echo ok; fi
bash: [: too many arguments
$ if [[ * = "*" ]]; then echo ok; fi
ok

$ if [1> 2];それ以外の場合はechoが予想されます。
事故
$if[1 -> 2];それ以外の場合はechoが予想されます。
予想される
$ if [[ 1 > 2 ]];そうでなければecho期待。
予想される

if [ 1 > 2 ]予期しない結果が返されるだけでなく、2

答え2

Bashで予約語になる重要な理由timeはそれがksh

kshもちろん、time外部コマンドや組み込みコマンド以上の操作を許可し、パイプラインのタイミングを調整するのと同じです。

注:実際、これはtimekshの予約語です。これはPOSIX準拠のバグかもしれませんが、パーサーは次のksh単語がaで始まることを確認します-。この場合、外部コマンドのみを呼び出します/usr/bin/time。これを行うには、コンプライアンスを要求する必要があることPOSIXを考慮すると、法律全体はコンプライアンスを遵守します。time -p commandPOSIXkshPOSIX

注:[[シェル構文を作成するのはreserved wordinの一部です。これにより、パターンにシェルエスケープ(構造に似ている)を使用する必要がなくなり、演算子とI / Oリダイレクトとして認識する代わりに算術演算子として使用できます。ksh[[ ... ]]case><

関連情報