シェルスクリプト総合 その6
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001うはwwwww
2006/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 でトレースしましょう。
0869名無しさん@お腹いっぱい。
2006/08/17(木) 16:40:48date -u +%s -d 20060817
0870名無しさん@お腹いっぱい。
2006/08/17(木) 16:42:311155740400
0871名無しさん@お腹いっぱい。
2006/08/17(木) 16:42:49date -j -f "%Y%m%d%H%M%S" 20060817000000 +%s
0872名無しさん@お腹いっぱい。
2006/08/17(木) 16:42:50date +%s -d 20060817
0873名無しさん@お腹いっぱい。
2006/08/17(木) 17:23:45・その文法しか知らないから
・その文法をサポートしている OS でしか動かす予定がないから
・その文法をサポートしてない /bin/sh を持つ OS への嫌がらせ
のいずれか
0874名無しさん@お腹いっぱい。
2006/08/17(木) 17:28:15で、>>864 は、>>866 的な exportと代入を同時にやる bash依存文法に反対する意味をこめて
あえて1行で書いてるんだと思う。
でも、俺的には
HOGE=hoge
HAGE=hage
export HOGE HAGE
↑の書き方が好み。
0875868
2006/08/17(木) 18:07:27869,870は無理だった
871でおk FreeBSD
0876名無しさん@お腹いっぱい。
2006/08/17(木) 18:17:31export VAR=value
をbash依存文法とする根拠を述べよ。
0877名無しさん@お腹いっぱい。
2006/08/17(木) 18:34:09「bashで使えて Bourne shで使えないから」そのままやん。
先に言っとくと、*BSDのsh=ash≠Bourne shだからね。
0878名無しさん@お腹いっぱい。
2006/08/17(木) 18:37:17やれやれ。最近は export VAR=value がbash依存文法であることも知らない新参者が多いのう。
0879名無しさん@お腹いっぱい。
2006/08/17(木) 18:48:280880名無しさん@お腹いっぱい。
2006/08/17(木) 19:50:30bash依存というより、ksh依存といった方が正しい。
0881名無しさん@お腹いっぱい。
2006/08/17(木) 20:06:58立場をわきまえないと。
0882名無しさん@お腹いっぱい。
2006/08/17(木) 22:22:58"export var=value"という書き方はPOSIXシェルで有効な文法で、
bash依存の仕様と言うわけではない。
SolarisではkshはPOSIXとの互換性を使いたい場合のシェルで、
/bin/shは上記文法を受け付けず、POSIXに準拠しない。
0883名無しさん@お腹いっぱい。
2006/08/18(金) 00:24:41POSIXくらいは確認してから書こうな。テンプレにも入れてあるんだし。
0884名無しさん@お腹いっぱい。
2006/08/18(金) 00:47:04POSIXよりも、「/bin/shで使える文法かどうか」の方が重要。
0885名無しさん@お腹いっぱい。
2006/08/18(金) 01:17:060886名無しさん@お腹いっぱい。
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:230888名無しさん@お腹いっぱい。
2006/08/18(金) 07:57:410889名無しさん@お腹いっぱい。
2006/08/18(金) 08:11:18Linux(の多くのディストロ)は標準をbashと決めているから、そういうものとして理解すればいいが、
*BSDの/bin/shはそれぞれで勝手に拡張されているし、バージョンによってコロコロ変わってたりするから、
わかりにくい。
0890名無しさん@お腹いっぱい。
2006/08/18(金) 08:14:410891名無しさん@お腹いっぱい。
2006/08/18(金) 08:31:30やはり/bin/shで何とかするのが心意気というものであろう
0892名無しさん@お腹いっぱい。
2006/08/18(金) 11:31:480893名無しさん@お腹いっぱい。
2006/08/18(金) 17:59:00でも設定出来るのになんでセミコロン入れるんだろ?
0894名無しさん@お腹いっぱい。
2006/08/18(金) 18:05:10古いシェルだと、内部コマンドに対して HOGE=hoge のような変数の指定が
うまく動作しないものがある。だから ; を入れるのが吉。
0895名無しさん@お腹いっぱい。
2006/08/18(金) 18:10:06exportという1コマンドに対してのみ一時的に HOGE=hogeという環境変数を設定する、
という動作が本来の仕様なのだから、
HOGE=hoge export HOGE (セミコロンなし)でもexportできてしまう方がバグと思われる。
(古いシェルの動作が正しい)
たとえば、
HOGE=hoge printenv HOGE
だと、printenvコマンドではhogeが表示されるが、
その後はHOGEは未設定になる動作が正しい。exportでもそうなるべきだ。
0896名無しさん@お腹いっぱい。
2006/08/19(土) 05:48:58うちは昔からこうやってるなんて言いだす傲慢さは無い。
最古参のBSDは困ったちゃん。
0897名無しさん@お腹いっぱい。
2006/08/19(土) 08:01:41LinuxはPOSIXに準拠してないよ。拠り所は GNU。
GNUの独自拡張だろうが、GNUで使えれば事実上の標準になってる。
0898名無しさん@お腹いっぱい。
2006/08/19(土) 09:03:50そういって、95年当時にLinusが事務処理にはWindowsを使っ
ていたことは公然の秘密だ。
0899名無しさん@お腹いっぱい。
2006/08/19(土) 09:18:08POSIX準拠なのはLinuxだけじゃないし、opengroupのUNIX認証を通ってないから
結局のところPOSIX準拠であることを第三者に証明できない。
優等生ってのは言い過ぎじゃないかなあ。
>>897
「GNUで使えれば」ってどういう意味よ? 説明してみて。
0900名無しさん@お腹いっぱい。
2006/08/19(土) 14:21:52UNIX認証を受けてない、メンバーにも入れてもらえない。
もしUNIX認証を受けるにしてもデストリごどになる。
linuxにUNIXを実装する事自体は容易、ほぼそのままでもいけるか。
現状はlinuxである方が有理なのでUNIX認証にはあまり興味が無い。
linuxはlinux認証を立ち上げた。
0901名無しさん@お腹いっぱい。
2006/08/20(日) 00:57:46exportが、値を何というか環境に担ぎ出して固定する
ようなイメーヅだと思えば不思議じゃない。
$ HOGE=hoge HOGE=hoge
とやった後にHOGE=hogeに設定される、
そういう効果をもともと持つコマンドがexportってこと。
0902名無しさん@お腹いっぱい。
2006/08/20(日) 03:54:31> もしUNIX認証を受けるにしてもデストリごどになる。
ほほう、UNIX認証を受けたLinuxディストリビューションが
1つでも存在するのならば知りたいものだね。興味がある。
で、「Linux認証」なるものが仮に標準たりうるとしても、
それは>>896の言う「BSDの権威」とどう違うのよ?という話。
0903名無しさん@お腹いっぱい。
2006/08/20(日) 13:15:370904名無しさん@お腹いっぱい。
2006/08/20(日) 14:05:04たぶん失敗する、なんら権威の根拠とはならないだろう。
今linuxにおける権威はRedHat、Debian、Fedora、そしてリーナスである。
一見上層に見える色々なlinux関連団体は実はなんら支配力も実効力も持っていない。
Fedoraを怒らせたらStallmanだって追放されるだろうよ。
StallmanはFedoraを抱き込んでxFree86を追放した、そういう権力構造。
>>902
その前にunixの会員になるのにいくら金積めばいいのか教えてくれ。
0905名無しさん@お腹いっぱい。
2006/08/20(日) 15:48:52追放が可能なためには、まずは所属してないと。
0906名無しさん@お腹いっぱい。
2006/08/20(日) 20:10:26UNIX認証とは違う話をしているようだけど、
「unixの会員になる」というのが何を指すのか説明して。
>>905
彼の妄想世界では可能なんだよ、きっと。
0907名無しさん@お腹いっぱい。
2006/08/21(月) 08:35:36「-行数」をデフォルトで受け付けたりやめたりとずいぶん揺れてるね。
このへんはPOSIX 1003.2-1992かPOSIX 1003.1-2001かで違うみたいだ。
0908名無しさん@お腹いっぱい。
2006/08/21(月) 09:34:220909名無しさん@お腹いっぱい。
2006/08/21(月) 15:45:35きっと美容院のことだよ。
ご紹介システムを利用すれば、1000円分のポイントもらえるよ。
0910名無しさん@お腹いっぱい。
2006/08/21(月) 16:12:59レンタル・ビデオ屋UNIXの会員になるってことじゃないかな。
0911名無しさん@お腹いっぱい。
2006/08/21(月) 16:24:16そのexportの解釈でもちょっと苦しいね。
あと、別の例だけど、
$ HOGE=hoge unset hoge
$ echo $HOGE
hoge
↑unsetされてない。
これはどう解釈する?
やっぱバグだろ。
0912911
2006/08/21(月) 16:35:48$ HOGE=hoge unset HOGE
$ echo $HOGE
hoge
この現象が起きるのはシェルの種類によるかも。
もちろん、セミコロンを入れて
$ HOGE=hoge; unset HOGE
ならちゃんと unsetされる。
何が言いたいかというと、元の話題の HOGE=hoge; export HOGE の時、
念のためセミコロンを入れろということ。
0913名無しさん@お腹いっぱい。
2006/08/21(月) 21:25:46その言い方からすると、そのウンコシェルでもexportは効くんでしょ?
0914名無しさん@お腹いっぱい。
2006/08/22(火) 13:34:42ウチの近くに本当にunixっていうレンタルやがあるぞ。
0915名無しさん@お腹いっぱい。
2006/08/22(火) 13:52:53もちろん実在することを知っているからこそ書いてる。
0916名無しさん@お腹いっぱい。
2006/08/22(火) 20:36:310917名無しさん@お腹いっぱい。
2006/08/23(水) 00:31:55標準出力に数値を出力するプログラムがあり、その値を
シェルでexitしたいんですが、マイナス値でエラー"番号が正しくありません"になります。
簡単にいうと、エラーとなるのは↓のようなものです。
#/bin/sh
EXITVALUE=-1
exit ${EXITVALUE}
これ、Linuxではうまくいくんですが、Solarisではだめなんでしょうか?
0918名無しさん@お腹いっぱい。
2006/08/23(水) 00:36:290919名無しさん@お腹いっぱい。
2006/08/23(水) 01:12:450920名無しさん@お腹いっぱい。
2006/08/23(水) 07:21:59Linuxというより、bashだと exitの値に勝手に mod 256をとった上で
符号なし8bitとみなした 0 〜 255の値になる模様。
なので、Solarisでもbashを使えば無問題。
あるいは、exit `expr \( ${EXITVALUE} + 256 \) % 256` かな。
0921名無しさん@お腹いっぱい。
2006/08/23(水) 08:04:38ありがとう。
今日環境使えたら試してみます。
0922名無しさん@お腹いっぱい。
2006/08/23(水) 08:35:250923名無しさん@お腹いっぱい。
2006/08/23(水) 09:21:27そのコマンドが返した値の-1ではなくてmod 256した値の255に変化してしまうのだが、
それでいいのかね?
0924名無しさん@お腹いっぱい。
2006/08/23(水) 09:43:03`` で受けてる。
実際には、フォーマットが決まってるから、その後awkで切り出して、
それをEXITVALUEに代入しているけど。
で、その値がマイナスだとexitで怒られます。
>>922
呼び出し側は専用のアプリで、singned charとして扱っているから大丈夫だと
思われます。
0925917
2006/08/24(木) 00:21:43今思えば質問も的を得ていないにもかかわらず、望んでいたのは
そういうレスでした。おかげでなんとかしのげました。
ありがとうございます。
他にもレスくれた人達、ありがとう!
0926名無しさん@お腹いっぱい。
2006/08/24(木) 00:29:02○ 的を射る
○ 当を得る
○ 要を得る
0927名無しさん@お腹いっぱい。
2006/08/26(土) 09:38:02Shell (as a programming language for more than trivial scripting) is dead.
シ ェ ル は 死 ん で い る
0928名無しさん@お腹いっぱい。
2006/08/26(土) 10:55:13ラリーウォールがperlの広告してる、ふう、それだけのこと
0929名無しさん@お腹いっぱい。
2006/08/26(土) 17:06:11認めてしまっている罠
0930名無しさん@お腹いっぱい。
2006/08/28(月) 10:44:12自分のメールアドレスにお知らせしてくれるリマインダーを書きたいんだけど、
どっから手を付けていいのやら。
0931名無しさん@お腹いっぱい。
2006/08/28(月) 10:50:230932名無しさん@お腹いっぱい。
2006/08/28(月) 20:59:480933名無しさん@お腹いっぱい。
2006/08/29(火) 05:35:33Google Calendar
0934名無しさん@お腹いっぱい。
2006/08/30(水) 15:21:50[1]+ Done kterm
を表示させなくするにはどうすればいいんでしょうか?
0935名無しさん@お腹いっぱい。
2006/08/30(水) 15:25:590936名無しさん@お腹いっぱい。
2006/08/30(水) 15:30:100937名無しさん@お腹いっぱい。
2006/08/30(水) 15:34:30(command &) みたいに、サブシェルを1段かましてバックグラウンドにする。
>>935 >>936 氏ね。
0939名無しさん@お腹いっぱい。
2006/08/30(水) 15:58:36bash だと、&! や、&| って無いのかな?
0940名無しさん@お腹いっぱい。
2006/08/30(水) 16:11:29disownだと、bashを含む一部のシェルのみに依存した方法になるから、
ashでも使える >>937 を尊重したい。
0941名無しさん@お腹いっぱい。
2006/08/30(水) 16:22:59disownだと、コマンド起動直後の [1] 1234 みたいなジョブ/プロセス番号の
表示までは消せない、という話しもある。
&! は zsh依存だな。
0942名無しさん@お腹いっぱい。
2006/09/01(金) 01:16:16簡単に捕まえる方法ってありますか?
hogehoge 2>&1 | less
とか打つの面倒なので、
hogehoge |& less
とcsh系のみたいな簡略系がないかなと思うんですが。cshは
あらゆるところがヘボイけど、これだけはうれしい。zsh使え?
0943名無しさん@お腹いっぱい。
2006/09/01(金) 06:47:08画面に表示するだけなら、2>&1はいらないわけだが。
0944名無しさん@お腹いっぱい。
2006/09/01(金) 08:07:00自分で答え書いてるけど、zsh使えばいいんじゃない。
ちなみに、オレは hoge 2>&1 | less と打つのが苦にならない(もう指が覚えてる)。
0945名無しさん@お腹いっぱい。
2006/09/01(金) 08:46:07マンドイってたった2文字の差じゃ‥‥
0946名無しさん@お腹いっぱい。
2006/09/01(金) 09:29:16漏れも同じ。zshでも2>&1って打ってることが多い。
これより101キーバインドと106/109キーバインドの差の方が引っかかりやすい。
0947名無しさん@お腹いっぱい。
2006/09/01(金) 10:16:31最近は英語配列キーボードが入手困難で困るなぁ。
0948名無しさん@お腹いっぱい。
2006/09/01(金) 12:33:33qはエイリアスでも関数でも、実行プログラムででも適当にこさえる。
0949名無しさん@お腹いっぱい。
2006/09/01(金) 12:37:130950名無しさん@お腹いっぱい。
2006/09/01(金) 12:52:08私は日本語キーボードを英語配列で使うと「\」が「:」の隣に来て押しやすいので
まともな英語配列キーボードより好きだったりします。どうせキートップなんて
見ないし。
0951名無しさん@お腹いっぱい。
2006/09/01(金) 13:14:520952名無しさん@お腹いっぱい。
2006/09/01(金) 14:21:55http://とかがshift押さないといけないからダメ
という理由で日本語配列を薦めてた人がいたな。
0953名無しさん@お腹いっぱい。
2006/09/01(金) 16:27:29JISキーボードを作った人はなんでわざわざずらしたんだろう。
0954名無しさん@お腹いっぱい。
2006/09/01(金) 17:16:35英語配列が変態配列なんだよ。
0955名無しさん@お腹いっぱい。
2006/09/01(金) 17:34:18カッコって"(" と ")" のことかい?
JISキーボードのShift+数字の部分は,
数字のJIS(ASCII)コード - 0x10
になるように配置されている.
気持としては 0x21 から 0x2f までの範囲のコードは
shift+<0x31 から 0x3f までのキー>
でコード化したかったのではあるまいか?
一部逆転してるけど...
このほうがハードだけでコード化するのが楽.
大昔のやつさがせば shift+0 でスペースを出力する
キーボードがあったかも知れない.
どっちかって言うと, USキーの方が不思議な並び.
タイプライターってどんな並びだったんだっけ?
0956名無しさん@お腹いっぱい。
2006/09/01(金) 19:34:23イチは小文字のエル(l)を使っていた。
0957名無しさん@お腹いっぱい。
2006/09/01(金) 19:35:500958名無しさん@お腹いっぱい。
2006/09/02(土) 22:53:37いや20年前のことはしらないが。
0959名無しさん@お腹いっぱい。
2006/09/02(土) 22:58:26売ってるとこ教えて。ちなみに近所のPC量販店では皆無。
ネット通販でも見かけない。
あと、HHKもパスでお願い。フルサイズのが欲しいので。
0960名無しさん@お腹いっぱい。
2006/09/02(土) 23:54:280961名無しさん@お腹いっぱい。
2006/09/03(日) 01:21:47ttp://www.pfu.fujitsu.com/hhkeyboard/kb_collection/index.html
漏れは昔のomnikeyが欲しい
0962名無しさん@お腹いっぱい。
2006/09/03(日) 02:43:10http://www.cvtinc.com/products/keyboards/menu.htm
0963名無しさん@お腹いっぱい。
2006/09/03(日) 09:30:06それだとS/N比が非常に悪いですが。。
>>961
HHK系はパスだとおっしゃってますが。。
0964名無しさん@お腹いっぱい。
2006/09/03(日) 09:51:540965名無しさん@お腹いっぱい。
2006/09/03(日) 09:54:04ちょっと近所の **{電気,無線,カメラ}まで行って
英語キーボード買ってくるか、と思った場合、
5-6年前なら売ってたけど、今は日本語キーしか売ってないよ。
キーボードは現物触ってからじゃないと買いにくいし、
確かに困るね。
0966名無しさん@お腹いっぱい。
2006/09/03(日) 10:11:48Keyboard キーボード 2
http://pc8.2ch.net/test/read.cgi/unix/1055904385/
0967名無しさん@お腹いっぱい。
2006/09/03(日) 10:38:530968名無しさん@お腹いっぱい。
2006/09/03(日) 12:54:22レス数が950を超えています。1000を超えると書き込みができなくなります。