それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashの関数定義には「リダイレクト」も含まれる

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 

私は馬鹿なのでコレくらいしか、利用方法が思い付かないが、実はすごくいい活用方法があるのかもしれない。

参考資料

The classic test command [Bash Hackers Wiki]