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
私は馬鹿なのでコレくらいしか、利用方法が思い付かないが、実はすごくいい活用方法があるのかもしれない。