シェルスクリプトにシバン(#!/bin/sh)はないほうがいいという説

職場のパソコンで作業用にシェルスクリプトを書いていた。PATH変数の初期化に使っていたgetconfコマンドがないことを発端に,getconfのない環境でのPATH変数の初期化から,Androidで動くシェルスクリプトについて議論が発展した。 その中で,Androidでも動くシェルスクリプトを書くためには,シバン(#!/bin/sh)を書いてはいけないという結論が得られた。 一連の議論を記録として残す。 続きを読む
10
前へ 1 2 ・・ 10 次へ
. @senopen

いや,sedなんか使わなくても良かった。-pオプションを同時指定したらいけた。 export PATH="$(command -p $(command -pv getconf || echo :) PATH):$PATH" だけどやっぱりzshだとだめ。-pvが誤認される。えーい

2017-02-01 23:25:50
. @senopen

#POSIX原理主義 的に考えてzsh対応っているんかな…sh,dash,ksh,bash対応で十分交換可能性担保できているんじゃないか?zshとかfishまで対応する必要ってあるか?#!/bin/zshとか想定する必要あるの? どうなんだろう…

2017-02-01 23:28:51
くらげ採り網 @kuragegge

@senopen 個人的にはないと思います。そもそもzshに触ったことがないし、それしか使えない環境ってあるんですか?

2017-02-01 23:30:19
. @senopen

いや,zshの対応いらないんだったら,コマンドの有無の判定ももっと短くかける。command -vじゃなくて,hashでやる。 hash getconf 2>&-。command -vみたいにフルパスは取得できないので,本当に有無の判定だけ。 だけど短いしaliasも対応できる。

2017-02-01 23:30:50
. @senopen

@BRAVEMANLBRID 意見ありがとうございます。 *zshしか* ない環境はほぼないと思います。少なくても標準のログインシェルやshはbashです。 どこまでカバーするかなんです。簡単ならzshもカバーしてよいのですけど。getconfがない環境を想定すべきか,悩ましい…

2017-02-01 23:35:48
. @senopen

div_jpさんの一覧表を見る限りだとgetconfは9のOSに存在しているので,存在を前提としてもよさそうに見える。 でも実際にgetconfの内,SOHOのサーバーとかあるのをみてしまったからな… github.com/div-jp/POSIX/b…

2017-02-01 23:40:04
. @senopen

たとえ,POSIXへの準拠度の低いマシンがあったとしても,初期化の部分は落ちずに通用できるようにしたいという思いが… BusyBoxもそんなに悪くないんじゃないかなと。 たしかにgetconfなんてそんなに普段使わないから外されているのは理解できる。

2017-02-01 23:41:58
. @senopen

たぶん,コマンド一覧で重要になるのは,サーバー向けOSだと思う。サーバー用途はデスクトップと異なり,パッケージングが厳選されている。ユーザーが普段使うようなコマンドがない。 サーバー向けOSでのgetconfのシェアが判断の鍵かな。

2017-02-01 23:44:05
. @senopen

初期化はもう完璧だろうと思っていたから,まさかgetconfのないOSに出くわすとは思わなかった…くっそー。 そうこうしている内にこんな時間か…明日の準備して寝るか… うーん。どうすべきか,もやもやする…

2017-02-01 23:46:25
. @senopen

PATHの初期化もっと短くできた。 command -pvで正しいgetconfのフルパスとれるからそれを実行しても大丈夫 export PATH="$($(command -pv getconf || echo :) PATH):$PATH" これならLC_ALLと1行でかける

2017-02-01 23:53:35
. @senopen

@senopen zshをどうするかという問題。#!/bin/zsh -p みたいにシバンの起動オプションでPOSIX互換にできてちゃんと動作するならzshもカバーできたと考えよう。 本文にsetで書くとzsh以外に干渉するからだめ。 zshについても調べないとだめになったな…

2017-02-02 00:33:55
. @senopen

@senopen というか、POSIXのcommandのページみると、-pvのグループオプションは有効。なんでzshだけ実装間違えてるんだよ…意味不明。もー。

2017-02-02 00:36:26
. @senopen

@senopen zshのエミュレーションモード。-rsみたいにかくみたいなのだけど、思ったようにオプションが有効にならない…なせだ。

2017-02-02 12:59:00
. @senopen

emulate shとかzshに実体を貼ったshのシンボリックリンクでzshのshエミュレーションモードができた。けれど解決しなかった。 command -pv :がやっぱりだめ。zsh組み込みのcommandでは-pvがPOSIX違反。 zsh対応は諦めるのが早いかな…

2017-02-02 20:54:16
. @senopen

zshの代わりにfishというのが使えたらいいかと思って,ソースからコンパイルしたのだけど,なんかうまく起動できない…exportコマンドがないとかわざとPOSIX非準拠しているし,/bin/shの実体になることはないか。

2017-02-02 21:09:04
. @senopen

@senopen POSIX原理主義というけれど、POSIX規格にだけ固執してもしかたない。なぜならシバン自体#!/bin/shがPOSIX範囲外だから。/binがPOSIX未定義。有効なのはFHSのおかげ。 だから、POSIX非準拠だけを理由に切り捨てるのはなんか違う気がする

2017-02-02 00:46:42

BusyBox調査

. @senopen

@senopen getconfの有無は、たぶんBusyBoxの採用可否とリンクしている気がする。BusyBoxを採用しているディストリビューションを調べたほうがいいか。

2017-02-02 08:02:56
. @senopen

@senopen うーん。busybox のfindコマンドはオプション少なく過ぎてちと不便だな…

2017-02-02 10:15:06
ShellShoccar-jpn, a secret society @shellshoccarjpn

.@senopen BusyBoxは、互換性や持続性に配慮する余裕がない程にリソース制限のきつい環境向けの製品ゆえ、時空を超えた互換性を目指すPOSIX原理主義とはもともと目指す方向が違うと思うがな。だが、それでも両者の両立を図り、一定の成果を収められるなら、とても興味深いぞ。

2017-02-02 11:40:35
ShellShoccar-jpn, a secret society @shellshoccarjpn

.@senopen BusyBoxと同様なものにcrunchgenがある。しかしこちらは収録コマンドをユーザが自由に選択できるので、もしcrunchgenを採用するサーバがあったら、それこそどうしようもないのだがな。

2017-02-02 12:08:45
. @senopen

@shellshoccarjpn ありがとうございます。 BusyBox自体、名前や存在は知っていましたが、どれくらいの頻度でバージョンアップしているか、どれくらい使われているか、POSIXへの準拠度など、中身はほとんどしりませんでした。 まずはどんなものか調べて検討してみます。

2017-02-02 12:32:52
くらげ採り網 @kuragegge

@senopen @shellshoccarjpn さすがですね!頑張ってください!お待ちしております。

2017-02-02 12:36:37
. @senopen

@shellshoccarjpn BusyBoxと同様なソフトが他にもあるのですね。初耳でした。勉強になります。あわせて調べてみます。

2017-02-02 12:37:39
. @senopen

@senopen BusyBoxを採用している製品。けっこうある。 busybox.net/products.html 組み込みLinuxでの標準か。 たぶんAndroidもこれ使えるのだろう。 対応できたほうがいい気がするな。うーむ monoist.atmarkit.co.jp/mn/articles/08…

2017-02-02 21:23:18
前へ 1 2 ・・ 10 次へ