![Bashが組み込み単語の代わりに予約語で時間を実装するのはなぜですか? [コピー]](https://linux33.com/image/85824/Bash%E3%81%8C%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E5%8D%98%E8%AA%9E%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E4%BA%88%E7%B4%84%E8%AA%9E%E3%81%A7%E6%99%82%E9%96%93%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
Bashリファレンスマニュアルによると
時間を予約語として使用すると、シェルの組み込み、シェル機能、パイプのタイミングを指定できます。外部時間コマンドでは簡単に測定できません。
ただし、予約語
time
と外部コマンドのみを比較し、time
問題を解決しません。time
Bashが組み込みコマンドの代わりに予約語で実装されるのはなぜですか?これはどのような利点をもたらしますか?
(組み込みまたは外部)コマンドで実装できる他の予約語は何ですか?彼らは指揮者に比べてどんな利点がありますか? (彼らの強みが共通なのか、それともユニークなのかを把握しようとする)
例えば、
- 予約語
[[...]]
と組み込みコマンド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
外部コマンドや組み込みコマンド以上の操作を許可し、パイプラインのタイミングを調整するのと同じです。
注:実際、これはtime
kshの予約語です。これはPOSIX準拠のバグかもしれませんが、パーサーは次のksh
単語がaで始まることを確認します-
。この場合、外部コマンドのみを呼び出します/usr/bin/time
。これを行うには、コンプライアンスを要求する必要があることPOSIX
を考慮すると、法律全体はコンプライアンスを遵守します。time -p command
POSIX
ksh
POSIX
注:[[
シェル構文を作成するのはreserved word
inの一部です。これにより、パターンにシェルエスケープ(構造に似ている)を使用する必要がなくなり、演算子とI / Oリダイレクトとして認識する代わりに算術演算子として使用できます。ksh
[[ ... ]]
case
>
<