web-dev-qa-db-ja.com

bashrcエイリアスでコマンドをエスケープする方法は?

現在のタイムスタンプをファイル名として持つファイルに時々触れる必要があります。私はこのようにします:

touch `date "+%Y-%m-%d_%H-%M"`.txt

ただし、これのエイリアスを定義したいと思います。これをbashrcに追加しようとすると:

alias td="touch `date \"+%Y-%m-%d_%H-%M\"`.txt"

その結果、「日付..」はログイン中に1回だけ計算されるため、ファイル名はセッション全体で同じになります。

エイリアスを呼び出したときにのみコマンドを展開するにはどうすればよいですか?または、このための関数を使用する必要がありますか?

ありがとう

8
GJ.

シェルは、aliasコマンドを含むコマンドラインを展開し、_td=touch 2010-09-17_21-54.txt_のようなものをaliasコマンドに渡します。エイリアス定義の特殊文字を拡張から保護する必要があります。最も簡単な方法は、二重引用符の代わりに一重引用符を使用することです。

_alias td='touch `date "+%Y-%m-%d_%H-%M"`.txt'
_

その場合、tdは必要に応じて_touch `date "+%Y-%m-%d_%H-%M"`.txt_のエイリアスです。

ここでは問題ではありませんが、複雑なコマンドの問題を回避するために、_`…`_の代わりに$(…)を使用することをお勧めします(バッククォートには難解で移植性のないクォートルールがありますが、ドル括弧は直感的に機能します)。

_alias td='touch $(date "+%Y-%m-%d_%H-%M").txt'
_

受け入れられた答えはほとんど常に完璧です。一重引用符の代わりに二重引用符を使用する必要がある場合は、次のように機能します。

alias td="touch \`date \"+%Y-%m-%d_%H-%M\"\`.txt"
0
John Ward