シェルスクリプト総合 その20
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2012/06/08(金) 00:35:51.19スクリプトのお勉強・自慢・腕試しなどにどうぞ。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その19
http://toro.2ch.net/test/read.cgi/unix/1323515200/
0325名無しさん@お腹いっぱい。
2012/07/19(木) 10:50:31.770326名無しさん@お腹いっぱい。
2012/07/19(木) 11:54:23.00NFSだと違うくね?
0327名無しさん@お腹いっぱい。
2012/07/19(木) 11:55:45.52全員closeするまでunlinkされないよ
0328名無しさん@お腹いっぱい。
2012/07/19(木) 12:10:15.79ディレクトリからunlinkはされるけど
closeするまで実体は隠れたところに残ってる、が正しい
0329名無しさん@お腹いっぱい。
2012/07/19(木) 12:13:46.170330名無しさん@お腹いっぱい。
2012/07/19(木) 12:14:14.270331名無しさん@お腹いっぱい。
2012/07/19(木) 12:24:14.27いや、renameじゃなくてunlink。ディレクトリ上にはどこにも存在しない。
0332名無しさん@お腹いっぱい。
2012/07/19(木) 13:47:29.51NFSだとサーバ実装にもよるんだけど、
オープンされてるファイルをunlinkすると.nfsXXXというパス名にして、
ls -aなら見えるタイプの実装があるね。
本家のSunOSがそうだった。
今時の商用NASは見えないのが多い。
0333名無しさん@お腹いっぱい。
2012/07/19(木) 17:24:45.23ファイルシステムとして壊れた状態かどうかはOS側の解釈に過ぎない。
unlinkして実体を解放しないまま何らかの原因で強制ummountされたら、
fsck_msdosfs(FreeBSD)またはfsck.msdos(Linux)で修復できる。
通常のUNIXのファイルシステムのfsckの場合ととくに変わらない。
0334名無しさん@お腹いっぱい。
2012/07/19(木) 18:18:26.99最近のLinuxのNFSサーバも同じ挙動をする
NFSv3かv4の仕様なんだと思ってた
0335名無しさん@お腹いっぱい。
2012/07/19(木) 18:28:40.79NFSは仕様上、ファイルサーバがクラッシュした後、再起動すれば、
クライアントがオープンしていたファイルについて問題なく処理を続行できる必要がある。
そのため、回収されてしまわないようピン止めしているだけ。
商用NASでは.nfsXXXではなく不揮発メモリ上の内部DBに格納して保存している。
0336名無しさん@お腹いっぱい。
2012/07/19(木) 20:42:29.05ディレクトリから消えるだけっしょ
0337名無しさん@お腹いっぱい。
2012/07/19(木) 20:57:26.28お前は何を言ってるんだ?
0338名無しさん@お腹いっぱい。
2012/07/19(木) 21:11:53.31十分お楽しみいただけましたか?
それでは次の方どうぞ
↓
0339名無しさん@お腹いっぱい。
2012/07/19(木) 21:46:23.950340名無しさん@お腹いっぱい。
2012/07/20(金) 23:28:32.13a
b
c
1
2
3
下のようになるコマンドってありますか
a1
b2
c3
0341名無しさん@お腹いっぱい。
2012/07/20(金) 23:31:16.63paste
0342名無しさん@お腹いっぱい。
2012/07/20(金) 23:31:53.260343名無しさん@お腹いっぱい。
2012/07/21(土) 08:02:00.38しかも「つ」とか恥ずかしい文字使ってwww
0344名無しさん@お腹いっぱい。
2012/07/21(土) 08:09:55.50補足すると、デリミタを空文字にするようにオプション付けてね。
paste -d '' file1 file2
0345名無しさん@お腹いっぱい。
2012/07/21(土) 15:59:34.92ありがとうございました、望み通りのものです
0346名無しさん@お腹いっぱい。
2012/07/21(土) 16:48:21.35ppid指定で子プロセスの累積値を出すオプション等ありますか?
軽いプロセスをループで呼び続けてるものがcpu%でソートした場合
浮かんで来ないというのを解決するのが目的です
psを利用してppid指定で自前っていうのをやってみようかと思いましたが
それだと、目的の物がpsに出てくる間隔で呼び続ける必要になりそうなので
「軽いプロセスを呼び続ける」ものを監視したいっていう目的に反してるなと・・
0347名無しさん@お腹いっぱい。
2012/07/21(土) 21:03:14.45Linuxなら、psに S オプションを付けると子プロセスのCPU時間が親に加算されるけど。
0348名無しさん@お腹いっぱい。
2012/07/21(土) 21:28:04.70マウスが反応しません。あ、マウス自体は動いてるんですがクリックしても
何もなりません。タスクバーとかはどうやって出すんですか?
0349名無しさん@お腹いっぱい。
2012/07/21(土) 21:36:58.32というかシェルスクリプトか?
0350名無しさん@お腹いっぱい。
2012/07/21(土) 23:15:22.590351名無しさん@お腹いっぱい。
2012/07/22(日) 03:02:09.25gnomeとかcdeとかのウインドウマネージャやデスクトップ環境を起動しないと使えないよ。
0352名無しさん@お腹いっぱい。
2012/07/23(月) 21:56:01.860353名無しさん@お腹いっぱい。
2012/07/23(月) 22:11:18.530354名無しさん@お腹いっぱい。
2012/07/23(月) 22:21:56.210355名無しさん@お腹いっぱい。
2012/07/24(火) 00:34:24.030356名無しさん@お腹いっぱい。
2012/07/24(火) 00:36:18.470357名無しさん@お腹いっぱい。
2012/07/24(火) 23:56:17.62xinitrcを書きたい。それってシェルスクリプトみたいなもんだろ?
ってのがいいたいんじゃないの?352は。
ちがうのかなあ。
0358名無しさん@お腹いっぱい。
2012/07/25(水) 03:21:11.56352 はよく有るコピペだろ。
「質問者のくせに偉そうに!」を引き出す為の、第三者によるあおりだからスルー推奨。
0359名無しさん@お腹いっぱい。
2012/07/25(水) 21:35:30.31おう、そうか。スルーしよう。ありがとう。
0360名無しさん@お腹いっぱい。
2012/07/27(金) 20:48:33.81思うんだけど、どうしたらいいでしょか
0361名無しさん@お腹いっぱい。
2012/07/27(金) 20:52:17.05((コマンド 2>&1 1>&3) | grep hoge) 3>&1
0362名無しさん@お腹いっぱい。
2012/07/28(土) 03:58:28.71なるほど
いろいろできるもんだな
0363名無しさん@お腹いっぱい。
2012/07/28(土) 07:49:40.420364名無しさん@お腹いっぱい。
2012/07/28(土) 07:56:32.300365名無しさん@お腹いっぱい。
2012/07/28(土) 09:41:50.79サブシェルが1個無駄です。
(コマンド 2>&1 1>&3 | grep hoge) 3>&1
---
サブシェルなしにもできます。
exec 3>&1
コマンド 2>&1 1>&3 | grep hoge
0366名無しさん@お腹いっぱい。
2012/07/28(土) 10:07:31.29なるほど
いろいろできるもんだな
0367名無しさん@お腹いっぱい。
2012/07/28(土) 10:11:09.01若ハゲチッス
0368名無しさん@お腹いっぱい。
2012/07/28(土) 11:36:30.410369名無しさん@お腹いっぱい。
2012/07/28(土) 11:45:46.68興味本位で聞いただけかよ。無礼な奴だ。
0370名無しさん@お腹いっぱい。
2012/07/28(土) 12:12:34.03「コンピュータにはいろんなシェルがある。みんなの知ってるシェルを1つずつ
挙げていこう。誰かわかる人?」と先生が言った。
エクスプローラは真っ先に答えられた。
誰かがGNOMEと答えたが、先生はNautilusと修正して黒板に書いた。
command.comという声も挙がった。
そのあと隣の奴がDOS窓と答えた。
すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。
キミの答えはここに既に含まれているという、ちょっと屈辱的な対応だ。
満を持してボクは手を挙げて答えた。「bash」
すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。
0371名無しさん@お腹いっぱい。
2012/07/28(土) 12:26:54.24オチが分からん。解説よろ
0372名無しさん@お腹いっぱい。
2012/07/28(土) 12:32:16.230373名無しさん@お腹いっぱい。
2012/07/28(土) 15:36:27.50if ! ERROR=$(command 2>&1);then
exit 1
fi
で、commandが正常終了しても、successedなどのメッセージが返されて
全て、if中に入ってしまいます。
ERRORにディスクリプト1番を入れようにするには、どうすれば良いですか?
0374名無しさん@お腹いっぱい。
2012/07/28(土) 15:38:36.280375名無しさん@お腹いっぱい。
2012/07/28(土) 15:50:27.43こっちの環境で試したら、commandが正常終了の時はif文の中に入らず、
メッセージはすべて $ERRORに代入されてたけど。
0376名無しさん@お腹いっぱい。
2012/07/28(土) 15:57:24.140377373
2012/07/28(土) 16:33:01.71if ! ERROR=$(genext2fs -b $IMAGESIZE -i $BYTEINODE -d $ROOTFS $IMAGENAME 2>&1);then
error "E: $ERROR"
cleanup
fi
E:successed で、cleanup 終了してるみたいで
本当にここか確かめては無いんですが、
0378名無しさん@お腹いっぱい。
2012/07/28(土) 16:47:30.02$ if ! ERROR=$(echo test; true); then echo "$ERROR"; fi
$ if ! ERROR=$(echo test; false); then echo "$ERROR"; fi
test
$
0379名無しさん@お腹いっぱい。
2012/07/28(土) 17:09:30.140380名無しさん@お腹いっぱい。
2012/07/28(土) 17:26:15.70$ ERROR=`echo test; true` || echo "$ERROR"
$ ERROR=`echo test; false` || echo "$ERROR"
test
$
0381名無しさん@お腹いっぱい。
2012/07/28(土) 17:59:00.490382名無しさん@お腹いっぱい。
2012/07/28(土) 20:55:59.070383名無しさん@お腹いっぱい。
2012/07/28(土) 21:59:11.380384名無しさん@お腹いっぱい。
2012/07/28(土) 22:06:33.76(( )) とか [[ ]] とか <<< とかもどんどん使うべきだな。
使えないのはashだけだし。
0385名無しさん@お腹いっぱい。
2012/07/28(土) 22:13:28.29せっかく作者が用意してくれた機能なんだし。
0386名無しさん@お腹いっぱい。
2012/07/28(土) 22:18:09.180387名無しさん@お腹いっぱい。
2012/07/28(土) 22:36:30.01そいつらはPOSIXで定義されてるの?
0388名無しさん@お腹いっぱい。
2012/07/28(土) 22:39:14.340389名無しさん@お腹いっぱい。
2012/07/29(日) 03:16:10.95http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
0390名無しさん@お腹いっぱい。
2012/07/29(日) 08:10:37.46か、
・純shに合わせる
かの2択。(posix(笑)は現実的じゃないから判断基準にならない)
ashはどっち付かずの中途半端。ashに合わせるくらいなら純shに合わせとけ。
あと、ashで仕様の違う「let」コマンドを廃止しろ。
0391名無しさん@お腹いっぱい。
2012/07/29(日) 08:18:36.31・好きなシェルで単に動くものを作る
ってのもあるだろ。ポータビリティが全く必要ない場合とか。
0392名無しさん@お腹いっぱい。
2012/07/29(日) 08:36:22.88>( ) とか <( ) って、Bash方言かと思ってたが
zshでもkshでも使えることに今気づいたよ。
こりゃ堂々と使っていいな。
0393377
2012/07/29(日) 09:15:42.62E: genext2fs: output filesystem image: Success
この場合、結果を標準エラーのみにするには、どうすれば良いですか?
0394名無しさん@お腹いっぱい。
2012/07/29(日) 09:19:54.80もしかして genext2fsって正しいexit statusを返さないんじゃないの?
標準エラーのみにするには、
if ! ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null); then
..略..
2>&1 と 1>/dev/null の順序を逆にしないこと。(逆で覚えやすいので)
0395名無しさん@お腹いっぱい。
2012/07/29(日) 09:27:49.340396名無しさん@お腹いっぱい。
2012/07/29(日) 09:29:52.830397名無しさん@お腹いっぱい。
2012/07/29(日) 09:44:58.55終了ステータスでの判定を一切やめて、標準エラーの文字列でのみ判定すれば?
ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null)
if [ -n "$ERROR" ]; then
echo "$ERROR"
fi
0398名無しさん@お腹いっぱい。
2012/07/29(日) 10:21:14.14じゃあさ。
> bash/zsh/kshの共通項に合わせる
これどこにあるんだよ。無いならそれは現実的じゃないって事だよな。
0399名無しさん@お腹いっぱい。
2012/07/29(日) 10:37:10.90bash/zsh/kshの「現物」があるじゃん。
実際に実行させてチェックできる。
一方、POSIXはPOSIX通りに実装した現物がない。
実際に実行させてチェックできない。
0400名無しさん@お腹いっぱい。
2012/07/29(日) 10:56:34.720401名無しさん@お腹いっぱい。
2012/07/29(日) 11:02:57.050402名無しさん@お腹いっぱい。
2012/07/29(日) 11:14:50.01> bash/zsh/kshの「現物」があるじゃん。
> 実際に実行させてチェックできる。
ぷぷぷ、作るときは3つのマニュアル全部読みながら共通項を
拾い出して、作って動いて、おーけい、おーけい。
0403名無しさん@お腹いっぱい。
2012/07/29(日) 11:35:07.430404名無しさん@お腹いっぱい。
2012/07/29(日) 11:38:14.680405名無しさん@お腹いっぱい。
2012/07/29(日) 11:46:03.68煽るようなことか? あ、初心者だからマニュアル読むこと自体苦痛な人?
他にも、grepとか、findとか、OSによってオプションが違うコマンドは結構あるので
複数のOSのマニュアルをすぐに見られるようにしてある。
プロなら当然だよな。
0406名無しさん@お腹いっぱい。
2012/07/29(日) 12:15:51.33POSIXがAND取ってくれてるんだからそれを使えばいいのに。
0407名無しさん@お腹いっぱい。
2012/07/29(日) 12:19:09.97POSIXがAND取ってくれてた机上の空論では
実際のシェルは動かないんだよ、素人さん。
0408名無しさん@お腹いっぱい。
2012/07/29(日) 12:19:25.100409名無しさん@お腹いっぱい。
2012/07/29(日) 12:21:49.120410名無しさん@お腹いっぱい。
2012/07/29(日) 12:24:48.99動くよ。動かないというなら実例を挙げる事。
0411名無しさん@お腹いっぱい。
2012/07/29(日) 12:26:37.54どれも最新のバージョンを使うこと前提?
0412名無しさん@お腹いっぱい。
2012/07/29(日) 12:27:00.63>>403
0413名無しさん@お腹いっぱい。
2012/07/29(日) 12:32:10.32通信業界さんも夏休みですか?
0414名無しさん@お腹いっぱい。
2012/07/29(日) 12:43:31.16降参ですか?
0415名無しさん@お腹いっぱい。
2012/07/29(日) 12:49:36.170416名無しさん@お腹いっぱい。
2012/07/29(日) 12:51:26.75見たことないので、/usr/srcにgrepかけてみたが、cddl/contrib/opensolarisの
下の.kshスクリプトに多数、contrib/amd/scriptsに一つ。
どこでこれを見たんだい?
> posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
0417名無しさん@お腹いっぱい。
2012/07/29(日) 12:51:49.11覆すにはPOSIX通りに実装したシェルを作って持って来い。
(上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
0418名無しさん@お腹いっぱい。
2012/07/29(日) 12:53:59.46(上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
0419名無しさん@お腹いっぱい。
2012/07/29(日) 12:56:27.23直接存在しなくても現物シェルのANDで表せるんだからOK。
POSIXの場合は現物シェルのANDでも表せない。
0420名無しさん@お腹いっぱい。
2012/07/29(日) 13:16:53.94> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
それともAND規格でのみ動作するとかいうスイッチでもあるのか?
0421名無しさん@お腹いっぱい。
2012/07/29(日) 13:22:40.49自称プロ(夏休み中)はスルーでよくねえか
0422名無しさん@お腹いっぱい。
2012/07/29(日) 13:25:05.75POSIXの場合は現物シェルのANDでも表せないので、
持ってくるとしたら上位互換しかなくなる。それじゃダメと言ってるだけ。
bash/zsh/kshは現物シェルのANDで表せる。
実践的には、scriptを書いた後に
$ bash script
$ zsh script
$ ksh script
でチェックできる。これが実際にANDを取ると言うことだ。
POSIXではそれができない。
0423名無しさん@お腹いっぱい。
2012/07/29(日) 13:28:30.18/bin/sh主義の私はどうすればいいでしょうか??
/bin/sh主義的にもposixは糞であることに同意ですが。
0424名無しさん@お腹いっぱい。
2012/07/29(日) 13:33:07.06家内制手工業のプロさん。
> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
■ このスレッドは過去ログ倉庫に格納されています