トップページunix
987コメント278KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2012/11/15(木) 18:57:33.11
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 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でそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
0393名無しさん@お腹いっぱい。2013/04/08(月) 21:09:03.19
そんなのもちろんだめです
0394名無しさん@お腹いっぱい。2013/04/08(月) 22:06:41.78
質問者です。
解答ありがとうございます。

>>391 >>393
の失礼な方は私ではありません。
0395名無しさん@お腹いっぱい。2013/04/08(月) 23:18:36.07
>>389
素直にこれじゃいけないの。
hoge=$(command1)
fuga=$(echo $hoge|command2)
0396名無しさん@お腹いっぱい。2013/04/08(月) 23:28:03.96
そうやって書いてくと、スクリプトさしいスマートさが消えますよね。
他のbashスクリプトを見てますけど、例外処理って一部しかしていない。
そんなものですか?
0397名無しさん@お腹いっぱい。2013/04/09(火) 05:19:45.47
何故標準出力とPIPESTATUS全てが必要になるかだな。
command1が失敗したら終了させるには pipefail で十分だし
一個でも処理が失敗したら終了させるには set -e でいい

>>396の想像する完璧な例外処理とスクリプトのスマートさってのは良く分からんが
少なくともtry...catchみたいなのが言語に用意されていない以上すっきりした解決策はないんじゃなかろうか
まあ普通のプログラミング言語でも必要になるのは最後の例外だけで
PIPESTATUS全てが必要になることなんて滅多にないんだが
0398名無しさん@お腹いっぱい。2013/04/09(火) 07:29:49.70
> ${PIPESTATUS[@]}にはcommand2の返り値しか入らないようで。
PIPESTATUSにはhoge=の結果、すなわち変数hogeへの代入の終了ステータスが入る。
hoge=`command1 | command2; echo ${PIPESTATUS[@]} >file`
でfileから読める。
0399名無しさん@お腹いっぱい。2013/04/09(火) 08:44:52.50
一時ファイルとかmkfifo使っていいならいくらでも方法はあるな
0400名無しさん@お腹いっぱい。2013/04/09(火) 09:03:27.73
後出しならいくらでも方法はあるな。
0401名無しさん@お腹いっぱい。2013/04/09(火) 09:29:22.70
set -o pipefail
知りませんでした。
0402名無しさん@お腹いっぱい。2013/04/09(火) 10:02:07.14
質問する人はトリップつけといた方がいいね。
0403名無しさん@お腹いっぱい。2013/04/09(火) 10:34:37.23
pipefailの動きがよくわからない
とちゅうでエラーになったら中断してそのエラーになったプロセスの
エラーコードを返すの?
0404名無しさん@お腹いっぱい。2013/04/09(火) 11:11:29.31
rightmost command to exit with a non-zero status
0405名無しさん@お腹いっぱい。2013/04/09(火) 11:14:31.68
そんなのもちろん知ってます
0406名無しさん@お腹いっぱい。2013/04/09(火) 12:58:14.15
最後から2番目のコマンドのエラーを持ってくるの?
0407名無しさん@お腹いっぱい。2013/04/09(火) 13:07:13.14
rightmost の英語の意味通り
0408名無しさん@お腹いっぱい。2013/04/09(火) 21:31:54.15
for file in hoge*; do ... done 的なことをするときに hoge* にマッチするファイルがない
と、file に hoge* そのものが渡されてしまいますよね? これに対して
1) マッチしないときは何もしない or 2) マッチしなかったことを知りたい という挙動に
したいのですが、何かいい方法はありますかね?

今のところ 1) のためにループ内で -f $file を調べているのですが、
ちょっとどうにかならないかなあと思いまして。
0409名無しさん@お腹いっぱい。2013/04/09(火) 21:36:47.77
というかまあアスタリスクの挙動のことですよね。

何もマッチしないときだけパターンそのものを返されても誰得?
個人的には何も返さないでほしいような。
もしかしてパターンそのものが返ってきてるかどうかをチェックすることにより
マッチングの状況を調べることが想定されてるとか?
0410名無しさん@お腹いっぱい。2013/04/09(火) 21:42:52.49
>>408
shopt -s nullglob

>>409
すみませんが詳しい方のみ回答をお願いします
0411名無しさん@お腹いっぱい。2013/04/09(火) 21:51:21.35
いや、408と409同一人物だろ
0412名無しさん@お腹いっぱい。2013/04/09(火) 21:52:55.88
>>410
おおそんなものが。ありがとうございます。

ちなみにPOSIXなshの範囲で同様なものはないですよね? bashでないshを
使うときもあるので...
0413名無しさん@お腹いっぱい。2013/04/09(火) 21:53:48.33
ああすいません 408 = 409 です。ひとりボケひとりつっこみすみません。
0414名無しさん@お腹いっぱい。2013/04/09(火) 22:02:46.38
何もマッチしないときにパターンそのものを返す理由

xterm -fn -*-fixed-medium-r-normal--14-*
みたいな感じでアスタリスクそのものをコマンドに渡すことがある。
たまたま-*-fixed-...みたいなファイルがカレントにある確率は無視できるので、
そのままパターンそのものを返すという仕様の方がコマンドラインではありがたい。

xterm -fn '-*-fixed-medium-r-normal--14-*'
みたいにきちんとクォートするのが厳密ではあるが。
0415名無しさん@お腹いっぱい。2013/04/09(火) 22:55:49.85
>>414
なるほど。
ちなみにそれはどこかからの引用でしょうか? どこかにこの展開ルールの
意味が説明されているのかなあと。

>みたいにきちんとクォートするのが厳密ではあるが。

ですかね。久しぶりにxfontselを覗いてみたら、私の環境では&や空白を含む
名前があったりするのでクォートしないとうっかりやらかしそうです。
0416 忍法帖【Lv=9,xxxP】(1+0:8) 2013/04/14(日) 22:23:25.30
findであるファイルより古い一覧って出来る?
! -newer やったらあるファイルも含まれるよね?
0417名無しさん@お腹いっぱい。2013/04/15(月) 01:55:26.21
ggrks
ttp://www.google.co.jp/?q=a#output=search&q=find+古いファイル
0418 忍法帖【Lv=9,xxxP】(2+0:8) 2013/04/15(月) 02:10:38.74
ごめんggっても見つからんかった。
! -newer やったらその時間も含まれちゃうよね?
0419名無しさん@お腹いっぱい。2013/04/15(月) 07:11:37.16
! -name そのふぁいる
0420名無しさん@お腹いっぱい。2013/04/15(月) 07:24:31.73
>>419
それでも そのふぁいる 以外のその時間も含まれちゃう
0421名無しさん@お腹いっぱい。2013/04/15(月) 20:46:51.65
悪いけど !-newer からあるファイルと同時刻のものを
取り除かないというシチュエーションが思いつかない。
同時かどうかなんてファイルシステムの時間精度によって異なる訳だし。
0422名無しさん@お腹いっぱい。2013/04/15(月) 20:49:25.92
きっついな〜
0423名無しさん@お腹いっぱい。2013/04/15(月) 22:23:40.92
差分backupだと前回生成したファイルを参考にして含みたくない時はある。他のとこに置いとけと言われれば、そのとおりだけど。
+newerってなかったっけ。
0424 忍法帖【Lv=10,xxxPT】(1+0:8) 2013/04/15(月) 22:23:55.60
>>421
日単位や月単位のディレクトリに更新日でファイルを振り分けたいのよ
例えば、

mkdir 2013-01
touch 201301010000 start
touch 201302010000 end
find . -newer start ! -newer end | xargs -I{} mv {} 2013-01

みたいな。
んでも、201302010000のファイルも移動しちゃうじゃんね。逆に201301010000のファイルは移動しないし……
なんかいい方法ある?
0425名無しさん@お腹いっぱい。2013/04/16(火) 00:54:28.67
find2perlつかえ
0426名無しさん@お腹いっぱい。2013/04/16(火) 18:57:33.17
初めてスクリプト触ったんだが、これelifとかオプションが-rみたいにかなり省略してるんだけど何か理由があるの?
renameとか分かるように書きたいんだが、何か方法は有りますか?
0427名無しさん@お腹いっぱい。2013/04/16(火) 19:01:10.23
変わったやつだな。
それぞれの言語に流儀ってもんがあるんだ。
どう考えてもそのまま覚えたほうが身のためだろ。
0428名無しさん@お腹いっぱい。2013/04/16(火) 19:52:45.30
>>426
理由なんてないよ

昔の人がそうやって短縮してそのまま放置して
今なおそうとしても 昔のコードが動かなくなるから
もうにっちもさっちもいかなくなってるだけ
0429名無しさん@お腹いっぱい。2013/04/16(火) 20:12:34.44
>>427
長くてもパッと見てどういう処理なのか分かりたいんだ
オプション覚えろって言われたらそれまでだが
0430名無しさん@お腹いっぱい。2013/04/16(火) 20:13:20.18
はいそれまでです
0431名無しさん@お腹いっぱい。2013/04/16(火) 20:15:03.29
bashはスクリプトであると同時に毎日書くものだからな
$ tar zxvf hage.tar.gz
ってタイプすれば済むところを
$ tapeArchiver --gzip --extract --verbose --file hoge.tar.gz
とは書きたくないだろ。
まあ最近は長いオプションと短いオプション両方用意してるのも多いけど。

あとelifとかelse if とかelsifの違いは本当に好みの問題だな。
elifに文句行ってたらpythonなんて使えんぞ
0432名無しさん@お腹いっぱい。2013/04/16(火) 20:26:00.52
pythonなんて誰も使ってないから大丈夫
0433名無しさん@お腹いっぱい。2013/04/16(火) 22:37:18.08
elif大好き!
0434名無しさん@お腹いっぱい。2013/04/16(火) 22:58:56.66
このALGOL主義者め!
0435名無しさん@お腹いっぱい。2013/04/17(水) 00:02:40.83
>>426
#
0436名無しさん@お腹いっぱい。2013/04/17(水) 00:13:35.86
>>426
alias
0437名無しさん@お腹いっぱい。2013/04/17(水) 00:50:48.02
>>429
慣れろ。よく使われるオプションなんて、似たり寄ったりだ。長い物には巻かれとけ。
-v は verbose
-h は help
-f は force
-f は file
-r は…シラネ。
0438名無しさん@お腹いっぱい。2013/04/17(水) 01:07:51.84
r は --recursive だろ?
0439名無しさん@お腹いっぱい。2013/04/17(水) 01:32:02.46
-v は --version だな
0440名無しさん@お腹いっぱい。2013/04/17(水) 01:49:06.96
--dry-runとか--sumilationとか--testとか、大事なやつなので統一してほしいな。-nが多い気がするけど。
0441名無しさん@お腹いっぱい。2013/04/17(水) 05:34:53.54
趣味レーション?
0442名無しさん@お腹いっぱい。2013/04/17(水) 06:44:29.58
コンバットレーショーン
て歌あったよな
てんむすだっけ
0443名無しさん@お腹いっぱい。2013/04/17(水) 07:17:40.10
>>440-441
カタカナ表記でそれ間違える奴よくいるが、英語スペルで間違えてる奴初めて三田。
0444名無しさん@お腹いっぱい。2013/04/17(水) 08:40:04.91
>>443
あースマフォのゴダン入力で悩んだ末に間違えたよ。qwertyキーボードなら指が勝手に動くだろうから大丈夫。
0445名無しさん@お腹いっぱい。2013/04/17(水) 09:36:01.74
>>426はこの際オプションのm17nやれ。
-r, --recursive
-再, --再帰
な。
0446名無しさん@お腹いっぱい。2013/04/17(水) 09:39:18.82
コマンドオプションはビックリするほど統一感ないけど
-r はそのなかでも飛びぬけてバラバラだよな
0447名無しさん@お腹いっぱい。2013/04/17(水) 09:48:24.98
まだ - を使うだけ統一されてる。
ddコマンドなんとかしろ。if= of= bs= とか、UNIXのコマンドじゃないみたいな世界観。
0448名無しさん@お腹いっぱい。2013/04/17(水) 10:33:08.22
tarのオプションもいやだな
まああれはシンタクスシュガーだけど
0449名無しさん@お腹いっぱい。2013/04/17(水) 10:34:13.40
getoptsでついでにusageの書き方も定義してほしかったな
0450名無しさん@お腹いっぱい。2013/04/17(水) 10:35:08.44
>>448
最近はハイフンつきオプション使えるtarも多いっしょ。
0451名無しさん@お腹いっぱい。2013/04/17(水) 11:39:48.22
>>450
そうなのか
あれハイフン使えるのって最近の話だったのか
逆に思ってた
UNIX文化は業が深いな
0452名無しさん@お腹いっぱい。2013/04/17(水) 12:42:32.11
tarのoptionはarから来ていて、
arとかddは他のOSの類似コマンドの模倣だったはず。
(t)ar, dd, findが鬼門かな?
cpioもdebianのdpkgが使ってるんだっけな?
0453名無しさん@お腹いっぱい。2013/04/17(水) 13:24:50.18
cpio使ってるのはrpmだったと思う
debはar系だな
0454名無しさん@お腹いっぱい。2013/04/17(水) 13:33:31.99
いーかげんな知識で語るやつばっかだな。
0455名無しさん@お腹いっぱい。2013/04/17(水) 15:11:02.40
どこがいい加減なのか正解込みで指摘してみろ
0456名無しさん@お腹いっぱい。2013/04/17(水) 15:13:04.79
>>450とか>>453とかでもう指摘されてるよ。
0457名無しさん@お腹いっぱい。2013/04/17(水) 15:59:03.36
それはおれだ
0458名無しさん@お腹いっぱい。2013/04/17(水) 19:38:24.54
>>452
psのオプションのカオスっぷりに比べればまだ分かり易い方だと思う
0459名無しさん@お腹いっぱい。2013/04/17(水) 20:23:31.15
まあ色々だね
headとかの+スイッチとか、commの-123とか、
0460名無しさん@お腹いっぱい。2013/04/17(水) 20:43:44.35
head/tail の +スイッチは、ポジックス()によって潰されました
0461名無しさん@お腹いっぱい。2013/04/17(水) 21:33:08.69
>>459
headの + ってどんなのなのなの?
0462名無しさん@お腹いっぱい。2013/04/17(水) 21:44:13.25
head +3
ファイルの末尾3行を除いて表示
0463名無しさん@お腹いっぱい。2013/04/17(水) 21:52:02.52
head -n -3 で桶
0464名無しさん@お腹いっぱい。2013/04/17(水) 21:57:46.87
ddは許してやれ。ccに名前取られてスネてる。
0465名無しさん@お腹いっぱい。2013/04/17(水) 21:58:20.81
+ じゃなくて - の話だが、

tail -5 とかが突然使えなくなって tail -n 5 に書き換えろという話だったが
既存スクリプトへの影響が大き過ぎて
結局 tail -5 とかの形式だけは使えるようにされたんだよな。
0466名無しさん@お腹いっぱい。2013/04/17(水) 22:17:23.08
cc if=hoge.c of=hoge optimize=2 strip=true library=libXt,libX11,libm
0467名無しさん@お腹いっぱい。2013/04/17(水) 23:03:00.57
老害のせいで、むちゃくちゃな言語
0468名無しさん@お腹いっぱい。2013/04/18(木) 09:10:20.74
>>460
sort も忘れるな。
0469名無しさん@お腹いっぱい。2013/04/18(木) 09:17:44.11
>>458
psがカオスなのはlinuxだけじゃね?
BSDとSysVはまったく違うけど、それぞれの中では一貫してる。
linuxはそのまったく違うものを両方使えるようにした上で
さらにgnu long optionsも採用するとかいうバカなことをやって混乱の極みに。
0470名無しさん@お腹いっぱい。2013/04/18(木) 22:08:44.74
某書に、使うpsのオプションで侵入者の素性が分かるというエピソードがあったな
0471名無しさん@お腹いっぱい。2013/04/21(日) 20:35:11.01
/bin/sh、もう使いたく無くなって来た‥
ユーティリティのコマンドオプションに統一性が無いって、どうしてこうなってしまったんだろう
0472名無しさん@お腹いっぱい。2013/04/21(日) 20:41:46.60
/bin/shが使いたくないなら/bin/tcshでも
/usr/local/bin/bashでも/usr/local/bin/zshでも
好きなシェル使えばいいじゃない
0473名無しさん@お腹いっぱい。2013/04/21(日) 21:12:21.58
>>472
いまどき、/bin/bash じゃないの?
0474名無しさん@お腹いっぱい。2013/04/21(日) 21:18:16.31
FreeBSDですしおすし
0475名無しさん@お腹いっぱい。2013/04/21(日) 21:27:21.72
>>471 のいう/bin/shって、/bin/shに限らずシェル一般っていう意味だろ。
ユーティリティのコマンドオプションに統一性が無いとか言ってるし。
それはどのシェルでも変わらない。
0476名無しさん@お腹いっぱい。2013/04/21(日) 21:27:45.57
UNIX じゃないじゃん
0477名無しさん@お腹いっぱい。2013/04/21(日) 21:29:31.89
シェル一般?に対して、/bin/sh とは言わないでしょ?
0478名無しさん@お腹いっぱい。2013/04/21(日) 21:31:17.80
>>477
471はよくわかってないからシェル一般に対して、/bin/shと言ったりする。
0479名無しさん@お腹いっぱい。2013/04/21(日) 21:33:16.90
>>477
もし本当の/bin/shの意味だったら、
「ユーティリティのコマンドオプションに統一性が無い」
の文章につながらない。
0480名無しさん@お腹いっぱい。2013/04/21(日) 21:37:08.55
そこまで推し量ってやることも無いでしょ?
ほんとのとこは本人しかわかんないんだし。
「ユーティリティのコマンドオプションに統一性が無い」ってのも、
別にその「シェル一般?」とも関係ないし
0481名無しさん@お腹いっぱい。2013/04/21(日) 22:11:48.86
>>471
そろそろ正解発表を頼む。
04824712013/04/21(日) 22:40:23.29
ユーティリティのコマンドオプションに統一性が無い、どうしてかな
というのが今の疑問です

/bin/shならびにUNIXシェル一般に興味無くしたってのは早とちりでしたご免ください
いつもお世話になってます
0483名無しさん@お腹いっぱい。2013/04/21(日) 23:02:39.87
オプションを統一するなんて無茶な話だし、使っていればおぼえれるし、ヘルプも参照しやすいからあまり気にしたことなかったなぁ。

バージョン表示とオンラインヘルプだけは、統一あっても良い気がするな。
たまーに違うのが混ざっているからなやましい
0484名無しさん@お腹いっぱい。2013/04/22(月) 00:00:32.49
オンラインヘルプが統一されてないってのは、man と info が混在してることを指して言ってるの?
0485名無しさん@お腹いっぱい。2013/04/22(月) 00:04:04.98
オプションって、なんで棒1本と2本とバラバラなの?
--help
とか
-h
とか

省略形と思ったら、そうでもないし、どうなってんの
0486名無しさん@お腹いっぱい。2013/04/22(月) 00:05:00.13
>>482
君が1人で全部作り直せば互換性がうまれるよ。でもショートのオプション数は限りがあるね。どのように設計するのか見物です。
>>483
man hogeで統一されている。Sh組み込みはshのmanかhelpにしかなかったりするか。
0487名無しさん@お腹いっぱい。2013/04/22(月) 05:09:33.94
>>485
具体的にどのコマンドのどのオプションが不満で
自分が開発者ならどういう名前に変更するか挙げてみてくれ
0488名無しさん@お腹いっぱい。2013/04/22(月) 05:15:05.29
>>485
基本的に、GNU形式の長いオプションが -- で、
旧来の短い(一文字)オプションの場合が - でしょ?

ちなみにコマンドラインから直接実行する場合は短いオプションで、
スクリプト等に記述する場合は(分かりやすくするため)長いオプションを使ったりする。
0489名無しさん@お腹いっぱい。2013/04/22(月) 14:59:57.78
>>488
オプションの意味がアプリごとにバラバラで統一感無い
ってのが統率取れてない印象を与えると思う。
0490名無しさん@お腹いっぱい。2013/04/22(月) 16:13:56.87
>>489
アプリの中で統一されていれば、他のアプリと異なっていても構わないと思うが。
他のアプリやインターフェイスと統一するなら、どこまで統一するのかその範囲は?
Windows/MacOSX/Unix系を全て統一?
GNUアプリを全て統一?
0491名無しさん@お腹いっぱい。2013/04/22(月) 17:08:44.33
>>490
そんなでかい話じゃないが、紳士協定レベルというか
オプションの意味のガイドラインくらいあってもよかったよな
-vや-hの意味くらい統一しとけよという
0492名無しさん@お腹いっぱい。2013/04/22(月) 17:21:27.15
まぁ今から統一するのは無理だから
あきらめて覚えるしかないよ。
■ このスレッドは過去ログ倉庫に格納されています