10

私が書くとき、bashでマクロ関数を定義することは可能ですか:

F(sth);

bash はこれを実行します:

echo "sth" > a.txt;
4

4 に答える 4

17

任意の構文で何かを行うことはできません。括弧はパーサーにとって特別な意味を持つメタ文字であるため、有効な名前として使用することはできません。シェルを拡張する最良の方法は、関数を定義することです。

これは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 はターミナルの出力を展開しようとし、シェルをハングさせます。

于 2012-04-17T06:45:22.457 に答える
8
F () {
  echo "$1" > a.txt
}

呼び出すときに括弧を使用しません。これはあなたがそれを呼び出す方法です:

F "text to save"
于 2012-04-17T06:42:51.733 に答える
3

はい、あなただけがそれを呼び出す必要がありますF sth:

F()
{
  echo "$1" > a.txt
}

詳細はこちらをご覧ください

于 2012-04-17T06:43:35.210 に答える