私が書くとき、bashでマクロ関数を定義することは可能ですか:
F(sth);
bash はこれを実行します:
echo "sth" > a.txt;
任意の構文で何かを行うことはできません。括弧はパーサーにとって特別な意味を持つメタ文字であるため、有効な名前として使用することはできません。シェルを拡張する最良の方法は、関数を定義することです。
これはecho
、常に同じファイルに書き込む基本的なラッパーです。
f() {
echo "$@"
} >a.txt
これはほぼ同じですが、さらにstdinを処理します-犠牲echo's
-e
と-n
オプション:
f() {
[[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}"
} >a.txt
次のように呼び出すことができます
f arg1 arg2...
また
f <file
関数には、他のコマンドと同じ方法で引数が渡されます。
2 番目の echo に似たラッパーは、最初に設定された最初の引数、または tty 以外からの stdin のいずれかを最初にテストし、設定されている場合は位置パラメータまたは stdin のいずれかを使用して、条件付きで printf を呼び出します。テスト式は、引数がゼロで、ファイルからのリダイレクトがない場合を回避します。この場合、Bash はターミナルの出力を展開しようとし、シェルをハングさせます。
F () {
echo "$1" > a.txt
}
呼び出すときに括弧を使用しません。これはあなたがそれを呼び出す方法です:
F "text to save"