一方でaliasそれを行うための一つの方法である、これが可能で行うことevalとしても-それはあなたがにそんなにないしたいですだけということだevalあなたがしたいようにコマンド実行をeval指示宣言。
私はaliasesが好きです-私はいつも使いますが、関数の方が好きです。特に、パラメータを処理する能力と、aliasesに必要なようにコマンド位置で必ずしも拡張する必要がないことです。
だから、あなたもこれを試してみたいと思いました:
_time() if   set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
';      then set -- "$1" "$2" "$*"; unset IFS
             eval "$1 $TIME ${3#"$1"?"$2"?}"
        fi
$IFSビットは主についてです$*。ことが重要だ( subshell bit )である、シェル拡張の結果とその解析可能な文字列Iの使用に引数を拡大するためには"$*" (ないeval "$@"、ところで、あなたは引数のいる特定のすべてがスペースに参加することができない場合)。引数間の分割区切り文字"$*"はの最初のバイトである$IFSため、その値を確認せずに続行すると危険な場合があります。したがって、関数はを保存し$IFS、それをに\n入る十分な長さのewlineに設定set ... "$*"し"$3"、unset以前に値があった場合はその値をリセットします。
ここに小さなデモがあります:
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
         'command -V time'                        \
         'hash time'                              \
      \) 'set +x'
私はそこに2つのコマンドを入れました$TIME-どんな数値でも結構です-なしでも-エスケープされ、適切に引用されていることを確認してください-同じことがへの引数にも当てはまります_time()。それらは実行時にすべて1つのコマンド文字列に連結されますが、各引数は独自の\newlineを取得するため、比較的簡単に展開できます。または、必要に応じてそれらを1つに\nまとめて、それらをewlineまたはセミコロンまたはwhat-have-you で区切ることもできます。単一の引数が、それを呼び出すときにスクリプト内の独自の行に置くのが快適だと思うコマンドを表すことを確認してください。\(たとえば、最終的にが付いている限り、問題ありません\)。基本的には通常のものです。
ときeval上記のスニペットはそれを与えますそれは次のようになります。
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
そして、その結果は次のようになります...
出力
+++ echo any number of subshells
++ echo 'any number of subshells'
any number of subshells
++ command -V time
time is a shell keyword
++ hash time
bash: hash: time: not found
real    0m0.003s
user    0m0.000s
sys     0m0.000s
++ set +x
hashエラーは、私が持っていないことを示して/usr/bin/timeインストール(私はないので)とcommand、私たちが実行している時間を知ってみましょう。末尾がset +x実行され、別のコマンドです後に time (可能) -時に入力コマンドに注意することが重要であるeval何かをする。