2012-04-17 8 views
7

内の関数のようなマクロは、私が書くときにbashでマクロ関数を定義することが可能です定義:bashの

F(sth); 

bashはこれを実行します:

echo "sth" > a.txt; 

答えて

14

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

これは常に同じファイルに書き込みを行い、基本的なechoラッパーのようになります。これは、ほぼ同じませんが、さらに標準入力を処理

f() { 
    echo "[email protected]" 
} >a.txt 

からecho's-e-nオプション犠牲:

f() { 
    [[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}" 
} >a.txt 

f arg1 arg2... 
0123と呼ぶことができます。の

または

f <file 

機能は、他のコマンドと同じように引数を渡されます。

set first argumentまたはnon-ttyからのstdinを最初にテストし、条件付きでsetfまたはstdinのいずれかの位置パラメータを使用してprintfを呼び出します。テスト式は、引数がゼロでもファイルからのリダイレクトもしないようにします。この場合、Bashはターミナルの出力を拡大してシェルを掛けようとします。

+0

+1、素敵な答え。あなたは、より複雑な(しかしより良い)構造を使用して引数を出力する理由をより詳細に説明してもらえますか? – Kaii

+0

stdinまたは引数からの入力だけが可能です。テスト式は、引数がゼロで、stdinが端末から来ている状況を防ぎます。その場合、tty自身のプロセスが読み込みとブロックを行っているので、シェルをkillする必要があります。それが合格すると、位置パラメータが設定されていれば展開されるか、関数の入力から展開が読み込まれます。 'cat 'を使うと移植性は少し向上しますが、より緩やかな解決策が可能です。これには実際の/ dev/fd/*システムが必要です。私は以前の答えが他のものと同じであったので、このトリックを投稿しました。 :) – ormaaj

+0

また、 'echo'と同じように*複数の引数を許しています。あなたの関数は 'f one two three'で動作しますが、他の関数は 'f"で動作します。 qotesなしで入力が与えられた場合、他のソリューションは最初の単語(ここでは「1」)のみを考慮に入れます。 – Kaii

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

あなたドンあなたがそれを呼び出すときにかっこを使用しないでください。これは、あなたがそれを呼び出す方法です:

F "text to save" 
3

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

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

here続きを読みます。