トップページunix
1001コメント312KB

シェルスクリプト総合 その6

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001うはwwwww2006/03/26(日) 00:56:22
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
08758682006/08/17(木) 18:07:27
サンクス
869,870は無理だった
871でおk FreeBSD

0876名無しさん@お腹いっぱい。2006/08/17(木) 18:17:31
>>874
export VAR=value
をbash依存文法とする根拠を述べよ。


0877名無しさん@お腹いっぱい。2006/08/17(木) 18:34:09
>>876
「bashで使えて Bourne shで使えないから」そのままやん。

先に言っとくと、*BSDのsh=ash≠Bourne shだからね。
0878名無しさん@お腹いっぱい。2006/08/17(木) 18:37:17
>>876
やれやれ。最近は export VAR=value がbash依存文法であることも知らない新参者が多いのう。
0879名無しさん@お腹いっぱい。2006/08/17(木) 18:48:28
なぜかほこらしげ
0880名無しさん@お腹いっぱい。2006/08/17(木) 19:50:30
>>878
bash依存というより、ksh依存といった方が正しい。
0881名無しさん@お腹いっぱい。2006/08/17(木) 20:06:58
bash依存というけれど他がbashに合わせるべきだよね。
立場をわきまえないと。
0882名無しさん@お腹いっぱい。2006/08/17(木) 22:22:58
ああ、どれが釣りなのかわからん…

"export var=value"という書き方はPOSIXシェルで有効な文法で、
bash依存の仕様と言うわけではない。
SolarisではkshはPOSIXとの互換性を使いたい場合のシェルで、
/bin/shは上記文法を受け付けず、POSIXに準拠しない。
0883名無しさん@お腹いっぱい。2006/08/18(金) 00:24:41
>>878
POSIXくらいは確認してから書こうな。テンプレにも入れてあるんだし。
0884名無しさん@お腹いっぱい。2006/08/18(金) 00:47:04
で、POSIX準拠かどうかということが実践では役に立たないのも事実なわけで、
POSIXよりも、「/bin/shで使える文法かどうか」の方が重要。
0885名無しさん@お腹いっぱい。2006/08/18(金) 01:17:06
/bin/shがPOSIX準拠でないOSにはそろそろ引退してもらいましょう
0886名無しさん@お腹いっぱい。2006/08/18(金) 02:45:19
仕事で使うなら、いいわけもえり好みもできない。
だから確実性が最優先だし、選択肢が存在すると考えること自体が間違い。
/bin/shが何者か分からなければ、bourne shellサポート範囲内かつbash拡張範囲外で書くべき。

POSIXシェルでなければならない理由が本当にあるかどうか分からないが、
もし仮に本当に必要ならば明示的に指定して使ってやればいいんだよ。
/bin/bashや/bin/xpg4/sh(Solaris)や/bin/ksh(Solaris)が存在するなら
ベンダが保証したPOSIXシェルとして使えるんだから、
何者か分からない/bin/shをおっかなびっくり使うよりマシ。
0887名無しさん@お腹いっぱい。2006/08/18(金) 07:39:23
autoconfが生成するconfigure.shはnon-POSIXでも動くよう書かれているんだよね...
0888名無しさん@お腹いっぱい。2006/08/18(金) 07:57:41
そういうクズなシステムを例にだしてもなんの意味も無い。
0889名無しさん@お腹いっぱい。2006/08/18(金) 08:11:18
一番混乱させているのが、*BSD。

Linux(の多くのディストロ)は標準をbashと決めているから、そういうものとして理解すればいいが、
*BSDの/bin/shはそれぞれで勝手に拡張されているし、バージョンによってコロコロ変わってたりするから、
わかりにくい。
0890名無しさん@お腹いっぱい。2006/08/18(金) 08:14:41
FreeBSDのshで、printfが外部コマンドに変更されたのは許せん。
0891名無しさん@お腹いっぱい。2006/08/18(金) 08:31:30
実装違いに悩まされないためにPerlで書いてしまう手もあるが
やはり/bin/shで何とかするのが心意気というものであろう
0892名無しさん@お腹いっぱい。2006/08/18(金) 11:31:48
実行前にshを調べてperlで整形すれば解決ですよ。
0893名無しさん@お腹いっぱい。2006/08/18(金) 17:59:00
HOGE=abcd export HOGE
でも設定出来るのになんでセミコロン入れるんだろ?
0894名無しさん@お腹いっぱい。2006/08/18(金) 18:05:10
>>893
古いシェルだと、内部コマンドに対して HOGE=hoge のような変数の指定が
うまく動作しないものがある。だから ; を入れるのが吉。
0895名無しさん@お腹いっぱい。2006/08/18(金) 18:10:06
いや、HOGE=hoge export HOGE の場合、
exportという1コマンドに対してのみ一時的に HOGE=hogeという環境変数を設定する、
という動作が本来の仕様なのだから、
HOGE=hoge export HOGE (セミコロンなし)でもexportできてしまう方がバグと思われる。
(古いシェルの動作が正しい)

たとえば、
HOGE=hoge printenv HOGE
だと、printenvコマンドではhogeが表示されるが、
その後はHOGEは未設定になる動作が正しい。exportでもそうなるべきだ。
0896名無しさん@お腹いっぱい。2006/08/19(土) 05:48:58
過去のしがらみも古参の権威もなくPOSIXしか拠り所のないlinuxはPOSIX優等生。
うちは昔からこうやってるなんて言いだす傲慢さは無い。
最古参のBSDは困ったちゃん。
0897名無しさん@お腹いっぱい。2006/08/19(土) 08:01:41
>>896
LinuxはPOSIXに準拠してないよ。拠り所は GNU。
GNUの独自拡張だろうが、GNUで使えれば事実上の標準になってる。
0898名無しさん@お腹いっぱい。2006/08/19(土) 09:03:50
つーか、「便利ならいいじゃん」がLinux。
そういって、95年当時にLinusが事務処理にはWindowsを使っ
ていたことは公然の秘密だ。
0899名無しさん@お腹いっぱい。2006/08/19(土) 09:18:08
>>896
POSIX準拠なのはLinuxだけじゃないし、opengroupのUNIX認証を通ってないから
結局のところPOSIX準拠であることを第三者に証明できない。
優等生ってのは言い過ぎじゃないかなあ。

>>897
「GNUで使えれば」ってどういう意味よ? 説明してみて。
0900名無しさん@お腹いっぱい。2006/08/19(土) 14:21:52
opengroupのUNIX認証を通ってないから<-誤り
UNIX認証を受けてない、メンバーにも入れてもらえない。
もしUNIX認証を受けるにしてもデストリごどになる。
linuxにUNIXを実装する事自体は容易、ほぼそのままでもいけるか。
現状はlinuxである方が有理なのでUNIX認証にはあまり興味が無い。
linuxはlinux認証を立ち上げた。
0901名無しさん@お腹いっぱい。2006/08/20(日) 00:57:46
>>895
exportが、値を何というか環境に担ぎ出して固定する
ようなイメーヅだと思えば不思議じゃない。

$ HOGE=hoge HOGE=hoge

とやった後にHOGE=hogeに設定される、
そういう効果をもともと持つコマンドがexportってこと。
0902名無しさん@お腹いっぱい。2006/08/20(日) 03:54:31
> opengroupのUNIX認証を通ってないから<-誤り
> もしUNIX認証を受けるにしてもデストリごどになる。

ほほう、UNIX認証を受けたLinuxディストリビューションが
1つでも存在するのならば知りたいものだね。興味がある。

で、「Linux認証」なるものが仮に標準たりうるとしても、
それは>>896の言う「BSDの権威」とどう違うのよ?という話。
0903名無しさん@お腹いっぱい。2006/08/20(日) 13:15:37
Linux認証?
0904名無しさん@お腹いっぱい。2006/08/20(日) 14:05:04
http://www.google.co.jp/search?q=linux+iso+%E8%A6%8F%E6%A0%BC+&hl=ja&lr=&start=0&sa=N
たぶん失敗する、なんら権威の根拠とはならないだろう。
今linuxにおける権威はRedHat、Debian、Fedora、そしてリーナスである。
一見上層に見える色々なlinux関連団体は実はなんら支配力も実効力も持っていない。
Fedoraを怒らせたらStallmanだって追放されるだろうよ。
StallmanはFedoraを抱き込んでxFree86を追放した、そういう権力構造。

>>902
その前にunixの会員になるのにいくら金積めばいいのか教えてくれ。
0905名無しさん@お腹いっぱい。2006/08/20(日) 15:48:52
Stallmanを追放って...
追放が可能なためには、まずは所属してないと。
0906名無しさん@お腹いっぱい。2006/08/20(日) 20:10:26
>>904
UNIX認証とは違う話をしているようだけど、
「unixの会員になる」というのが何を指すのか説明して。

>>905
彼の妄想世界では可能なんだよ、きっと。
0907名無しさん@お腹いっぱい。2006/08/21(月) 08:35:36
そういや最近のGNU coreutilsはsort, head, tailとかのコマンドが
「-行数」をデフォルトで受け付けたりやめたりとずいぶん揺れてるね。

このへんはPOSIX 1003.2-1992かPOSIX 1003.1-2001かで違うみたいだ。
0908名無しさん@お腹いっぱい。2006/08/21(月) 09:34:22
「UNIX」は、X/Open Company Limitedが独占的にライセンスしている米国ならびに他の国における登録商標です。
0909名無しさん@お腹いっぱい。2006/08/21(月) 15:45:35
>>906
きっと美容院のことだよ。
ご紹介システムを利用すれば、1000円分のポイントもらえるよ。
0910名無しさん@お腹いっぱい。2006/08/21(月) 16:12:59
「unixの会員になる」って、
レンタル・ビデオ屋UNIXの会員になるってことじゃないかな。
0911名無しさん@お腹いっぱい。2006/08/21(月) 16:24:16
>>901
そのexportの解釈でもちょっと苦しいね。

あと、別の例だけど、
$ HOGE=hoge unset hoge
$ echo $HOGE
hoge

↑unsetされてない。
これはどう解釈する?
やっぱバグだろ。
09129112006/08/21(月) 16:35:48
typoしてもうた。↓のとおり

$ HOGE=hoge unset HOGE
$ echo $HOGE
hoge

この現象が起きるのはシェルの種類によるかも。

もちろん、セミコロンを入れて
$ HOGE=hoge; unset HOGE
ならちゃんと unsetされる。

何が言いたいかというと、元の話題の HOGE=hoge; export HOGE の時、
念のためセミコロンを入れろということ。
0913名無しさん@お腹いっぱい。2006/08/21(月) 21:25:46
いやいやいやexportの話でしょ?
その言い方からすると、そのウンコシェルでもexportは効くんでしょ?
0914名無しさん@お腹いっぱい。2006/08/22(火) 13:34:42
>>910
ウチの近くに本当にunixっていうレンタルやがあるぞ。
0915名無しさん@お腹いっぱい。2006/08/22(火) 13:52:53
>>914
もちろん実在することを知っているからこそ書いてる。
0916名無しさん@お腹いっぱい。2006/08/22(火) 20:36:31
タッパ…
0917名無しさん@お腹いっぱい。2006/08/23(水) 00:31:55
Solaris9/10なんですが、教えてください。

標準出力に数値を出力するプログラムがあり、その値を
シェルでexitしたいんですが、マイナス値でエラー"番号が正しくありません"になります。
簡単にいうと、エラーとなるのは↓のようなものです。

#/bin/sh
EXITVALUE=-1
exit ${EXITVALUE}

これ、Linuxではうまくいくんですが、Solarisではだめなんでしょうか?
0918名無しさん@お腹いっぱい。2006/08/23(水) 00:36:29
うまくいく方がおかしいので、おとなしく 0 から 255 までの数を使ってください。
0919名無しさん@お腹いっぱい。2006/08/23(水) 01:12:45
POSIX では 0 〜 255 までだっけ。
0920名無しさん@お腹いっぱい。2006/08/23(水) 07:21:59
>>917
Linuxというより、bashだと exitの値に勝手に mod 256をとった上で
符号なし8bitとみなした 0 〜 255の値になる模様。
なので、Solarisでもbashを使えば無問題。

あるいは、exit `expr \( ${EXITVALUE} + 256 \) % 256` かな。
0921名無しさん@お腹いっぱい。2006/08/23(水) 08:04:38
>>920
ありがとう。
今日環境使えたら試してみます。
0922名無しさん@お腹いっぱい。2006/08/23(水) 08:35:25
受け側で、`` で受ければいいんじゃないの?
0923名無しさん@お腹いっぱい。2006/08/23(水) 09:21:27
bash使ってもエラーにならなくなるだけで、親プロセスがexit statusとしてもらえる値は
そのコマンドが返した値の-1ではなくてmod 256した値の255に変化してしまうのだが、
それでいいのかね?
0924名無しさん@お腹いっぱい。2006/08/23(水) 09:43:03
>>922
`` で受けてる。
実際には、フォーマットが決まってるから、その後awkで切り出して、
それをEXITVALUEに代入しているけど。
で、その値がマイナスだとexitで怒られます。

>>922
呼び出し側は専用のアプリで、singned charとして扱っているから大丈夫だと
思われます。
09259172006/08/24(木) 00:21:43
>>920
今思えば質問も的を得ていないにもかかわらず、望んでいたのは
そういうレスでした。おかげでなんとかしのげました。
ありがとうございます。

他にもレスくれた人達、ありがとう!
0926名無しさん@お腹いっぱい。2006/08/24(木) 00:29:02
× 的を得る
○ 的を射る
○ 当を得る
○ 要を得る
0927名無しさん@お腹いっぱい。2006/08/26(土) 09:38:02
ttp://en.tldp.org/HOWTO/Reading-List-HOWTO/b80.html

Shell (as a programming language for more than trivial scripting) is dead.

シ ェ ル は 死 ん で い る
0928名無しさん@お腹いっぱい。2006/08/26(土) 10:55:13
>>927
ラリーウォールがperlの広告してる、ふう、それだけのこと
0929名無しさん@お腹いっぱい。2006/08/26(土) 17:06:11
それであってさえ、`trivial scripting' にはシェルスクリプトが最適なのを
認めてしまっている罠
0930名無しさん@お腹いっぱい。2006/08/28(月) 10:44:12
1ヶ月後までにやっとかなきゃいけないこと(でもできればその直前くらいがいいこと)を、
自分のメールアドレスにお知らせしてくれるリマインダーを書きたいんだけど、
どっから手を付けていいのやら。
0931名無しさん@お腹いっぱい。2006/08/28(月) 10:50:23
at
0932名無しさん@お腹いっぱい。2006/08/28(月) 20:59:48
アッー!
0933名無しさん@お腹いっぱい。2006/08/29(火) 05:35:33
>>930
Google Calendar
0934名無しさん@お腹いっぱい。2006/08/30(水) 15:21:50
bashでバックグラウンドジョブが終わったときの
[1]+  Done                    kterm
を表示させなくするにはどうすればいいんでしょうか?
0935名無しさん@お腹いっぱい。2006/08/30(水) 15:25:59
モニタを破壊する
0936名無しさん@お腹いっぱい。2006/08/30(水) 15:30:10
rm `which bash`
0937名無しさん@お腹いっぱい。2006/08/30(水) 15:34:30
>>934
(command &) みたいに、サブシェルを1段かましてバックグラウンドにする。

>>935 >>936 氏ね。
09389342006/08/30(水) 15:49:15
>>937
ありがとうございます。
0939名無しさん@お腹いっぱい。2006/08/30(水) 15:58:36
ふつう、disown じゃね?
bash だと、&! や、&| って無いのかな?
0940名無しさん@お腹いっぱい。2006/08/30(水) 16:11:29
>>939
disownだと、bashを含む一部のシェルのみに依存した方法になるから、
ashでも使える >>937 を尊重したい。
0941名無しさん@お腹いっぱい。2006/08/30(水) 16:22:59
>>939
disownだと、コマンド起動直後の [1] 1234 みたいなジョブ/プロセス番号の
表示までは消せない、という話しもある。

&! は zsh依存だな。
0942名無しさん@お腹いっぱい。2006/09/01(金) 01:16:16
対話的に使っているとき、bash(というかbsh系)で標準エラー出力を
簡単に捕まえる方法ってありますか?

hogehoge 2>&1 | less

とか打つの面倒なので、

hogehoge |& less

とcsh系のみたいな簡略系がないかなと思うんですが。cshは
あらゆるところがヘボイけど、これだけはうれしい。zsh使え?
0943名無しさん@お腹いっぱい。2006/09/01(金) 06:47:08
>hogehoge 2>&1 | less
画面に表示するだけなら、2>&1はいらないわけだが。
0944名無しさん@お腹いっぱい。2006/09/01(金) 08:07:00
>>942
自分で答え書いてるけど、zsh使えばいいんじゃない。
ちなみに、オレは hoge 2>&1 | less と打つのが苦にならない(もう指が覚えてる)。
0945名無しさん@お腹いっぱい。2006/09/01(金) 08:46:07
>>942
マンドイってたった2文字の差じゃ‥‥
0946名無しさん@お腹いっぱい。2006/09/01(金) 09:29:16
>>944
漏れも同じ。zshでも2>&1って打ってることが多い。

これより101キーバインドと106/109キーバインドの差の方が引っかかりやすい。
0947名無しさん@お腹いっぱい。2006/09/01(金) 10:16:31
日本語キーでも必ず英語配列で使う。(&はSHIFT+7)
最近は英語配列キーボードが入手困難で困るなぁ。
0948名無しさん@お腹いっぱい。2006/09/01(金) 12:33:33
>q hogehoge | less

qはエイリアスでも関数でも、実行プログラムででも適当にこさえる。
0949名無しさん@お腹いっぱい。2006/09/01(金) 12:37:13
q() { "$@" 2>&1;} でいいね。
0950名無しさん@お腹いっぱい。2006/09/01(金) 12:52:08
>>947
私は日本語キーボードを英語配列で使うと「\」が「:」の隣に来て押しやすいので
まともな英語配列キーボードより好きだったりします。どうせキートップなんて
見ないし。
0951名無しさん@お腹いっぱい。2006/09/01(金) 13:14:52
英語配列は、:がshift要求するから嫌だ。
0952名無しさん@お腹いっぱい。2006/09/01(金) 14:21:55
>>951
http://とかがshift押さないといけないからダメ
という理由で日本語配列を薦めてた人がいたな。
0953名無しさん@お腹いっぱい。2006/09/01(金) 16:27:29
俺はカッコが1つずれてさえいなければどっちでも良いんだがな…
JISキーボードを作った人はなんでわざわざずらしたんだろう。
0954名無しさん@お腹いっぱい。2006/09/01(金) 17:16:35
逆だ。
英語配列が変態配列なんだよ。
0955名無しさん@お腹いっぱい。2006/09/01(金) 17:34:18
>>953
カッコって"(" と ")" のことかい?

JISキーボードのShift+数字の部分は,
数字のJIS(ASCII)コード - 0x10
になるように配置されている.

気持としては 0x21 から 0x2f までの範囲のコードは
shift+<0x31 から 0x3f までのキー>
でコード化したかったのではあるまいか?
一部逆転してるけど...

このほうがハードだけでコード化するのが楽.

大昔のやつさがせば shift+0 でスペースを出力する
キーボードがあったかも知れない.

どっちかって言うと, USキーの方が不思議な並び.

タイプライターってどんな並びだったんだっけ?
0956名無しさん@お腹いっぱい。2006/09/01(金) 19:34:23
昔のタイプライターだと、ゼロとイチはなくて、ゼロは大文字のオー(O)、
イチは小文字のエル(l)を使っていた。
0957名無しさん@お腹いっぱい。2006/09/01(金) 19:35:50
( ・∀・)つ〃∩ ヘェーヘェーヘェー
0958名無しさん@お腹いっぱい。2006/09/02(土) 22:53:37
英語キーボードは今も昔と同じぐらい普通に売ってる気がする。
いや20年前のことはしらないが。
0959名無しさん@お腹いっぱい。2006/09/02(土) 22:58:26
>>958
売ってるとこ教えて。ちなみに近所のPC量販店では皆無。
ネット通販でも見かけない。

あと、HHKもパスでお願い。フルサイズのが欲しいので。
0960名無しさん@お腹いっぱい。2006/09/02(土) 23:54:28
「キーボード」でググるだけで相当でてくるが。。。
0961名無しさん@お腹いっぱい。2006/09/03(日) 01:21:47
84のことを言っているのか101の事を言っているのか整理してみようか
ttp://www.pfu.fujitsu.com/hhkeyboard/kb_collection/index.html
漏れは昔のomnikeyが欲しい
0962名無しさん@お腹いっぱい。2006/09/03(日) 02:43:10
これがOMNIの正当なる後継 俺は今使っている。
http://www.cvtinc.com/products/keyboards/menu.htm
0963名無しさん@お腹いっぱい。2006/09/03(日) 09:30:06
>>960
それだとS/N比が非常に悪いですが。。

>>961
HHK系はパスだとおっしゃってますが。。
0964名無しさん@お腹いっぱい。2006/09/03(日) 09:51:54
urlだけ見て喋るなカス
0965名無しさん@お腹いっぱい。2006/09/03(日) 09:54:04
キーボードが{こわれた,タッチが気に入らない}ので、
ちょっと近所の **{電気,無線,カメラ}まで行って
英語キーボード買ってくるか、と思った場合、
5-6年前なら売ってたけど、今は日本語キーしか売ってないよ。
キーボードは現物触ってからじゃないと買いにくいし、
確かに困るね。
0966名無しさん@お腹いっぱい。2006/09/03(日) 10:11:48
はいはい、引っ越した引っ越した

Keyboard キーボード 2
http://pc8.2ch.net/test/read.cgi/unix/1055904385/
0967名無しさん@お腹いっぱい。2006/09/03(日) 10:38:53
うちの庭に埴輪の鶏がいる。
0968名無しさん@お腹いっぱい。2006/09/03(日) 12:54:22
家に埴輪鶏がいる。
0969名無しさん@お腹いっぱい。2006/09/03(日) 18:53:05
シェルスクリプト用(/bin/sh)のlintみたいなのあったら教えてください。
0970名無しさん@お腹いっぱい。2006/09/03(日) 19:54:26
sh -n
0971名無しさん@お腹いっぱい。2006/09/03(日) 19:56:57
>>970
できました。どうもありがとうございました。
0972名無しさん@お腹いっぱい。2006/09/03(日) 23:07:37
>>959
「英語 キーボード 価格」
でぐぐってみ?
スレ違いゴメソ。
0973名無しさん@お腹いっぱい。2006/09/06(水) 10:48:16
bashでshellscriptを書いています。

scpする前に、ネットワーク上のサーバにscp可能かどうかを
確認するif文などは可能でしょうか。
この意味ではsshもscpも等価だと思うので
例えばsshをtryしてみてログイン可能だったら次にすすむ、
という感じで可能でしょうか?
0974名無しさん@お腹いっぱい。2006/09/06(水) 10:55:11
>>973
不可能。

↓はい、次の方どうぞ。
レス数が950を超えています。1000を超えると書き込みができなくなります。