シェルスクリプト総合 その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/
0381名無しさん@お腹いっぱい。
2013/04/08(月) 13:58:20.19ってマジレスしちゃうバカは救いようがない
0382名無しさん@お腹いっぱい。
2013/04/08(月) 14:05:52.15つまらんものはつまらんと言っとかないといかんでしょ。
おもしろいと勘違いしたまま書き続けられたらたまらん。
0383名無しさん@お腹いっぱい。
2013/04/08(月) 14:27:38.890384名無しさん@お腹いっぱい。
2013/04/08(月) 17:23:40.16本当につまらんならつまらんとか書いちゃいかんでしょ。
「つまらん」の反応が欲しくて書き続けるから。
0385名無しさん@お腹いっぱい。
2013/04/08(月) 17:24:20.771回は言っとかないと。
それでやめないようならもうしょうがない。
0386名無しさん@お腹いっぱい。
2013/04/08(月) 17:52:19.80つまらないなら自分が面白いことを書けばいいんでね?
つまらん だけ書いても誰も同意しねえよ
0387名無しさん@お腹いっぱい。
2013/04/08(月) 18:23:14.760388名無しさん@お腹いっぱい。
2013/04/08(月) 18:45:53.940389名無しさん@お腹いっぱい。
2013/04/08(月) 20:32:40.68hoge=`command1 | command2`
としたときにcommand1,command2の返り値を得たいのですがどうすれば良いのでしょう。
${PIPESTATUS[@]}にはcommand2の返り値しか入らないようで。
うーむ。
0390名無しさん@お腹いっぱい。
2013/04/08(月) 20:47:34.14その返り値が親シェルのPIPESTATUS[@]に入るから、親から見たコマンドはひとつしかないので値はひとつ。
0391名無しさん@お腹いっぱい。
2013/04/08(月) 20:52:27.520392名無しさん@お腹いっぱい。
2013/04/08(月) 20:58:57.19hoge=$1
echo $2 # command1の返り値
echo $3 # command2の返り値
…じゃ駄目か
0393名無しさん@お腹いっぱい。
2013/04/08(月) 21:09:03.190394名無しさん@お腹いっぱい。
2013/04/08(月) 22:06:41.78解答ありがとうございます。
>>391 >>393
の失礼な方は私ではありません。
0395名無しさん@お腹いっぱい。
2013/04/08(月) 23:18:36.07素直にこれじゃいけないの。
hoge=$(command1)
fuga=$(echo $hoge|command2)
0396名無しさん@お腹いっぱい。
2013/04/08(月) 23:28:03.96他のbashスクリプトを見てますけど、例外処理って一部しかしていない。
そんなものですか?
0397名無しさん@お腹いっぱい。
2013/04/09(火) 05:19:45.47command1が失敗したら終了させるには pipefail で十分だし
一個でも処理が失敗したら終了させるには set -e でいい
>>396の想像する完璧な例外処理とスクリプトのスマートさってのは良く分からんが
少なくともtry...catchみたいなのが言語に用意されていない以上すっきりした解決策はないんじゃなかろうか
まあ普通のプログラミング言語でも必要になるのは最後の例外だけで
PIPESTATUS全てが必要になることなんて滅多にないんだが
0398名無しさん@お腹いっぱい。
2013/04/09(火) 07:29:49.70PIPESTATUSにはhoge=の結果、すなわち変数hogeへの代入の終了ステータスが入る。
hoge=`command1 | command2; echo ${PIPESTATUS[@]} >file`
でfileから読める。
0399名無しさん@お腹いっぱい。
2013/04/09(火) 08:44:52.500400名無しさん@お腹いっぱい。
2013/04/09(火) 09:03:27.730401名無しさん@お腹いっぱい。
2013/04/09(火) 09:29:22.70知りませんでした。
0402名無しさん@お腹いっぱい。
2013/04/09(火) 10:02:07.140403名無しさん@お腹いっぱい。
2013/04/09(火) 10:34:37.23とちゅうでエラーになったら中断してそのエラーになったプロセスの
エラーコードを返すの?
0404名無しさん@お腹いっぱい。
2013/04/09(火) 11:11:29.310405名無しさん@お腹いっぱい。
2013/04/09(火) 11:14:31.680406名無しさん@お腹いっぱい。
2013/04/09(火) 12:58:14.150407名無しさん@お腹いっぱい。
2013/04/09(火) 13:07:13.140408名無しさん@お腹いっぱい。
2013/04/09(火) 21:31:54.15と、file に hoge* そのものが渡されてしまいますよね? これに対して
1) マッチしないときは何もしない or 2) マッチしなかったことを知りたい という挙動に
したいのですが、何かいい方法はありますかね?
今のところ 1) のためにループ内で -f $file を調べているのですが、
ちょっとどうにかならないかなあと思いまして。
0409名無しさん@お腹いっぱい。
2013/04/09(火) 21:36:47.77何もマッチしないときだけパターンそのものを返されても誰得?
個人的には何も返さないでほしいような。
もしかしてパターンそのものが返ってきてるかどうかをチェックすることにより
マッチングの状況を調べることが想定されてるとか?
0410名無しさん@お腹いっぱい。
2013/04/09(火) 21:42:52.49shopt -s nullglob
>>409
すみませんが詳しい方のみ回答をお願いします
0411名無しさん@お腹いっぱい。
2013/04/09(火) 21:51:21.350412名無しさん@お腹いっぱい。
2013/04/09(火) 21:52:55.88おおそんなものが。ありがとうございます。
ちなみにPOSIXなshの範囲で同様なものはないですよね? bashでないshを
使うときもあるので...
0413名無しさん@お腹いっぱい。
2013/04/09(火) 21:53:48.330414名無しさん@お腹いっぱい。
2013/04/09(火) 22:02:46.38xterm -fn -*-fixed-medium-r-normal--14-*
みたいな感じでアスタリスクそのものをコマンドに渡すことがある。
たまたま-*-fixed-...みたいなファイルがカレントにある確率は無視できるので、
そのままパターンそのものを返すという仕様の方がコマンドラインではありがたい。
xterm -fn '-*-fixed-medium-r-normal--14-*'
みたいにきちんとクォートするのが厳密ではあるが。
0415名無しさん@お腹いっぱい。
2013/04/09(火) 22:55:49.85なるほど。
ちなみにそれはどこかからの引用でしょうか? どこかにこの展開ルールの
意味が説明されているのかなあと。
>みたいにきちんとクォートするのが厳密ではあるが。
ですかね。久しぶりにxfontselを覗いてみたら、私の環境では&や空白を含む
名前があったりするのでクォートしないとうっかりやらかしそうです。
0416 忍法帖【Lv=9,xxxP】(1+0:8)
2013/04/14(日) 22:23:25.30! -newer やったらあるファイルも含まれるよね?
0417名無しさん@お腹いっぱい。
2013/04/15(月) 01:55:26.21ttp://www.google.co.jp/?q=a#output=search&q=find+古いファイル
0418 忍法帖【Lv=9,xxxP】(2+0:8)
2013/04/15(月) 02:10:38.74! -newer やったらその時間も含まれちゃうよね?
0419名無しさん@お腹いっぱい。
2013/04/15(月) 07:11:37.160420名無しさん@お腹いっぱい。
2013/04/15(月) 07:24:31.73それでも そのふぁいる 以外のその時間も含まれちゃう
0421名無しさん@お腹いっぱい。
2013/04/15(月) 20:46:51.65取り除かないというシチュエーションが思いつかない。
同時かどうかなんてファイルシステムの時間精度によって異なる訳だし。
0422名無しさん@お腹いっぱい。
2013/04/15(月) 20:49:25.920423名無しさん@お腹いっぱい。
2013/04/15(月) 22:23:40.92+newerってなかったっけ。
0424 忍法帖【Lv=10,xxxPT】(1+0:8)
2013/04/15(月) 22:23:55.60日単位や月単位のディレクトリに更新日でファイルを振り分けたいのよ
例えば、
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.670426名無しさん@お腹いっぱい。
2013/04/16(火) 18:57:33.17renameとか分かるように書きたいんだが、何か方法は有りますか?
0427名無しさん@お腹いっぱい。
2013/04/16(火) 19:01:10.23それぞれの言語に流儀ってもんがあるんだ。
どう考えてもそのまま覚えたほうが身のためだろ。
0428名無しさん@お腹いっぱい。
2013/04/16(火) 19:52:45.30理由なんてないよ
昔の人がそうやって短縮してそのまま放置して
今なおそうとしても 昔のコードが動かなくなるから
もうにっちもさっちもいかなくなってるだけ
0429名無しさん@お腹いっぱい。
2013/04/16(火) 20:12:34.44長くてもパッと見てどういう処理なのか分かりたいんだ
オプション覚えろって言われたらそれまでだが
0430名無しさん@お腹いっぱい。
2013/04/16(火) 20:13:20.180431名無しさん@お腹いっぱい。
2013/04/16(火) 20:15:03.29$ 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.520433名無しさん@お腹いっぱい。
2013/04/16(火) 22:37:18.080434名無しさん@お腹いっぱい。
2013/04/16(火) 22:58:56.660435名無しさん@お腹いっぱい。
2013/04/17(水) 00:02:40.83#
0436名無しさん@お腹いっぱい。
2013/04/17(水) 00:13:35.86alias
0437名無しさん@お腹いっぱい。
2013/04/17(水) 00:50:48.02慣れろ。よく使われるオプションなんて、似たり寄ったりだ。長い物には巻かれとけ。
-v は verbose
-h は help
-f は force
-f は file
-r は…シラネ。
0438名無しさん@お腹いっぱい。
2013/04/17(水) 01:07:51.840439名無しさん@お腹いっぱい。
2013/04/17(水) 01:32:02.460440名無しさん@お腹いっぱい。
2013/04/17(水) 01:49:06.960441名無しさん@お腹いっぱい。
2013/04/17(水) 05:34:53.540442名無しさん@お腹いっぱい。
2013/04/17(水) 06:44:29.58て歌あったよな
てんむすだっけ
0443名無しさん@お腹いっぱい。
2013/04/17(水) 07:17:40.10カタカナ表記でそれ間違える奴よくいるが、英語スペルで間違えてる奴初めて三田。
0444名無しさん@お腹いっぱい。
2013/04/17(水) 08:40:04.91あースマフォのゴダン入力で悩んだ末に間違えたよ。qwertyキーボードなら指が勝手に動くだろうから大丈夫。
0445名無しさん@お腹いっぱい。
2013/04/17(水) 09:36:01.74-r, --recursive
-再, --再帰
な。
0446名無しさん@お腹いっぱい。
2013/04/17(水) 09:39:18.82-r はそのなかでも飛びぬけてバラバラだよな
0447名無しさん@お腹いっぱい。
2013/04/17(水) 09:48:24.98ddコマンドなんとかしろ。if= of= bs= とか、UNIXのコマンドじゃないみたいな世界観。
0448名無しさん@お腹いっぱい。
2013/04/17(水) 10:33:08.22まああれはシンタクスシュガーだけど
0449名無しさん@お腹いっぱい。
2013/04/17(水) 10:34:13.400450名無しさん@お腹いっぱい。
2013/04/17(水) 10:35:08.44最近はハイフンつきオプション使えるtarも多いっしょ。
0451名無しさん@お腹いっぱい。
2013/04/17(水) 11:39:48.22そうなのか
あれハイフン使えるのって最近の話だったのか
逆に思ってた
UNIX文化は業が深いな
0452名無しさん@お腹いっぱい。
2013/04/17(水) 12:42:32.11arとかddは他のOSの類似コマンドの模倣だったはず。
(t)ar, dd, findが鬼門かな?
cpioもdebianのdpkgが使ってるんだっけな?
0453名無しさん@お腹いっぱい。
2013/04/17(水) 13:24:50.18debはar系だな
0454名無しさん@お腹いっぱい。
2013/04/17(水) 13:33:31.990455名無しさん@お腹いっぱい。
2013/04/17(水) 15:11:02.400456名無しさん@お腹いっぱい。
2013/04/17(水) 15:13:04.790457名無しさん@お腹いっぱい。
2013/04/17(水) 15:59:03.360458名無しさん@お腹いっぱい。
2013/04/17(水) 19:38:24.54psのオプションのカオスっぷりに比べればまだ分かり易い方だと思う
0459名無しさん@お腹いっぱい。
2013/04/17(水) 20:23:31.15headとかの+スイッチとか、commの-123とか、
0460名無しさん@お腹いっぱい。
2013/04/17(水) 20:43:44.350461名無しさん@お腹いっぱい。
2013/04/17(水) 21:33:08.69headの + ってどんなのなのなの?
0462名無しさん@お腹いっぱい。
2013/04/17(水) 21:44:13.25ファイルの末尾3行を除いて表示
0463名無しさん@お腹いっぱい。
2013/04/17(水) 21:52:02.520464名無しさん@お腹いっぱい。
2013/04/17(水) 21:57:46.870465名無しさん@お腹いっぱい。
2013/04/17(水) 21:58:20.81tail -5 とかが突然使えなくなって tail -n 5 に書き換えろという話だったが
既存スクリプトへの影響が大き過ぎて
結局 tail -5 とかの形式だけは使えるようにされたんだよな。
0466名無しさん@お腹いっぱい。
2013/04/17(水) 22:17:23.080467名無しさん@お腹いっぱい。
2013/04/17(水) 23:03:00.570468名無しさん@お腹いっぱい。
2013/04/18(木) 09:10:20.74sort も忘れるな。
0469名無しさん@お腹いっぱい。
2013/04/18(木) 09:17:44.11psがカオスなのはlinuxだけじゃね?
BSDとSysVはまったく違うけど、それぞれの中では一貫してる。
linuxはそのまったく違うものを両方使えるようにした上で
さらにgnu long optionsも採用するとかいうバカなことをやって混乱の極みに。
0470名無しさん@お腹いっぱい。
2013/04/18(木) 22:08:44.740471名無しさん@お腹いっぱい。
2013/04/21(日) 20:35:11.01ユーティリティのコマンドオプションに統一性が無いって、どうしてこうなってしまったんだろう
0472名無しさん@お腹いっぱい。
2013/04/21(日) 20:41:46.60/usr/local/bin/bashでも/usr/local/bin/zshでも
好きなシェル使えばいいじゃない
0473名無しさん@お腹いっぱい。
2013/04/21(日) 21:12:21.58いまどき、/bin/bash じゃないの?
0474名無しさん@お腹いっぱい。
2013/04/21(日) 21:18:16.310475名無しさん@お腹いっぱい。
2013/04/21(日) 21:27:21.72ユーティリティのコマンドオプションに統一性が無いとか言ってるし。
それはどのシェルでも変わらない。
0476名無しさん@お腹いっぱい。
2013/04/21(日) 21:27:45.570477名無しさん@お腹いっぱい。
2013/04/21(日) 21:29:31.890478名無しさん@お腹いっぱい。
2013/04/21(日) 21:31:17.80471はよくわかってないからシェル一般に対して、/bin/shと言ったりする。
0479名無しさん@お腹いっぱい。
2013/04/21(日) 21:33:16.90もし本当の/bin/shの意味だったら、
「ユーティリティのコマンドオプションに統一性が無い」
の文章につながらない。
0480名無しさん@お腹いっぱい。
2013/04/21(日) 21:37:08.55ほんとのとこは本人しかわかんないんだし。
「ユーティリティのコマンドオプションに統一性が無い」ってのも、
別にその「シェル一般?」とも関係ないし
■ このスレッドは過去ログ倉庫に格納されています