あなたが提案する方法は、実際には完全に有効です。 Bash のマニュアルでは、関数宣言の構文を次のように指定しています (強調は私のものです):
<ブロック引用>関数は次の構文を使用して宣言されます:
name () compound-command [ redirections ]
または
function name [()] compound-command [ redirections ]
したがって、これは完全に有効で、 outfile
の内容を置き換えます myfunc
への引数付き :
myfunc() {
printf '%s\n' "$1"
} > outfile
または、 outfile
に追加するには :
myappendfunc() {
printf '%s\n' "$1"
} >> outfile
ただし、次のように、ターゲット ファイルの名前を変数に入れてリダイレクトすることはできますが、
fname=outfile
myfunc() { printf '%s\n' "$1"; } > "$fname"
他の回答で推奨されているように、関数を呼び出す場所でリダイレクトを行う方がはるかに明確だと思います。 できることを指摘したかっただけです 関数宣言の一部としてリダイレクトがあります。
これはバシズムではありません。POSIX シェル仕様では、関数定義コマンドでのリダイレクトも許可されています。
関数を呼び出すときにリダイレクトを行います。
#!/bin/bash
initialize() {
echo 'initializing'
...
}
#call the function with the redirection you want
initialize >> your_file.log
または、関数でサブシェルを開き、サブシェルの出力をリダイレクトします:
#!/bin/bash
initialize() {
( # opening the subshell
echo 'initializing'
...
# closing and redirecting the subshell
) >> your_file.log
}
# call the function normally
initialize
exec
に使用できます シェルのリダイレクトについては、関数で機能するかどうかわかりません
exec > output_file
function initialize {
...
}
initialize