シェルスクリプト総合 その8
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2007/02/15(木) 14:28:44スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その7
http://pc10.2ch.net/test/read.cgi/unix/1157601611/
0650名無しさん@お腹いっぱい。
2007/06/18(月) 16:24:47舌足らずですみません。
1行目で自分の間違いを気付き、
詳しい説明をしていただいたので助かりました、と書きたかったところでした。
-eオプションの非推奨コメントは特に助かります。
0651名無しさん@お腹いっぱい。
2007/06/18(月) 21:09:56/ )))
/ /// /―――-ミ
/ 彡彡 // / ヽ))
/ 彡彡 iiiiiiiiiiiiiii iiiiiiiiii|
/ 彡彡 < ・ > 、<・ >l
/ | ヽ 〉
/ ( | | __) | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ | ≡ /, ――― |ゝ < 馬鹿共にshellを与えるな!
/ | | L ___」 l ヾ \_________
_ミ l ______ノ ゞ_
| l ヾ ー / | l
| | \ー ‐/ | |
0652名無しさん@お腹いっぱい。
2007/06/19(火) 08:10:33>>更に言うと、-e は Bourne shでは使えないため非推奨。
?????
0653名無しさん@お腹いっぱい。
2007/06/19(火) 08:30:50教えて欲しいんなら「???」じゃなくて、ちゃんと日本語で書け。初心者君。
0654名無しさん@お腹いっぱい。
2007/06/19(火) 09:19:430655名無しさん@お腹いっぱい。
2007/06/19(火) 09:36:140656名無しさん@お腹いっぱい。
2007/06/19(火) 11:36:15今では使われていないOSばかりですね。じゃあ、-e使ってもいいですねw
0657名無しさん@お腹いっぱい。
2007/06/19(火) 11:45:450658名無しさん@お腹いっぱい。
2007/06/19(火) 13:41:51では日本語で書かせていただきます。
私が学習に使用している O'REILLY の「詳解シェルスクリプト」によりますと、
/bin/sh 組込の test コマンドに於ける -e 表現は標準的なものとして記述され
POSIX で定義している旨明記されております。また更に今回の議題の発端である
>>645 質問子の環境と共通する bash 等での独自の拡張に付いて記述した件では、
条件判定構文中の -a 演算子について(非推奨です。 -e を使いましょう)
とまで明記されているものを、使用者の環境の多用性や使用目的の別など勘案せず
一言の下に「非推奨」と断定できる根拠を教えてください。 お願いします。
0660名無しさん@お腹いっぱい。
2007/06/19(火) 13:51:15POSIXは理想論ばかりで、現実に即してないんだよ。
いくらPOSIXでどうこう言っても、実際に動くかどうかがすべて。
test -e については、Solarisの/bin/shで動かないんだから、
OS共通のシェルスクリプトでは非推奨であるのは当然。
あと、別件で、-e の意味で -aを使ってはいけない(非推奨)なのはその通りだよ。
-a は別に ANDの演算子の意味があって、そちらの意味で使うべきだからね。
わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで
-e を使ってるのがあったら、気づき次第直しとけよ。
0661658
2007/06/19(火) 14:12:59>>わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで
-e を使ってるのがあったら、気づき次第直しとけよ。
ご心配有り難うございます。
そもそも機能が曖昧過ぎて過ぎて使おうと思ったことも御座いませんw
0662名無しさん@お腹いっぱい。
2007/06/19(火) 14:15:20むだに波風立てんなよ。
0663名無しさん@お腹いっぱい。
2007/06/19(火) 22:13:270664名無しさん@お腹いっぱい。
2007/06/19(火) 23:22:070665名無しさん@お腹いっぱい。
2007/06/19(火) 23:28:40export LANG=C とか書いてるのを見ると反応してしまうのは互換性過敏症ですか?
0666名無しさん@お腹いっぱい。
2007/06/19(火) 23:56:180667名無しさん@お腹いっぱい。
2007/06/20(水) 00:19:14SunOS 3.5世代の俺なんかまだまだ甘ちゃんだ。
0668名無しさん@お腹いっぱい。
2007/06/20(水) 05:31:28それぞUNIXの面白さの真髄だわ
0669名無しさん@お腹いっぱい。
2007/06/20(水) 09:12:110670名無しさん@お腹いっぱい。
2007/06/20(水) 21:45:49現実がバラバラだから標準化が必要という理念が生まれたわけですわな。
で、各プラットフォームでそれぞれ POSIX に準拠する姿勢を示していながら
どうしても譲れない仕様への拘りがあるから未だに移植性の問題が取沙汰される。
そこの処の理を語らずに、只単に○○では使える or 使えないという議論に
終始するというのは如何にも思慮が浅いと言わざるを得まい。
0671名無しさん@お腹いっぱい。
2007/06/20(水) 22:08:390672名無しさん@お腹いっぱい。
2007/06/20(水) 23:20:26いまだに携帯電話つかわないもうろくジジイとかいるかなw
0673名無しさん@お腹いっぱい。
2007/06/21(木) 01:34:390674名無しさん@お腹いっぱい。
2007/06/21(木) 01:36:560675名無しさん@お腹いっぱい。
2007/06/21(木) 01:38:490676名無しさん@お腹いっぱい。
2007/06/21(木) 01:53:540677名無しさん@お腹いっぱい。
2007/06/21(木) 03:01:350678名無しさん@お腹いっぱい。
2007/06/21(木) 23:19:43こだわりなんかないだろ、準拠するのが面倒なだけだよ。
準拠したからって売れ行きがたいして変わるわけでもないし。
>>675
院内では携帯は使わないけど緊急呼び出しが頻繁にあるような
医者もいるからなぁ。
パイロットは仕事中は使わないけど、そういう意味なら電車の
運転手なんかも同じだな。
て言うか、仕事中とか会社の中に限定すると携帯持たない/持て
ない奴はそれなりにいるし。
0679名無しさん@お腹いっぱい。
2007/06/22(金) 00:04:290680名無しさん@お腹いっぱい。
2007/06/22(金) 09:16:460681名無しさん@お腹いっぱい。
2007/06/22(金) 20:12:440682名無しさん@お腹いっぱい。
2007/06/22(金) 20:59:200683名無しさん@お腹いっぱい。
2007/06/22(金) 23:11:19>>準拠したからって売れ行きがたいして変わるわけでもないし。
売行きが変わらないからって騒ぐこともないでしょ。
拘りがなければ準拠する方がはるかに楽なのにねぇ
あくまで /bin/sh 標準なのは基本であって、実勢はケースバイケースで、
linux じゃ bash 標準だろうし、 solaris だって適宜 ksh なり使うだろうし、
パーソナルユースや $HOME/bin 限定使用とか、管理者でも同一プラット
ホームだけでの運用が多く、移植性のプライオリティーがさほど高くない
現況において、やいのやいのいう奴は要するに「言いたいだけ」ちゃうんかと。
0684名無しさん@お腹いっぱい。
2007/06/22(金) 23:53:48何が楽なのか詳しく書いて欲しいんだが。
商用ソフトってちょっと変えると、検証がスゲー大変なことぐらいは知ってるよな?
0685名無しさん@お腹いっぱい。
2007/06/23(土) 00:08:17http://sed.sourceforge.net/sed1line.txt
http://www.student.northpark.edu/pemente/awk/awk1line.txt
組込みで使っているLinuxにgrepが入ってなくて
sedでシミュレートしたスクリプト書いたんだけど、
それ以上のことがいろいろできそうな感じなり。
おまけ
http://www.fepus.net/ruby1line.txt
0686名無しさん@お腹いっぱい。
2007/06/23(土) 00:11:08Solarisは古いshとkshを選択できるからいいけど、
HP-UXとかAIXは/bin/shはkshそのもなんで選択の余地はない。
シェルごときで移植性とか言ってるアホが多いっていうのは同意。
0687名無しさん@お腹いっぱい。
2007/06/23(土) 03:31:470688名無しさん@お腹いっぱい。
2007/06/23(土) 08:31:290689名無しさん@お腹いっぱい。
2007/06/23(土) 09:38:27コマンドにも完全な互換性がない以上、シェルスクリプトの互換性や移植性を気にし過ぎるのはアホ。
ささっと書いてテストして動きが変だったら、そのとき直せばいい。
シェルってそういうライトな使い方をするためのものでしょ。
0690名無しさん@お腹いっぱい。
2007/06/23(土) 10:04:55[ -e file ] とか、export HOGE=hoge とか書いて、
「動いたからOK」とか言ってる香具師の方がアフォに見えるけどな。
0691名無しさん@お腹いっぱい。
2007/06/23(土) 10:28:190692名無しさん@お腹いっぱい。
2007/06/23(土) 10:32:040693名無しさん@お腹いっぱい。
2007/06/23(土) 11:05:10>>690
0694名無しさん@お腹いっぱい。
2007/06/23(土) 11:08:340695名無しさん@お腹いっぱい。
2007/06/23(土) 12:54:510696名無しさん@お腹いっぱい。
2007/06/23(土) 13:08:14あるいは環境が一部不明な場合か。
ただ、知識としてはあれば有効だろうが
0697名無しさん@お腹いっぱい。
2007/06/23(土) 14:23:00いつのまにかそんな制約はなくなってしまうものなのだよ。
ニートにはわからないだろうが。
0698名無しさん@お腹いっぱい。
2007/06/23(土) 14:53:170699名無しさん@お腹いっぱい。
2007/06/23(土) 15:16:00「全ての」と「存在する」の違いを未だ習ってないのかい? ぼーや
0700名無しさん@お腹いっぱい。
2007/06/23(土) 15:20:19Perlを使うようになりますた
0701名無しさん@お腹いっぱい。
2007/06/23(土) 16:25:180702名無しさん@お腹いっぱい。
2007/06/23(土) 16:36:580703名無しさん@お腹いっぱい。
2007/06/23(土) 16:55:08だがそうした標準は、POSIX(Portable Operating System Interface)のように
一般的過ぎて役に立たないか、あるいはUNIX戦争として知られる
Open Software Foundation対UNIX Internationalの企業連合間抗争に
巻き込まれるかだった。
0704名無しさん@お腹いっぱい。
2007/06/23(土) 17:09:49プログラムがあるといいと思います!
0705名無しさん@お腹いっぱい。
2007/06/23(土) 17:11:110706名無しさん@お腹いっぱい。
2007/06/23(土) 20:29:52寡聞にして知らないなあ。
0707名無しさん@お腹いっぱい。
2007/06/23(土) 20:33:44つ dash #まあ呼び出したコマンドの互換性まではチェックできないわけだが・・・
0708名無しさん@お腹いっぱい。
2007/06/23(土) 20:36:480709名無しさん@お腹いっぱい。
2007/06/24(日) 05:17:26/bin/shを永久欠番化すれば解決
0710名無しさん@お腹いっぱい。
2007/06/25(月) 02:26:09互換性を述べている人は割とバランスの取れたUNIX流の解釈だと思うぞ
0711名無しさん@お腹いっぱい。
2007/06/25(月) 03:02:50varとかetcとか
システム変えることになったらどうせテンヤワンヤだ
0712名無しさん@お腹いっぱい。
2007/06/25(月) 05:49:560713名無しさん@お腹いっぱい。
2007/06/25(月) 23:17:51素直に自分よりの解釈だと言えば?
0714名無しさん@お腹いっぱい。
2007/06/25(月) 23:43:08>>517のedのヤツはもっと凄いな。
オレもed好きになろう。
0715名無しさん@お腹いっぱい。
2007/06/26(火) 15:37:000716名無しさん@お腹いっぱい。
2007/06/26(火) 15:40:11edでやってたな
0717名無しさん@お腹いっぱい。
2007/06/26(火) 15:40:12edより先におまえが日本語をうまく扱えるようになる必要がありそうだ
0718名無しさん@お腹いっぱい。
2007/06/26(火) 15:44:410719名無しさん@お腹いっぱい。
2007/06/26(火) 21:37:41シェルスクリプトって、基本的に ash と ksh と bash で動けば
移植性で問題になることは極めて低いよね?
この三つで動いても駄目な環境って今どれほど実運用されているのだろうか?
0720名無しさん@お腹いっぱい。
2007/06/26(火) 23:39:23Solarisが問題だな。Solarisにはkshが標準で付いてるとは言え、
シングルユーザモードでは使えない。
シングルユーザモードを含めたシステムスクリプトは依然、
/bin/shか/sbin/sh(単にstatic linkというだけで中身は/bin/shと同じ)の
範囲内で書く必要がある。
誰かが書いてたように、Solarisが無くなる(もしくは影響力が無くなる)なら、
シェルの互換性の問題は一気に解決するだろう。
0721名無しさん@お腹いっぱい。
2007/06/27(水) 00:25:59/usr/binの中には/bin/kshで書かれたコマンドもけっこうある。
Solarisのshの動きがヘンなのはたしかにときどきちょっと困る。
0722名無しさん@お腹いっぱい。
2007/06/27(水) 00:42:18マジで?
0723名無しさん@お腹いっぱい。
2007/06/27(水) 00:46:28> シングルユーザモードでは使えない。
> シングルユーザモードでは使えない。
0724名無しさん@お腹いっぱい。
2007/06/27(水) 00:50:42マジだよ。/sbinは別れてるけど。
>>720は/usrがマウントできない状況のことを言ってるんだと思うけど最近は/と/usrを分けないのもふつうなんじゃないかな。
0725名無しさん@お腹いっぱい。
2007/06/27(水) 00:53:11ふつースクリプトは#!/bin/shで書くけど/bin/shが何だかわかんねーじゃん?
って話では?
0726名無しさん@お腹いっぱい。
2007/06/27(水) 02:29:26HP-UXもだな。
0727名無しさん@お腹いっぱい。
2007/06/27(水) 02:31:28Solarisの/bin/shはそれこそSystemV7のころのものとほとんど変わっていない。
0728名無しさん@お腹いっぱい。
2007/06/27(水) 03:37:470729名無しさん@お腹いっぱい。
2007/06/27(水) 07:44:21じゃなくて、シングルユーザーモードの時、
/sbin/shはあるが、
/sbin/kshは無い。
/sbin/shはstatic linkの/bin/sh(/usr/bin/sh)
だから、シングルユーザーモードも含めれば、
結局 /bin/shの文法の範囲で書かざるを得ないという話。
しかも、Solarisの/bin/shは古いままなので、
export a=b も、$(command)も test -e も、
ちょっと新しい書き方はすべて使えない。
0730名無しさん@お腹いっぱい。
2007/06/27(水) 08:03:47一部のスクリプトで、未だに
${1+"$@"} って書いてあるのがある。
これ、もう "$@" でいいんじゃないか?
引数が0個の時に ""が残らないようにする措置だろうけど、
Solarisの/bin/shですらそんな不具合は発生しない。(確認済み)
なので、"$@"と書いて問題ないし、視認性上も "$@"と書くべきと思うんだが。
本当に ${1+"$@"}と書く必要がある /bin/shを搭載したOSって、
現存してる?
0731名無しさん@お腹いっぱい。
2007/06/27(水) 22:07:07なんか Solaris のシングルユーザモードって不便そうですね。
CD 6枚焼いたけど、インストールを躊躇してしまうよ。
0732名無しさん@お腹いっぱい。
2007/06/27(水) 22:19:420733名無しさん@お腹いっぱい。
2007/06/27(水) 23:07:41なるほどねぇ、知らんかったよ。ありがと。
>>730
書き換えるのが面倒なだけなんじゃないか?
目障りだと思うなら、君が片っ端から書き換えて動作検証してあげればいいと思う。
0734名無しさん@お腹いっぱい。
2007/06/27(水) 23:19:19すんません BSD ユーザなもので、 / と /usr を分けるというのが
イマイチ良く解かりません。
ad0s1a に全部突っ込めって事ですか?
/var も /tmp も含めて・・・(よーするに swap 以外は同じパーテーション?)
Solaris だとそんなの有りなんだぁ。(BSDでも無いことは無いけど、なんだか・・)
0735名無しさん@お腹いっぱい。
2007/06/27(水) 23:36:430736名無しさん@お腹いっぱい。
2007/06/27(水) 23:43:05でも、その好みの問題に対して Solaris はシングルユーザモードの
挙動をもってして、ユーザに介入してくる分けでしょう?
>>732 のレスからは、そういう風に読めるのだが?
0737名無しさん@お腹いっぱい。
2007/06/28(木) 00:09:080738名無しさん@お腹いっぱい。
2007/06/28(木) 05:10:23>>730 の ${1+"$@"} てどうゆう意味なの??
なんか理解できん・・・(TT
0739名無しさん@お腹いっぱい。
2007/06/28(木) 05:18:04NetBSDのデフォルトは分けないからBSDユーザーってのは言い訳にならない。
0740名無しさん@お腹いっぱい。
2007/06/28(木) 07:33:15if [ X$HOGE = X ]
なんてのも見かける。これも、
if [ "$HOGE" = '' ]
と書いたほうがいい。
むかーしのバージョンのtestで、$HOGEの内容が = だったような場合、
[ = = '' ] みたいになるとエラーになるtestに対する対処として、
X$HOGE とかいう回避法があったけど、今の testコマンドでそれが必要なのは
もう現存しないはず。
0741名無しさん@お腹いっぱい。
2007/06/28(木) 14:01:16ちがう。
$HOGE の内容が -f だったような場合に対する対処だから、今でも有効。
0742名無しさん@お腹いっぱい。
2007/06/28(木) 14:16:42$HOGE の内容が -f でも正常に動くんだけど。
[ -f = hoge ] みたいに、項が3つある時は、
-fはファイル存在オプションとはみなされないから
-f だった時駄目になるような/bin/sh搭載した OSって 何?
0743名無しさん@お腹いっぱい。
2007/06/28(木) 14:36:59a="-f"
b="-a"
c="="
d=""
test X"$a" = X"$b" -a X"$c" = X"$d"
echo $?
test $a = $b -a $c = $d
echo $?
FreeBSD の ash、Solaris の sh, ksh、GNU bash いずれでも異なる結果になりました。
0744名無しさん@お腹いっぱい。
2007/06/28(木) 14:39:58それは、複数の式を -a (AND) でつないだ場合の話。
それだと確かに式の評価がおかしくなることがあるが、
[ $HOGE = hoge ] なら、X$HOGE とする必要はなし。
Solarisの/bin/sh でも [ -f = -f ] は無問題。
0745名無しさん@お腹いっぱい。
2007/06/28(木) 14:43:14一律で X$HOGE にしといた方がおしゃれ。
0746名無しさん@お腹いっぱい。
2007/06/28(木) 14:48:53-a 使う場合は、各評価式ごとに \( \) で括るのを推奨。
[ \( "$a" = "$b" \) -a \( "$c" = "$d" \) ]
↑みたいにね。これで、X"$HOGE" は不要。
0747名無しさん@お腹いっぱい。
2007/06/28(木) 14:54:19> [ $HOGE = hoge ] なら、
クォート忘れてる。
> X$HOGE とする必要はなし。
ダウト。
そのへんの対バカ性能をどこまで頑張るかはヒューリスティックで実装依存。
たとえばFreeBSDのtestでは
$ HOGE='!'
$ [ "$HOGE" = hoge ]; echo $?
[: =: unexpected operator
2
となるので変数に任意の値を想定するなら "X$HOGE" = Xhoge は依然必要。
常にtestの引数が正しい式となるよう書くにしくはなし。
0748名無しさん@お腹いっぱい。
2007/06/28(木) 15:06:47>>730 についてはどうお考え?
${1+"$@"} は以前必要? もう不要で "$@"で桶?
0749名無しさん@お腹いっぱい。
2007/06/28(木) 15:09:08どこ使うんだろ。
0750名無しさん@お腹いっぱい。
2007/06/28(木) 17:18:00■ このスレッドは過去ログ倉庫に格納されています