パイプラインまたはそのコンポーネントに「時間」を適用するにはどうすればよいですか? [コピー]

パイプラインまたはそのコンポーネントに「時間」を適用するにはどうすればよいですか? [コピー]
time command1 | command2

またはtimeに適用されますか?あなたの答えが2つのうちの1つである場合、他のものはどのように指定しますか?command1command1 | command2

bashの構文やシェルがコマンドを解釈する方法で答えを説明できますか?

シェルがコマンドを解析するとき、timeそれを制御演算子として認識する前に予約語として認識しますか?予約語として認識されるものと制御演算子として認識される|順序によって、またはに適用されるかが決まりますか?time|timecommand1command1 | command2

ありがとうございます。

ベストアンサー1

time command1 | command2

またはtimeに適用されますか?command1command1 | command2

time通常、2つの方法で実装されます。外部コマンドと与えられたシェルの内部機能です。 (私は「関数」と呼びます。「関数」という理由は、シェルの実装方法によって異なりますが、予約語だと思うからです。したがって、timeシステムに外部デバイスが1つ以上あると仮定すると、実際の答えは、ユーザーが実行しているシェルと(該当する場合)そのシェルtimeでどのように実装されるかによって異なります。

タグによると、Bashを内部シェルとして使用しており、単純化のためにtimeGNUを外部シェルとして想定しています。time

大きな打撃time:

  • 予約語です。
  • 完全なパイプラインに適用されます。
  • 内部命令/関数/予約語と共に使用できます。

グヌtime

  • 外部コマンドです。
  • 簡単なコマンドで動作します。
  • シェル内で呼び出されない限り、内部コマンド/関数/予約語と一緒に使用することはできません。

特定のシナリオでBashを実行するときにtime適用します。command1 | command2。使用しているシェルに内部がないがtimeシステムに外部がある場合。timecommand1


尋ねる:あなたの答えが2つのうちの1つである場合、他のものはどのように指定しますか?

Bashtimeの内部で動作する:command1

  • { … }制限に使用される範囲time

    { time command1; } | command2
    
  • 外部timeコマンドを実行します。

    # Using the `command` builtin
    command time command1 | command2
    
    # Using `env`
    env time command1 | command2
    
    # Escaping/quoting the `time` word
    \time command1 | command2
    'time' command1 | command2
    
    # Explicitly running the external `time` command
    /usr/bin/time command1 | command2
    

GNUの場合:timecommand1 | command2time

  • パイプを外部ファイルに配置して実行します。

    time ./script.sh
    
  • シェルを呼び出し、その中でパイプラインを実行します。

    time sh -c 'command1 | command2'
    

尋ねる:bashの構文やシェルがコマンドを解釈する方法で答えを説明できますか?

Bashはそれを記録しますtime3.2.2 パイプラインマニュアル章:

パイプの形式は次のとおりです。

[time [-p]] [!] command1 [ | or |& command2 ] …

予約語は、timeパイプラインが完了した後にタイミング統計を印刷します。

GNU文書は次のようにtime提供されます。info timeman time

コマンドの形式は次timeのとおりです。

time [option...] COMMAND [ARG...]

timeCOMMAND与えられた引数を使ってプログラムを実行しますARG...COMMAND完了すると、time使用されたリソースに関する情報が表示されますCOMMAND

POSIX ドキュメント基準timeこれは多くの実装の基礎となりますtime

要約

time [-p] utility [argument...]

説明する

ユーティリティーは、オペランドとして指定された引数を使用してオペランドtimeと呼ばれるユーティリティーを呼び出し、ユーティリティーのタイミング統計をリストする標準エラーにメッセージを書き込む必要があります。utilityargument

timeパイプラインの一部として使用される場合、報告された時間はグループ化されたコマンドの唯一のコマンドでない限り指定されません(参照:グループ化コマンド)このパイプラインから。

基本的な

KornShellは、time単純なコマンドではなく、パイプライン全体の時間を測定するために使用できるシェル予約語です。 POSIX 定義の表現はこれらの実装を可能にします。

utility代わりに、この用語は、commandシェル複合コマンド、パイプ、特殊な組み込みコマンドなどを直接使用できないことを強調するために使用されます。ただし、utilityこれには標準ユーティリティだけでなく、ユーザーアプリケーションとシェルスクリプトも含まれます。


尋ねる:シェルがコマンドを解析するとき、timeそれを制御演算子として認識する前に予約語として認識しますか?|

Bashのマニュアルではこの情報を明示的に言及していませんが、POSIXは明確に次のように述べています。認識順序:

2.10.1 シェル構文と語彙規則

シェルの入力言語は、まず文字レベルで認識する必要があります。生成されたタグは、次の規則(順番に適用)に従って即時コンテキストで分類する必要があります。これらのルールは、トークンレベルで解析する「トークン」を決定するために使用する必要があります。トークン認識ルールトークン認識適用可能です。

  1. トークンがオペレータである場合は、そのオペレータのトークン識別子を生成する必要があります。
  2. 文字列が数字のみで構成され、区切り文字がまたはいずれ<かの場合は>トークン識別子です。IO_NUMBER返す必要があります。
  3. それ以外の場合はトークン識別子トークン結果。

もっと区別するトークン状況によって異なります。同じかもしれませんトークン生産する言葉、ㅏ名前、一つASSIGNMENT_WORD、または状況に応じて、次の予約語のいずれかを使用します。

簡単に言うと:演算子は予約語の前に認識されます。


尋ねる:time予約語として認識されるものと制御演算子として認識される|順序によって、またはtimeに適用されるかが決まりますか?command1command1 | command2

予約語で予約されていても、パイプラインtime全体ではなく単純なコマンドに適用するようにプログラムできます(ただし、これを実行するシェルはわかりません)。重要なのは、time認識される順序ではなく、どのように実装されるかである。

おすすめ記事