bash の関数定義について
bashの関数定義の記事で触れていないことが有ります。というか意図的に省きました。
bash の関数定義には「リダイレクト」が含まれます。
リダイレクトを含めたbash関数定義
bashにおける関数定義は、正しくは実は次のようになっています。
はい。そうです。リダイレクト先が含まれます。
function FUNCNAME () { COMMANDS } > REDIRECTIONS
function FUNCNAME { COMMANDS } > REDIRECTIONS
FUNCNAME () { COMMANDS } > REDIRECTIONS
リダイレクトも含めると楽なことがある。
以下のような記述は、まとめて書くことが出来る。一行に書くときや、エラーログを統一したいときに便利ね。
before
function MyFunc () {
some_command1 > my.log
some_command2 > my.log
some_command3> my.log
}
after
function MyFunc() {
some_command1;
some_command2;
some_command3;
} > my.log
そもそもコードブロックをリダイレクト出来る
Bashの関数定義ですこし触れましたが、 {} のコードブロックは関数の定義の一部と考えると理解しやすいです。
リダイレクトについても同じで{ } のブロックのすべてのリダイレクトを一括して指定出来る。
{
commandA
commandB
commandC
} > /dev/null
これは、if などの条件分岐を書くときにちょっと便利。
if { commandA && commandB } > /dev/null ; then some_command; fi
コレを使うことで、/dev/null 地獄から脱出できる
コードブロックを上手に使うとこんなことが出来る
php など言語からshell 呼び出しをするときにバックグラウンド起動で関数やコードブロックを渡すことが出来る。
<?php shell_exec ( "{sleep 100;sleep 100;} > /dev/null 2>/dev/null &; ");
phpで複数行のシェル呼び出しをバックグラウンドにする - それマグで!
また if 文の条件をまとめて関数にすることが出来る。
function MyConditions() { some_command1; some_command2;} > /dev/null
if MyConditions ; then
do_something;
fi
私は馬鹿なのでコレくらいしか、利用方法が思い付かないが、実はすごくいい活用方法があるのかもしれない。