it-swarm-ja.com

文字列に組み込まれたBashの「時間」は実行されません

$ cmd='time sleep 2'
$ $cmd
bash: time: command not found

何が起きてる?これが機能するため、シェルビルトインが機能しないことは問題ではありません。

$ cmd2='echo wef'
$ $cmd2
wef

何か案は?

編集:私は違いを見つけました:

$ type time
time is a Shell keyword

対:

$ type echo
echo is a Shell builtin

だから今の質問は-なぜ組み込みが文字列で機能し、キーワードが機能しないのですか?

2
ACK_stoverflow

time asGNU Bashキーワードには、受け入れられる非常に特定の場所があります。たとえば、コマンドパイプライン構造の構文を参照してください。

パイプラインの形式は[time [-p]] [!] command1 [| command2 ...]です。

これは、展開の外側のキーワードの位置をハードコーディングします(commandNは、パラメーターと変数が展開される場所になるため)。実際、セマンティクスはコマンドではなくパイプライン全体に適用されるため、おそらくこれがキーワードである必要がある理由です。

シェルビルトインtimes(POSIX a 特別ビルトイン )があります。最初のWordは実行可能ファイルまたはシェルビルトインであるため、この拡張は機能します。

あるいは、GNU coreutilsには/bin/time実行可能ファイルが含まれています。

実際、timeはありません 予約語 inPOSIX Shell(bashはそれを posixモード とにかく(明らかでない理由で-が続く場合を除く))。

eval式の内部では、キーワードはbashによって認識されるため、これを使用して、時間プロファイリングでコマンドを動的に拡張できます。 (ただし、一方で、追加の見積もりラウンドが必要です)

2
eckes

Cmd = 'time sleep 2'を使用する代わりに、cmd = '/ usr/bin/time sleep2'として使用してリアルタイムコマンドを取得してみてください。

あなたは人の時間で以下を読むことができます:

Bashシェルのユーザーは、シェルの組み込みバリアントではなく、外部時間コマンドを実行するために明示的なパスを使用する必要があります。/usr/binに時間がインストールされているシステムでは、最初の例は/ usr/bin/time wc/etc/hostsになります。

0
Genaro Morales