シェルスクリプトにシバン(#!/bin/sh)はないほうがいいという説
職場のパソコンで作業用にシェルスクリプトを書いていた。PATH変数の初期化に使っていたgetconfコマンドがないことを発端に,getconfのない環境でのPATH変数の初期化から,Androidで動くシェルスクリプトについて議論が発展した。
その中で,Androidでも動くシェルスクリプトを書くためには,シバン(#!/bin/sh)を書いてはいけないという結論が得られた。
一連の議論を記録として残す。
続きを読む
.
@senopen
@senopen デメリットがないというのは嘘で、例えば、bashだとaliasが展開されないという問題がある。shopt expandaliasを有効化してもいいが、aliasを関数にすればいいだけだから、すぐに解決できる。
2017-03-30 09:22:37
.
@senopen
@senopen 確認していたのだけど、msys2とかcygwinだとシバンがないとファイルの実行権限が有効にならないのかな?この仕様はなんだろう。
2017-03-30 10:09:33
.
@senopen
@senopen lsのバグかな。別に実行権限なくても実行できたし、シバンつけたファイルに自分て実行権限つけてないけど、勝手についていたし…
2017-03-30 10:18:55
.
@senopen
@senopen 一通り確認できた。検証コード : ps.sh ps | grep $$ ./ps.shで対話シェル実行 jsh,pdksh,fish,zsh,ash,bash,dash,ksh88,ksh93,csh,tcsh。どれもsh,ksh,ksh93,bashのどれか
2017-03-30 22:31:44
.
@senopen
@senopen 1点気になったのが,fishの-c fish -c './ps.sh' これだけ反応がなかった。けれど,対話シェルからだと問題なく実行できた。他は-c './ps.sh'でも実行可。 fishはPOSIX未定義コマンド。fish -cで使うことはないだろう
2017-03-30 22:33:51
.
@senopen
@senopen mkshも確認していた。結果リストに載せるのを忘れた。 年度が変わるまでに,一気に問題が解決してすっきりした。 シバン,ksh88のset -uの$@,Solaris 10のjsh。 よかった。後で全部ブログにきっちりまとめる。 あとはメイン作業に着手だな…
2017-03-30 22:38:29