このコマンドの機能は何ですか(異常な割り当てとリダイレクト)

このコマンドの機能は何ですか(異常な割り当てとリダイレクト)

次のコマンドが実行する操作の詳細を知りたいです。

PASSING=0 FAILED=0 > log_${ENV} print "Test Started at `date`\n"

答え1

このコマンドは、次のように書き換えることができます。

PASSING=0 FAILED=0 print "Test Started at `date`\n" >log_${ENV}

リダイレクトは、コマンドラインの任意の時点で発生する可能性があるためです。

リダイレクトはコマンドの出力をprint名前付きファイルに送信しますlog_${ENV}(またはlog_$ENV中括弧はここでは何もしません)。ここでは、ENV現在の環境に存在するいくつかの値を含むシェル変数でなければなりません。

PASSINGに2回割り当てると、FAILEDコマンド環境で両方の変数が設定されますprint。この行を実行した後は存在しません(以前にスクリプトに存在しない限り、この場合、このコマンドラインを実行しても元の値は変更されません)。

これら2つの変数を使用しないようであるためprint(スクリプトや関数、または私たちが知らないもの以外)、この変数の意図が何であるかを言うのは難しいです。

このprint機能はテキスト文字列を唯一の引数として使用します。ここで、文字列の一部は古いスタイルのコマンド置換であり、これは呼び出されるdate前にコマンドの出力に展開されますprint。より近代的なコマンドの代替構文を使用すると、パラメータを"Test Started at $(date)\n"

全体的な効果はおそらく(何によって異なりますprint)名前がvalueに依存する特定のファイルに指定されたテキスト文字列を書き込みます$ENV

関連:


ksh93(およびzsh)には、print同じことを行うためのシェル組み込みユーティリティがありますecho。シェルは、対話型シェルの起動時に$ENVファイルを指す特別な方法で処理されます。$ENVシェルスクリプトで汎用変数としてこの変数(または通常は大文字変数)を使用することはお勧めできません。

これに関連する:

答え2

コマンドラインを単語として「分析」(解釈)する必要があります。

PASSING=0 FAILED=0 >log_${ENV} print "Test Started at `date`\n"
\___  __/ \__  __/ \___  ____/ \_ _/  \_________  ____________/
    \/       \/        \/        \/             \/
   var1     var2    redirect    cmd    "Argument to command".

コマンドラインを構成する5つの単語(スペースで区切ります)。

  • コマンドの前の var (例えば in) は、var=123 cmdコマンドの実行中に環境でのみ定義されます。それから廃棄されます。

    複数の変数を定義できます。今後コマンド名。

  • リダイレクトは、出力をファイルに送信したり、ファイルから入力を読み取るために使用されます。リダイレクトはコマンドラインのどこにでも表示でき、コマンドライン全体(コマンドの実行)に適用されます。

    この場合、リダイレクトは、log_変数(部分)内で単語と値を連結したものをファイルに出力することです。ENV$(ENV)

  • print明らかに、この場合はコマンド名です。

    このコマンド名は、ksh、mksh、lksh、およびzshの組み込みコマンドとして存在しますが、ash、dash、csh、yash、bash(およびその他)には存在しません。これらのシェルでは、コマンドはPATH内の外部プログラムとして存在できます。

  • argv[]引数は、コマンドに提供される引数、テキスト、またはその他の情報のリストで、cプログラムまたはint argcシェルで$@使用できます$#

    この場合、引数には`date`(最新の構文では強くお勧めします)と同じコマンド拡張が含まれます$(date)。このセクションでは、コマンド(この場合)を実行し、dateセクション全体をコマンド出力に置き換えます。つまり、その場所に実際の日付を入力します。

完全なコマンドを書くこともできます(まったく同じ効果を得るために)。

PASSING=0 FAILED=0   print "Test Started at `date`\n"     >log_${ENV}

情報が不足してログファイルに文字列が出力されるようです。実際に上記の組み込み印刷の場合、これら2つの変数は何もしません。削除して次のようにコマンドを作成できます。

print "Test Started at `date`\n"     >log_${ENV}

しかし、これは単なる推測にすぎず、印刷コマンドが何をするのかを実際に理解するためには、より深く掘り下げる必要があります。どのシェルがコマンドを実行しているのか、それがあなたのシェルで動作しているのかを示す必要がありますtype print

関連情報