一方でalias
それを行うための一つの方法である、これが可能で行うことeval
としても-それはあなたがにそんなにないしたいですだけということだeval
あなたがしたいようにコマンド実行をeval
指示宣言。
私はalias
esが好きです-私はいつも使いますが、関数の方が好きです。特に、パラメータを処理する能力と、alias
esに必要なようにコマンド位置で必ずしも拡張する必要がないことです。
だから、あなたもこれを試してみたいと思いました:
_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つのコマンド文字列に連結されますが、各引数は独自の\n
ewlineを取得するため、比較的簡単に展開できます。または、必要に応じてそれらを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
何かをする。