質問: 文字列に組み込まれた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 だから今の質問は-なぜ組み込みが文字列で機能し、キーワードが機能しないのですか?
回答: time asgnu bashキーワードには、受け入れられる非常に特定の場所があります。たとえば、コマンドパイプライン構造の構文を参照してください。 パイプラインの形式は[time [-p]] [!] command1 [| command2 ...]です。 これは、展開の外側のキーワードの位置をハードコーディングします(commandnは、パラメーターと変数が展開される場所になるため)。実際、セマンティクスはコマンドではなくパイプライン全体に適用されるため、おそらくこれがキーワードである必要がある理由です。シェルビルトインtimes(posix a 特別ビルトイン )があります。最初のwordは実行可能ファイルまたはシェルビルトインであるため、この拡張は機能します。あるいは、gnu coreutilsには/bin/time実行可能ファイルが含まれています。実際、timeはありません 予約語 inposix shell(bashはそれを posixモード とにかく(明らかでない理由で-が続く場合を除く))。eval式の内部では、キーワードはbashによって認識されるため、これを使用して、時間プロファイリングでコマンドを動的に拡張できます。 (ただし、一方で、追加の見積もりラウンドが必要です)