20

出力を for ループ ブロックからファイルにリダイレクトするのと同じように

for ()
do
  //do something
  //print logs
done >> output file

同様に、シェルスクリプトで、出力を関数ブロックからファイルにリダイレクトする方法はありますか?

function initialize {
         //do something
         //print something
} >> output file

//call initialize

そうでない場合、それを達成できる他の方法はありますか?私の関数には、ログに出力するメッセージがたくさんあることに注意してください。すべての行で出力をファイルにリダイレクトすると、大量の I/O 使用率が発生します。

4

4 に答える 4

14

あなたが提案する方法は、実際には完全に有効です。Bash マニュアルでは、関数宣言の構文を次のように指定しています (強調は私のものです) 1 :

関数は、次の構文を使用して宣言されます。

name ()複合コマンド[リダイレクト]

また

関数[()]複合コマンド[リダイレクト]

したがって、これは完全に有効であり、 の内容をoutfileの引数に置き換えmyfuncます。

myfunc() {
    printf '%s\n' "$1"
} > outfile

または、に追加するにはoutfile

myappendfunc() {
    printf '%s\n' "$1"
} >> outfile

ただし、次のように、ターゲット ファイルの名前を変数に入れてリダイレクトすることはできますが、

fname=outfile

myfunc() { printf '%s\n' "$1"; } > "$fname"

他の回答で推奨されているように、関数を呼び出す場所でリダイレクトを行う方がはるかに明確だと思います。関数宣言の一部としてリダイレクトを使用できることを指摘したかっただけです。


1これはバシズムではありません。POSIX シェル仕様では、関数定義コマンドでのリダイレクトも許可されています。

于 2016-12-27T06:19:13.673 に答える
14

関数を呼び出すときにリダイレクトを行います。

#!/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
于 2013-08-07T06:53:25.530 に答える
3

exec関数で機能するかどうかわからないシェルリダイレクトに for を使用できます

exec > output_file
function initialize {
  ...
}
initialize
于 2013-08-07T05:23:45.460 に答える