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

シェルスクリプト総合 その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/
0349名無しさん@お腹いっぱい。2012/07/21(土) 21:36:58.32
xinitじゃなくてstartxでどうよ?
というかシェルスクリプトか?
0350名無しさん@お腹いっぱい。2012/07/21(土) 23:15:22.59
dwm入ってる?
0351名無しさん@お腹いっぱい。2012/07/22(日) 03:02:09.25
>>348
gnomeとかcdeとかのウインドウマネージャやデスクトップ環境を起動しないと使えないよ。
0352名無しさん@お腹いっぱい。2012/07/23(月) 21:56:01.86
すみませんが詳しい方のみ解答をお願いします。
0353名無しさん@お腹いっぱい。2012/07/23(月) 22:11:18.53
スレちがいの戯言は放置するスルーカを習得しよう。
0354名無しさん@お腹いっぱい。2012/07/23(月) 22:21:56.21
http://blogimg.goo.ne.jp/user_image/4e/fe/fff5e143159a2acaa462eb8ce1fa1977.jpg
0355名無しさん@お腹いっぱい。2012/07/24(火) 00:34:24.03
もしかして:ヤリイカ
0356名無しさん@お腹いっぱい。2012/07/24(火) 00:36:18.47
いや、モンゴウイカじゃね?
0357名無しさん@お腹いっぱい。2012/07/24(火) 23:56:17.62
>>353
xinitrcを書きたい。それってシェルスクリプトみたいなもんだろ?
ってのがいいたいんじゃないの?352は。
ちがうのかなあ。
0358名無しさん@お腹いっぱい。2012/07/25(水) 03:21:11.56
>>357
352 はよく有るコピペだろ。
「質問者のくせに偉そうに!」を引き出す為の、第三者によるあおりだからスルー推奨。
0359名無しさん@お腹いっぱい。2012/07/25(水) 21:35:30.31
>>358
おう、そうか。スルーしよう。ありがとう。
0360名無しさん@お腹いっぱい。2012/07/27(金) 20:48:33.81
標準出力はそのままに、標準エラー出力だけgrepかけたいとか
思うんだけど、どうしたらいいでしょか
0361名無しさん@お腹いっぱい。2012/07/27(金) 20:52:17.05
>>360
((コマンド 2>&1 1>&3) | grep hoge) 3>&1
0362名無しさん@お腹いっぱい。2012/07/28(土) 03:58:28.71
>>361
なるほど
いろいろできるもんだな
0363名無しさん@お腹いっぱい。2012/07/28(土) 07:49:40.42
興味本位で聞いただけかよ。無礼な奴だ。
0364名無しさん@お腹いっぱい。2012/07/28(土) 07:56:32.30
アスペさんちっす
0365名無しさん@お腹いっぱい。2012/07/28(土) 09:41:50.79
>>361
サブシェルが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
>>365
なるほど
いろいろできるもんだな
0367名無しさん@お腹いっぱい。2012/07/28(土) 10:11:09.01
>>366
若ハゲチッス
0368名無しさん@お腹いっぱい。2012/07/28(土) 11:36:30.41
すみませんが詳しい方のみ解答をお願いします。
0369名無しさん@お腹いっぱい。2012/07/28(土) 11:45:46.68
>>366
興味本位で聞いただけかよ。無礼な奴だ。
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
>>370
オチが分からん。解説よろ
0372名無しさん@お腹いっぱい。2012/07/28(土) 12:32:16.23
FreeBSDがLinuxに含まれるってやつのコピペだよ
0373名無しさん@お腹いっぱい。2012/07/28(土) 15:36:27.50
360じゃないんですが
if ! ERROR=$(command 2>&1);then
exit 1
fi
で、commandが正常終了しても、successedなどのメッセージが返されて
全て、if中に入ってしまいます。
ERRORにディスクリプト1番を入れようにするには、どうすれば良いですか?
0374名無しさん@お腹いっぱい。2012/07/28(土) 15:38:36.28
手作りと言ってお店のおにぎりを差し入れしてやったわ! フハハ!
0375名無しさん@お腹いっぱい。2012/07/28(土) 15:50:27.43
>>373
こっちの環境で試したら、commandが正常終了の時はif文の中に入らず、
メッセージはすべて $ERRORに代入されてたけど。
0376名無しさん@お腹いっぱい。2012/07/28(土) 15:57:24.14
ばかもん、commandの正体が何かを推察するエスパー検定じゃ。やり直し!
03773732012/07/28(土) 16:33:01.71
>374
if ! 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.14
$()はash依存だから禁止。 はいロンパー
0380名無しさん@お腹いっぱい。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.49
$()が使えないシェルなんて無視していい。
0382名無しさん@お腹いっぱい。2012/07/28(土) 20:55:59.07
ロンパー、ロンパー、ロンパー
0383名無しさん@お腹いっぱい。2012/07/28(土) 21:59:11.38
大手SIerでは$( )は使わないのが常識です。
0384名無しさん@お腹いっぱい。2012/07/28(土) 22:06:33.76
じゃあ、bashでもzshでもkshでも使える
(( )) とか [[ ]] とか <<< とかもどんどん使うべきだな。
使えないのはashだけだし。
0385名無しさん@お腹いっぱい。2012/07/28(土) 22:13:28.29
使えるならどんどん使っちゃえばいいと思うよ。
せっかく作者が用意してくれた機能なんだし。
0386名無しさん@お腹いっぱい。2012/07/28(土) 22:18:09.18
>( ) や <( ) は使っていいですか? posixでは使えませんが。
0387名無しさん@お腹いっぱい。2012/07/28(土) 22:36:30.01
>>384
そいつらはPOSIXで定義されてるの?
0388名無しさん@お腹いっぱい。2012/07/28(土) 22:39:14.34
(( )) は定義されてる
0389名無しさん@お腹いっぱい。2012/07/29(日) 03:16:10.95
されてねーよ。
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
0390名無しさん@お腹いっぱい。2012/07/29(日) 08:10:37.46
・bash/zsh/kshの共通項に合わせる

か、

・純shに合わせる

かの2択。(posix(笑)は現実的じゃないから判断基準にならない)
ashはどっち付かずの中途半端。ashに合わせるくらいなら純shに合わせとけ。
あと、ashで仕様の違う「let」コマンドを廃止しろ。
0391名無しさん@お腹いっぱい。2012/07/29(日) 08:18:36.31
>>390
・好きなシェルで単に動くものを作る
ってのもあるだろ。ポータビリティが全く必要ない場合とか。
0392名無しさん@お腹いっぱい。2012/07/29(日) 08:36:22.88
>>386
>( ) とか <( ) って、Bash方言かと思ってたが
zshでもkshでも使えることに今気づいたよ。
こりゃ堂々と使っていいな。
03933772012/07/29(日) 09:15:42.62
やはり、エラーの判定になってますが、genext2fsは成功しているな
E: genext2fs: output filesystem image: Success

この場合、結果を標準エラーのみにするには、どうすれば良いですか?

0394名無しさん@お腹いっぱい。2012/07/29(日) 09:19:54.80
>>393
もしかして genext2fsって正しいexit statusを返さないんじゃないの?

標準エラーのみにするには、

if ! ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null); then
..略..

2>&1 と 1>/dev/null の順序を逆にしないこと。(逆で覚えやすいので)
0395名無しさん@お腹いっぱい。2012/07/29(日) 09:27:49.34
ashを否定したせいでposixまで否定する羽目になっちまって大変だな。ロンパー爺さん。
0396名無しさん@お腹いっぱい。2012/07/29(日) 09:29:52.83
俺はash関係なくPOSIXには否定的だけど、何の話?
0397名無しさん@お腹いっぱい。2012/07/29(日) 09:44:58.55
>>393
終了ステータスでの判定を一切やめて、標準エラーの文字列でのみ判定すれば?

ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null)
if [ -n "$ERROR" ]; then
echo "$ERROR"
fi
0398名無しさん@お腹いっぱい。2012/07/29(日) 10:21:14.14
>>396
じゃあさ。

> bash/zsh/kshの共通項に合わせる
これどこにあるんだよ。無いならそれは現実的じゃないって事だよな。
0399名無しさん@お腹いっぱい。2012/07/29(日) 10:37:10.90
>>398
bash/zsh/kshの「現物」があるじゃん。
実際に実行させてチェックできる。

一方、POSIXはPOSIX通りに実装した現物がない。
実際に実行させてチェックできない。
0400名無しさん@お腹いっぱい。2012/07/29(日) 10:56:34.72
ポータビリティが必要ならシェルスクリプトは使わないで下さい。
0401名無しさん@お腹いっぱい。2012/07/29(日) 11:02:57.05
POSIXには現物がない。ハイ、ロンパー
0402名無しさん@お腹いっぱい。2012/07/29(日) 11:14:50.01
>>399
> bash/zsh/kshの「現物」があるじゃん。
> 実際に実行させてチェックできる。
ぷぷぷ、作るときは3つのマニュアル全部読みながら共通項を
拾い出して、作って動いて、おーけい、おーけい。
0403名無しさん@お腹いっぱい。2012/07/29(日) 11:35:07.43
POSIXには現物シェルがない。だから机上の空論って言われるんだよ。
0404名無しさん@お腹いっぱい。2012/07/29(日) 11:38:14.68
マニュアル3冊のAND取る作業は楽しいかい?
0405名無しさん@お腹いっぱい。2012/07/29(日) 11:46:03.68
当然のごとく複数のシェルのマニュアル参照しながらやってるけど、
煽るようなことか? あ、初心者だからマニュアル読むこと自体苦痛な人?

他にも、grepとか、findとか、OSによってオプションが違うコマンドは結構あるので
複数のOSのマニュアルをすぐに見られるようにしてある。
プロなら当然だよな。
0406名無しさん@お腹いっぱい。2012/07/29(日) 12:15:51.33
末端のプロ(笑い)が家内制手工業でANDとってる姿があわれ。
POSIXがAND取ってくれてるんだからそれを使えばいいのに。
0407名無しさん@お腹いっぱい。2012/07/29(日) 12:19:09.97
>>406
POSIXがAND取ってくれてた机上の空論では
実際のシェルは動かないんだよ、素人さん。
0408名無しさん@お腹いっぱい。2012/07/29(日) 12:19:25.10
また通信系SEプロさんですか
0409名無しさん@お腹いっぱい。2012/07/29(日) 12:21:49.12
posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
0410名無しさん@お腹いっぱい。2012/07/29(日) 12:24:48.99
>>407
動くよ。動かないというなら実例を挙げる事。
0411名無しさん@お腹いっぱい。2012/07/29(日) 12:26:37.54
bash/ksh/zshのバージョンはどうするんだろう?
どれも最新のバージョンを使うこと前提?
0412名無しさん@お腹いっぱい。2012/07/29(日) 12:27:00.63
>>410
>>403
0413名無しさん@お腹いっぱい。2012/07/29(日) 12:32:10.32
夏、だなぁ

通信業界さんも夏休みですか?
0414名無しさん@お腹いっぱい。2012/07/29(日) 12:43:31.16
>>412
降参ですか?
0415名無しさん@お腹いっぱい。2012/07/29(日) 12:49:36.17
なんでやねん。欲嫁。
0416名無しさん@お腹いっぱい。2012/07/29(日) 12:51:26.75
>>409
見たことないので、/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通りに実装したシェルを作って持って来い。
(上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
0418名無しさん@お腹いっぱい。2012/07/29(日) 12:53:59.46
ふーむ、3つのシェルのANDとった規格(笑)と合同なシェルは存在するのか?
(上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
0419名無しさん@お腹いっぱい。2012/07/29(日) 12:56:27.23
>>418
直接存在しなくても現物シェルの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.75
>>420
POSIXの場合は現物シェルのANDでも表せないので、
持ってくるとしたら上位互換しかなくなる。それじゃダメと言ってるだけ。

bash/zsh/kshは現物シェルのANDで表せる。

実践的には、scriptを書いた後に
$ bash script
$ zsh script
$ ksh script
でチェックできる。これが実際にANDを取ると言うことだ。

POSIXではそれができない。
0423名無しさん@お腹いっぱい。2012/07/29(日) 13:28:30.18
posixか、bash/zsh/kshのand?かで議論されてますが、
/bin/sh主義の私はどうすればいいでしょうか??
/bin/sh主義的にもposixは糞であることに同意ですが。
0424名無しさん@お腹いっぱい。2012/07/29(日) 13:33:07.06
自分から言い出した条件をあっさり撤回して意味不明の言い訳繰り返す
家内制手工業のプロさん。

> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
0425名無しさん@お腹いっぱい。2012/07/29(日) 13:35:51.04
>>423
v7シェルでいいんじゃないかな。シェル関数すらない孤高の頂で頑張ってください。
ところで、posixシェルのどこが糞なんだい?
0426名無しさん@お腹いっぱい。2012/07/29(日) 13:38:15.67
POSIXには現物がない。ハイ、ロンパー
0427名無しさん@お腹いっぱい。2012/07/29(日) 13:39:10.75
>>424
撤回してないぞ。よくよめ。
0428名無しさん@お腹いっぱい。2012/07/29(日) 13:39:29.54
AND規格には現物がない。はい、ロンパー
0429名無しさん@お腹いっぱい。2012/07/29(日) 13:41:58.86
>>427
bashもzshもkshも全部AND規格(笑)の上位互換
0430名無しさん@お腹いっぱい。2012/07/29(日) 13:43:45.90
>>428
それ以前にPOSIXには現物がないんだから >>428 では論破になってない。

A,Bという二つのものに対して、Bのみ満たす条件を示された時、
A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
それで A が良いことにはならない。
0431名無しさん@お腹いっぱい。2012/07/29(日) 13:52:44.60
>>439
> それ以前にPOSIXには現物がないんだから >>428 では論破になってない。
それ以前にAND規格には現物がないんだから >>426 では論破になってない。

> A,Bという二つのものに対して、Bのみ満たす条件を示された時、
違うよ、Aが満たしていないという(現物がない)と言っているのが>>426

> A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
> それで A が良いことにはならない。

現物がないという条件なら両方同じと言っているだけだ。
0432名無しさん@お腹いっぱい。2012/07/29(日) 14:15:04.40
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー
0433名無しさん@お腹いっぱい。2012/07/29(日) 14:43:09.24
>>413
これか、「夏だなぁ厨」ってのは
0434名無しさん@お腹いっぱい。2012/07/29(日) 14:48:40.91
夏はまだ、始まったばかり。
0435名無しさん@お腹いっぱい。2012/07/29(日) 14:50:44.43
>>423
VMwareの上でSolaris2.5を動かして確認してる。
0436名無しさん@お腹いっぱい。2012/07/29(日) 17:01:06.41
AND規格の現物シェルは存在しない。はい、ロンパー
0437名無しさん@お腹いっぱい。2012/07/29(日) 17:07:14.87
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー
bash/zsh/kshのANDは、現物シェルのANDで表せる。ハイ、ロンパー
0438名無しさん@お腹いっぱい。2012/07/29(日) 17:10:50.82
スーパーセットなシェルじゃダメだという主張は引っ込めるのか?
> (上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
0439名無しさん@お腹いっぱい。2012/07/29(日) 17:15:25.23
bash/zsh/kshのANDは、現物シェルのANDのスーパーセットじゃなくてイコール。
ハイ、ロンパー
0440名無しさん@お腹いっぱい。2012/07/29(日) 17:25:31.70
>>439
↓この各々のシェルは、AND規格のスーパーセットだよなあ。w
家内制手工業の自称プロには難しすぎるかな。?

$ bash script
$ zsh script
$ ksh script
0441名無しさん@お腹いっぱい。2012/07/29(日) 17:36:32.38
ルイージ理論的には違う。はい論破www
0442名無しさん@お腹いっぱい。2012/07/29(日) 17:51:38.94
飽きない?
0443名無しさん@お腹いっぱい。2012/07/29(日) 17:56:40.12
どうでもいいが、$ zsh -y script にするべきだな。
SH_WORD_SPLITを有効にしないと互換性ないよ。
0444名無しさん@お腹いっぱい。2012/07/29(日) 18:10:03.73
うつみみどり
0445名無しさん@お腹いっぱい。2012/07/29(日) 18:31:38.08
ハイハイロンパールームロンパールーム
0446名無しさん@お腹いっぱい。2012/07/29(日) 21:35:16.58
家内制手工業の自称プロはANDとる作業に戻ったらしい。
0447名無しさん@お腹いっぱい。2012/07/29(日) 21:45:10.93
久しぶりに来たら変なの湧いてるな。
ash, bash あたりは POSIXシェルの現物じゃん。
zshは >>443 の言う通り微妙に違うけど。
POSIXに現物がないとか言ってる奴は、CやC++でも
言語規格も知らずにプログラム書くのか?ありえん。
(単に英語が苦手だから最新の規格書が読めなくてこだわってるだけだったりしてw)

基本、POSIXを参照して調べて、ashあたりで動作確認すれば
いいと思うけどな。(POSIX外の拡張が少ないという意味で)

とは言うものの、俺はまだ古いSolarisの保守とかもしてるので、
POSIX範囲内でも使えない機能とかあって鬱なのだが。orz
幸い、Solaris 5.8でもシェル関数は使える。
これがなきゃ死んでるところだ。
0448名無しさん@お腹いっぱい。2012/07/29(日) 21:47:07.40
bashで書いておいてbashがない環境ならbashをインストールする。
って手段すら取れないような環境にいるやつってどれだけいるんだろ。
■ このスレッドは過去ログ倉庫に格納されています