トップページ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/
0353名無しさん@お腹いっぱい。2013/03/25(月) 12:06:24.73
>>352
bash$ file
sh: file: command not found
0354名無しさん@お腹いっぱい。2013/03/25(月) 12:09:46.54
>>353
おそらくlddコマンドもないだろうから、

LD_TRACE_LOADED_OBJECTS=1 ./setuser.sh

してみ。動的リンクならライブラリが表示されるし、
静的なら not a dynamic executable ってなる。
0355名無しさん@お腹いっぱい。2013/03/25(月) 12:15:56.58
>>354
ありがとうございます。こうなりました。

# LD_TRACE_LOADED_OBJECTS=1 ./setuser.sh
libc.so.6 => /lib/libc.so.6 (0x2957c000)
libnss_dns.so.2 => /lib/libnss_dns.so.2 (0x296bb000)
libnss_files.so.2 => /lib/libnss_files.so.2 (0x296cf000)
libresolv.so.2 => /lib/libresolv.so.2 (0x296e9000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x29556000)

このようなバイナリファイルが中で何をしているのか可読化するには、
どこまで可能でしょうか。
0356名無しさん@お腹いっぱい。2013/03/25(月) 13:03:19.36
いいかげんスレ違い。
0357名無しさん@お腹いっぱい。2013/03/25(月) 13:14:51.48
LANDISKって玄箱だろ。とっくに解析しつくされてたんじゃねーの。
ソースだって入手可能だった気がするが。
0358名無しさん@お腹いっぱい。2013/03/25(月) 15:23:30.31
>>320
perlで動く expect.pm 使ってね
日本語マニュアル、古いのはあったんだけど公開サーバ無くなちゃったな
どうすっかな…
0359名無しさん@お腹いっぱい。2013/03/29(金) 22:14:00.55
diffでファイルをだーって比較すると相違行が表示されるじゃないですか
その相違行の違う文字の部分だけぱーっと色を付けて表示して欲しいんです
出来ますの?勿論ググりましたが、当方馬鹿なのでわかりません
サルでも分かるようなシェルそのものの回答を強く期待します
さぁどうぞ↓
0360名無しさん@お腹いっぱい。2013/03/29(金) 22:44:19.37
docdiff でぐぐるといいかも。
0361名無しさん@お腹いっぱい。2013/03/29(金) 23:57:55.81
>>359
GNUのsource-highlightとかでもいいの?
0362名無しさん@お腹いっぱい。2013/03/30(土) 21:06:24.18
>>359
二行の文字列の相違部分を目視で比較して認識でいないと
吐露していますか?

猿以下の認識能力しかないのに、猿が理解できるレベルの回答を得ても
無駄でしょうに。
0363名無しさん@お腹いっぱい。2013/03/30(土) 22:06:33.56
>>362
自分の文章(文字列)のtypoを発見できない人に言われても…
やっぱりハイライト表示あった方がいいわな
0364名無しさん@お腹いっぱい。2013/04/01(月) 10:49:45.08
>>362
できる/できない論と、効率化、処理コスト削減を同列に語ったら駄目だよ。
0365名無しさん@お腹いっぱい。2013/04/01(月) 11:25:52.57
>>363-364
弱いものいじめはよせ!
>>362だって一生懸命生きているんだぞ!
0366名無しさん@お腹いっぱい。2013/04/02(火) 00:19:37.72
>>362
涙拭けよ
0367名無しさん@お腹いっぱい。2013/04/07(日) 21:03:01.88
すいません。
教えてください。
sh=${SH:-/bin/bash}
と言う処理の
:-
ってどういう意味でしょうか?
0368名無しさん@お腹いっぱい。2013/04/07(日) 21:20:47.08
>>367
似たのがいろいろあるからman shした方が良い。
:-は「Use Default Values.」$SHだけど$SHがunset or nullなら/bin/bashになる。
0369名無しさん@お腹いっぱい。2013/04/07(日) 21:24:34.44
なるほど、bashの機能でしたか、、
0370名無しさん@お腹いっぱい。2013/04/07(日) 21:24:43.66
>>367
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBB
0371名無しさん@お腹いっぱい。2013/04/07(日) 21:25:16.12
>>369
bashに限らない。
0372名無しさん@お腹いっぱい。2013/04/07(日) 21:31:29.01
何を質問しても全部否定的に回答されるスレ
0373名無しさん@お腹いっぱい。2013/04/07(日) 21:36:24.43
んなこたーない。
0374名無しさん@お腹いっぱい。2013/04/07(日) 21:45:17.21
そうですね
そしてこれは否定的でない回答です
0375名無しさん@お腹いっぱい。2013/04/07(日) 21:46:56.83
すみません、if ! command ってどういう意味ですか?
「もし!」って強調してるんですか?
0376名無しさん@お腹いっぱい。2013/04/07(日) 22:00:51.30
ステータスの否定です。
0377名無しさん@お腹いっぱい。2013/04/08(月) 01:04:46.20
ネタ書き込む前にほんとに面白いかどうかいったん考えような。
0378名無しさん@お腹いっぱい。2013/04/08(月) 06:23:01.14
>>377
そう思うのはおまえのスキルの問題、もっと勉強しましょう
zshを極めた俺は腹抱えた笑ったぞ
HAHAHAHAHAHA
0379名無しさん@お腹いっぱい。2013/04/08(月) 08:57:53.24
かわいそうに…
0380名無しさん@お腹いっぱい。2013/04/08(月) 13:54:30.20
ネタを書いた奴がつまらんのはいいとして
つまらんものにつまらんってマジレスしちゃうバカは救いようがない
0381名無しさん@お腹いっぱい。2013/04/08(月) 13:58:20.19
つまらんものはつまらんってマジレスしちゃうバカは救いようがない
ってマジレスしちゃうバカは救いようがない
0382名無しさん@お腹いっぱい。2013/04/08(月) 14:05:52.15
>>380
つまらんものはつまらんと言っとかないといかんでしょ。
おもしろいと勘違いしたまま書き続けられたらたまらん。
0383名無しさん@お腹いっぱい。2013/04/08(月) 14:27:38.89
マジレス否定派ってマジだと勝てない人達だよな
0384名無しさん@お腹いっぱい。2013/04/08(月) 17:23:40.16
>>382
本当につまらんならつまらんとか書いちゃいかんでしょ。
「つまらん」の反応が欲しくて書き続けるから。
0385名無しさん@お腹いっぱい。2013/04/08(月) 17:24:20.77
>>384
1回は言っとかないと。
それでやめないようならもうしょうがない。
0386名無しさん@お腹いっぱい。2013/04/08(月) 17:52:19.80
つまらんだらけの掲示板なんて誰も読まない
つまらないなら自分が面白いことを書けばいいんでね?
つまらん だけ書いても誰も同意しねえよ
0387名無しさん@お腹いっぱい。2013/04/08(月) 18:23:14.76
やっぱり全部否定的に回答されるスレ
0388名無しさん@お腹いっぱい。2013/04/08(月) 18:45:53.94
別に同意求めてるわけじゃないもの。
0389名無しさん@お腹いっぱい。2013/04/08(月) 20:32:40.68
bashで
hoge=`command1 | command2`
としたときにcommand1,command2の返り値を得たいのですがどうすれば良いのでしょう。
${PIPESTATUS[@]}にはcommand2の返り値しか入らないようで。
うーむ。
0390名無しさん@お腹いっぱい。2013/04/08(月) 20:47:34.14
command2の返り値というよりサブシェルのパイプライン全体が親シェルの普通のコマンドになって、
その返り値が親シェルのPIPESTATUS[@]に入るから、親から見たコマンドはひとつしかないので値はひとつ。
0391名無しさん@お腹いっぱい。2013/04/08(月) 20:52:27.52
そんなのすでに知ってます
0392名無しさん@お腹いっぱい。2013/04/08(月) 20:58:57.19
set `command1 | command2; echo ${PIPESTATUS[@]}`
hoge=$1
echo $2 # command1の返り値
echo $3 # command2の返り値

…じゃ駄目か
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が使ってるんだっけな?
■ このスレッドは過去ログ倉庫に格納されています