シェルスクリプト総合 その14
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2009/01/29(木) 06:54:48スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合は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 でトレースしましょう。
前スレ落ちたみたいなのでリンク省略。
0071名無しさん@お腹いっぱい。
2009/02/05(木) 00:35:26conquerer -bj --creeping-deth
0072名無しさん@お腹いっぱい。
2009/02/05(木) 06:38:09多次元配列という意味なら、使えない。
0073名無しさん@お腹いっぱい。
2009/02/05(木) 18:40:06起動コストは抜きにして
とりあえずディレクトリーをたぐりながら正規表現での文字列探索みたいなジャンルで
好みでもかまわないので意見がききたいです。
0074名無しさん@お腹いっぱい。
2009/02/05(木) 18:52:19実際にやってみればいいじゃん。
まあシェルスクリプトは速度を求めるものじゃないけどね。
0075名無しさん@お腹いっぱい。
2009/02/05(木) 18:53:41速い順に、
sh > perl > bash > python
で、大体合ってる
0076名無しさん@お腹いっぱい。
2009/02/05(木) 19:03:08perl, python > sh, bash だろ。JK
0077名無しさん@お腹いっぱい。
2009/02/05(木) 20:23:440078名無しさん@お腹いっぱい。
2009/02/06(金) 12:09:09http://www.commandlinefu.com/commands/browse
0079名無しさん@お腹いっぱい。
2009/02/06(金) 12:18:340080名無しさん@お腹いっぱい。
2009/02/06(金) 12:19:50護符とかの。
0081名無しさん@お腹いっぱい。
2009/02/06(金) 12:51:06なお、Script-Fuの名はカンフー(Kung-fu)からきている。
0082名無しさん@お腹いっぱい。
2009/02/06(金) 15:28:51偉丈夫、気丈夫、大丈夫
0083名無しさん@お腹いっぱい。
2009/02/06(金) 15:34:190084名無しさん@お腹いっぱい。
2009/02/06(金) 15:57:59起動コスト安くなりませんか?めんどいけど
Tclってきるつもりだったけれどある程度の機能がセットになっているのならば
選択肢なのかなぁ。
でも要するにざっくりとみたら対さないんだったら素直にperl使うのが楽なんですかね、
0085名無しさん@お腹いっぱい。
2009/02/06(金) 16:11:31いつの人ですか?
ここ3年くらい使ったことないよ!
0086名無しさん@お腹いっぱい。
2009/02/06(金) 17:36:190087名無しさん@お腹いっぱい。
2009/02/06(金) 23:17:30これってhogeの内容がechoに渡されると思うんだけど、
なんで何も表示されないんですか?
0088名無しさん@お腹いっぱい。
2009/02/06(金) 23:30:300089名無しさん@お腹いっぱい。
2009/02/06(金) 23:45:25了解しました
[ana@coppola ~]$ echo <(ls)
/proc/self/fd/63
ではこうなるのはいったいなぜですか?
というか、
/proc/self/fd/63
って?
0090名無しさん@お腹いっぱい。
2009/02/07(土) 00:16:57<(command)はprocess substitutionというbashの特殊な記法でファイルディスクリプタ
ファイル(/dev/fd/#)名に置換されます。
0091名無しさん@お腹いっぱい。
2009/02/07(土) 00:43:49曖昧さがあるので|記法に変った。
0092ミジンコ未満
2009/02/07(土) 01:17:25コマンドを実行する。なんてことをするにはどうすればいいですか
0093名無しさん@お腹いっぱい。
2009/02/07(土) 01:32:22http://www.linux.or.jp/JF/JFdocs/SCSI-2.4-HOWTO/sr.html
0094名無しさん@お腹いっぱい。
2009/02/07(土) 11:06:58head -c 1 /dev/cdrom > /dev/null 2>&1 && command
>>93
そのリンク見ても、メディアが挿入されてるかどうかの判定はできないよ。
0095名無しさん@お腹いっぱい。
2009/02/08(日) 00:47:14暗号化zipを別のフォルダに分けるっていう事、どうやればいいでしょうか
0096名無しさん@お腹いっぱい。
2009/02/08(日) 00:49:330098名無しさん@お腹いっぱい。
2009/02/08(日) 02:15:27現状では、2つのディレクトリ内のファイルは同期が取れていますが、たまに異なる更新日時のファイルが出来ます。
その同期の取れていないファイルはできれば抜き出したいです。
ファイルは全部で5000件くらいあります。
1.ls -ltでディレクトリ内一覧情報を出してファイルに出力
2.出したファイルから不要な情報を削除(ユーザー名とか)して時間とファイル名だけにしぼる
3.上の1と2を両ディレクトリで行う
4.diffでファイル同士比較
5.偏った情報を出力
これをシェルでやらせようと思ってますが、どうも効率を悪い気がします。
0099名無しさん@お腹いっぱい。
2009/02/08(日) 03:18:26ところどころ日本語も意味不明
更新日時の比較なら、ls -lt の結果を比較すればいいし
ファイル内容の比較をしたいのなら、diff や dircmp で
ディレクトリを指定すればいい
0101名無しさん@お腹いっぱい。
2009/02/08(日) 07:23:22なぜ同期ツールを始めから使わないのか?
e.g. rsync等
0102名無しさん@お腹いっぱい。
2009/02/08(日) 16:13:21readlink相当のことをシェルでやるには、
どうやるのが定番ですか?
シンボリックリンクの中にはスペースや特殊記号等、
すべてアリの状態でお願いします。
0103名無しさん@お腹いっぱい。
2009/02/08(日) 16:17:180104名無しさん@お腹いっぱい。
2009/02/08(日) 16:26:430105名無しさん@お腹いっぱい。
2009/02/08(日) 16:57:46> シンボリックリンクの中にはスペースや特殊記号等、
> すべてアリの状態でお願いします。
0106名無しさん@お腹いっぱい。
2009/02/08(日) 17:05:41$ ln -s 'hoge -> hage' 'boke -> kasu'
$ ls -l
lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage
こういう状態で、どうやって判定するのかね?
0107名無しさん@お腹いっぱい。
2009/02/08(日) 18:26:11perl -e "print readlink ファイル名;"
でどう?
perl はたいてい入ってるし
0108名無しさん@お腹いっぱい。
2009/02/08(日) 22:41:27lrwxrwxrwx
一文字目の l はどういう意味?
0109名無しさん@お腹いっぱい。
2009/02/08(日) 22:45:41お前、>>105 が言わんとしてることをわかってない
boke -> kasu -> hoge -> hage
↑
この部分を見て、どこがシンボリックリンクの中身か判読できないだろw
0110名無しさん@お腹いっぱい。
2009/02/08(日) 22:50:11>>106 を良く読め、
ls -lの結果が、 boke -> kasu -> hoge -> hage となった場合、
「hage」を指している 「boke -> kasu -> hoge」と言うsymlinkかも知れないし、
「hoge -> hage」と言うファイルを指している 「boke -> kasu」と言うsymlinkかも知れないし、
「kasu -> hoge -> hage」と言うファイルを指している 「boke」と言うsymlinkかも知れない、
ということだな。
0111名無しさん@お腹いっぱい。
2009/02/08(日) 23:26:170112名無しさん@お腹いっぱい。
2009/02/09(月) 00:30:15(
echo a
echo b
)
これと
#!/bin/sh
{
echo a
echo b
}
これってなんか違いあります?
0113名無しさん@お腹いっぱい。
2009/02/09(月) 04:42:060114名無しさん@お腹いっぱい。
2009/02/09(月) 06:32:24実際にはシェル内部で最適化されるから、
( ) を使ってもプロセスは起動されない。
>>112
これだけだと違いは起きない。
( ) や { } 以外の他の部分の記述によっては違いが出ることもあるというだけ。
0115名無しさん@お腹いっぱい。
2009/02/09(月) 23:28:32ls -l と ls -lF の結果を比較すればできそうだから、あとはまかせた。
0116名無しさん@お腹いっぱい。
2009/02/10(火) 04:06:300117名無しさん@お腹いっぱい。
2009/02/10(火) 06:44:56>>102
「readlinkコマンドがないOSで、」
最近、質問をちゃんと読まない人多いね
0118名無しさん@お腹いっぱい。
2009/02/10(火) 09:48:36>>102はreadlink相当のことをビルトインコマンドとして持っているシェルを
探しているんだぞ。
>>102
> readlink相当のことをシェルでやるには、
0119名無しさん@お腹いっぱい。
2009/02/10(火) 09:58:010120名無しさん@お腹いっぱい。
2009/02/10(火) 10:00:52readlinkがないOSにはstatもないと考えるのが妥当。
あと、stat -f というオプションはFreeBSD方言だから気を付けろ。
0121名無しさん@お腹いっぱい。
2009/02/10(火) 11:04:50$ stat --printf "%n\n" /vmlinuz
/vmlinuz
$ stat --printf "%N\n" /vmlinuz
`/vmlinuz' -> `boot/vmlinuz-2.6.27-11-generic'
->とかquoteとかいらねーよ
0122名無しさん@お腹いっぱい。
2009/02/10(火) 13:20:19マリー アントワネットにマジレスする不粋
0123名無しさん@お腹いっぱい。
2009/02/10(火) 15:07:27おれには>>119 がマジで stat -f %Y が他のOSでも使えると思い込んでるように見えるが、
0124名無しさん@お腹いっぱい。
2009/02/10(火) 15:15:420125名無しさん@お腹いっぱい。
2009/02/10(火) 15:46:31しゅぎょーが足らないな
0126名無しさん@お腹いっぱい。
2009/02/10(火) 16:08:23言い訳見苦しい。本当に知らなかったんだねw
0127名無しさん@お腹いっぱい。
2009/02/10(火) 16:12:10ファイル名がわかってるなら、ls -l を解析できるんじゃないか?
lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage
ファイル名が boke ならば 'kasu -> hoge -> hage'
ファイル名が 'boke -> kasu' ならば、 'hoge -> hage'
が取り出せればいいんじゃないの?
0128名無しさん@お腹いっぱい。
2009/02/10(火) 21:01:33たとえば、lsって打ちますよね、
で、hoge1 hoge2 とか表示されます。
そのあと、rm hoge1 ってやっても、
上の ls のところのシェルには hoge1 が表示されたままになります。
もう一回 ls を売っても、下の画面に2重に出てきて、
上のシェルの ls が更新されません
0129名無しさん@お腹いっぱい。
2009/02/10(火) 21:17:200130名無しさん@お腹いっぱい。
2009/02/10(火) 21:18:01端末の画面上ということですね。
CUIの端末の元祖はテレタイプです。
これはキーボードとプリンタがくっついたものです。
プリンタで打ち出されたlsの結果がいつのまにか変化するようなことはありません。
画面に表示するようになった現在でも同じです。
0131名無しさん@お腹いっぱい。
2009/02/10(火) 21:30:20プリンターは繋いでいません。
プリーンターを繋げばリロードが治るんでしょうか?
良くわかりませんが??
0132名無しさん@お腹いっぱい。
2009/02/10(火) 21:37:26こういうのを購入して接続するとリロードが治るはずです。
どこで売ってるかは知らないので、がんばって探してください。
なければあきらめましょう。
0133名無しさん@お腹いっぱい。
2009/02/11(水) 00:05:140134名無しさん@お腹いっぱい。
2009/02/11(水) 09:36:33#!/bin/sh
echo 'b[9];main(int c,char**v){printf("%.*s?n",readlink(v[1],b,36),b);}'|gcc -xc - 2>/dev/null;./a.out "$1";rm a.out
0135名無しさん@お腹いっぱい。
2009/02/11(水) 09:37:180136名無しさん@お腹いっぱい。
2009/02/11(水) 10:46:40ソースにじかに "$1" を入れ込めばもっと短くなるだろ
echo 'b[9];main(){printf("%.*s\n",readlink("'"$1"'",b,36),b);}'|gcc -xc - 2>/dev/null;./a.out;rm a.out
0137名無しさん@お腹いっぱい。
2009/02/11(水) 13:06:27> 2>/dev/null
書き込めないcurrent directoryで、
/usr/bin/ld: cannot open output file a.out: Permission denied
すら見られませんが…
0138名無しさん@お腹いっぱい。
2009/02/12(木) 16:45:07b[9];main(int c,char**v){printf("%.*s\n",readlink(v[1],b,36),b);}
0139名無しさん@お腹いっぱい。
2009/02/14(土) 18:30:520140名無しさん@お腹いっぱい。
2009/02/14(土) 18:32:02uptime
0141名無しさん@お腹いっぱい。
2009/02/15(日) 01:04:500142名無しさん@お腹いっぱい。
2009/02/15(日) 02:12:42/proc/statのcpu行の最初の三つがCPUタイム
0143名無しさん@お腹いっぱい。
2009/02/15(日) 09:42:440144名無しさん@お腹いっぱい。
2009/02/15(日) 09:44:200145名無しさん@お腹いっぱい。
2009/02/15(日) 09:56:360146名無しさん@お腹いっぱい。
2009/02/15(日) 10:30:18すればいいですか?
phpで言えば
$hen01 = $_POST["読み込んだ文字"];
$fp = fopen('書き込み先.txt', 'a+');
flock($fp, LOCK_EX);
$return = fputs($fp,"$hen01\n");
flock($fp, LOCK_UN);
fclose($fp);
こんな感じで一旦あるテキストファイルの文字列を全部読み込んで、別のファイルに
追記書き込みの処理をしたいんです。
0147名無しさん@お腹いっぱい。
2009/02/15(日) 10:40:050148名無しさん@お腹いっぱい。
2009/02/15(日) 10:47:30なるほどcatを使うんですね、即レスありがとうございました。
0149名無しさん@お腹いっぱい。
2009/02/15(日) 11:00:110150名無しさん@お腹いっぱい。
2009/02/15(日) 11:12:06でも制限させたらさせたで面倒なんだよな。
仕事で使うんならいざしらず、遊びで使うんなら
少々飛ばそうが関係ないし。
0151名無しさん@お腹いっぱい。
2009/02/15(日) 11:18:560152名無しさん@お腹いっぱい。
2009/02/15(日) 11:23:28それだと、>>146 のphpでやってる flock の処理が出来てないと思うが。
同時にプロセス起動されたら出力がぐちゃぐちゃに混ざる。
0153名無しさん@お腹いっぱい。
2009/02/15(日) 11:30:38147でいいんじゃないの?
0154名無しさん@お腹いっぱい。
2009/02/15(日) 11:35:22ロックできなかった場合はflockのところでロック解除になるまで待たされる。
だから、ロックの処理はちゃんと行なわれている。
よって >>147 ではダメ。
0155名無しさん@お腹いっぱい。
2009/02/15(日) 11:43:02>phpは知らんが
知らないのに突っ込むと恥をかくという典型例ですな
0156名無しさん@お腹いっぱい。
2009/02/15(日) 11:50:000157名無しさん@お腹いっぱい。
2009/02/15(日) 12:01:31lockf(1)が無かったら作れ。
0158名無しさん@お腹いっぱい。
2009/02/15(日) 12:04:49flock(1)が存在するOS (Linux)なら、
flock out.txt cat in.txt >> out.txt
0159名無しさん@お腹いっぱい。
2009/02/15(日) 12:18:35>>157のスタイルの方が>>158のスタイルより、
ファイルロック以前に書き込まれる恐れがない。
0160名無しさん@お腹いっぱい。
2009/02/15(日) 12:21:59>>158が知っていたのかはわからない。
0161名無しさん@お腹いっぱい。
2009/02/15(日) 12:26:130162名無しさん@お腹いっぱい。
2009/02/15(日) 12:28:310163名無しさん@お腹いっぱい。
2009/02/15(日) 12:32:41いや、仕様とか品質とか関係なく無駄。
アペンドで先にオープンされるだけであって、
実際の書き込みはロック取得後に行なわれるから、
sh -c なしで全く問題ない。
0164名無しさん@お腹いっぱい。
2009/02/15(日) 12:35:16それだと、実行後に bbbが削除されるだろ(笑)
>>158
こっちは合格。
0165名無しさん@お腹いっぱい。
2009/02/15(日) 17:50:43する事は可能でしょうか?
1、a.txtの中に文字列「/var/log/maillog」が記述されている
2、シェルスクリプトを使って「/var/log/maillog」を記憶(変数にセット?)
3、b.txtに記憶した「/var/log/maillog」の文字列を追記したい
なおa.txtの内容は、
/var/log/maillogだったり/var/log/http_error_logだったりしますが、原則一行であり、
後ろの文字列は変わることはあっても先頭部分の/var/log/は不変です。
0166名無しさん@お腹いっぱい。
2009/02/15(日) 17:56:26一旦変数に記憶させたいという要求なのかな?
だとすると、
file=`cat a.txt`
echo "$file" >> b.txt
なお、変数に記憶させる必要がなければもちろん、
cat a.txt >> b.txt でよい。
0167名無しさん@お腹いっぱい。
2009/02/15(日) 19:20:20ありがとうございました、少し形を変えましたが思っていた事ができました。
こういう場合は``でくくるのですね。また一つ勉強になりました。
0168143
2009/02/15(日) 20:48:500169名無しさん@お腹いっぱい。
2009/02/15(日) 21:44:12>>144
0170名無しさん@お腹いっぱい。
2009/02/15(日) 23:20:16diagostini --autumn-leaves
■ このスレッドは過去ログ倉庫に格納されています