1 名前:シェルスクリプトライター mailto:sage [2011/12/10(土) 20:06:40.38 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その18 hibari.2ch.net/test/read.cgi/unix/1308195527/ 次スレは >>970 で。
438 名前:名無しさん@お腹いっぱい。 [2012/03/06(火) 21:07:07.27 ] >>429 コンパイルに失敗した場合、「N」や「Y」を入力しても反応がない原因を 教えてやる。 >>429 の while do .. done ループで、done < ${LIST} となってるので、 標準入力が ${LIST} にリダイレクトされたままになってて、 その状態で cc.sh が起動されてる。 cc.shの中でキーボードを読んでるつもりが、${LIST}を読んでしまうので、 「N」や「Y」を入力しても反応しない。 解決方法は、>>429 で、 ---------------------------- exec 3< ${LIST} while read ARG1 ARG2 do ${CCOM} ${ARG1} ${ARG2} done 0<&3 ---------------------------- とすること。標準入力をキーボードにしたまま、readには記述子3を読ませる。
439 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 21:12:06.05 ] >>438 おいおい、そのリダイレクト方法だと結局同じ理由で駄目だよ。 標準入力を退避しておいて復帰する。 exec 3<&0 while read ARG1 ARG2 do ${CCOM} ${ARG1} ${ARG2} 0<&3 done < ${LIST}
440 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 21:17:04.64 ] >>439 の方法でもいいが、 >>438 が言いたかったのは ↓じゃないかな exec 3< ${LIST} while read ARG1 ARG2 0<&3 do ${CCOM} ${ARG1} ${ARG2} done
441 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 22:15:57.04 ] >431 > でオッケーでしょうか? オッケーだと言う人がいたらしいよ。 ただし私は、貴方の環境と責任を共有していないので、自己責任でやって下さいね。
442 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:36:49.85 ] テキストから読み込んだ文字列内の「\\」をそのまま変数に入れたり表示させたりする方法を 探しています。OSはCentOS6、シェルはbashです 以下のような問題に対処したいのですが、何か手段はありますでしょうか? 以下のsampletext.txt(「\\」や「\」を含む)を、readecho.shのようにreadで読み、 echoで出力すると、「\」がエスケープか何かされているようで、表示されません bashやechoのmanにある-Eオプションを明示的に付与してみても変化が無いようです awkprint.shのようにawkで行うと期待した結果が出るのですが、他の処理の関係上、 できればawkは使わずに、シェルスクリプトで実現させる方法を知りたく思ってます テキストを事前に「\\」から「\\\\」としておく等の対処はせずに済ませたいです $ cat sampletext.txt \\winsv\a\b\c \\sambasv\d\e\f $ cat readecho.sh #! /bin/sh while read STRING do echo -E "${STRING}" done < sampletext.txt $ ./readecho.sh \winsvabc \sambasvdef ←「\\」が「\」になり、「\」が消えている。NG $ cat awkprint.sh #! /bin/sh cat sampletext.txt | awk '{print $0}' $ ./awkprint.sh \\winsv\a\b\c \\sambasv\d\e\f ←上記のような問題はない。OK
443 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:42:21.68 ] >>442 read -r
444 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:42:48.66 ] つread -r
445 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:45:02.83 ] 普通はread -rだけどbashは知らん。
446 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:48:20.73 ] >>443-445 情報ありがとうございました うまくいきました bashでもreadは「Backslash does not act as an escape character.」だそうです なるほどreadで対処するのか... $ cat readecho.sh #! /bin/sh while read -r STRING do echo -E ${STRING} done < sampletext.txt $ ./readecho.sh \\winsv\a\b\c \\sambasv\d\e\f
447 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:55:51.24 ] >>446 > bashでもread -rは「Backslash does not act as an escape character.」だそうです と書きたかったのか?
448 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 22:27:14.08 ] AとBの処理があって、 Aを開始、 Bを開始 Bの中でAの処理中を待つことできますか? 意味わかりませんかね・・・ mkdirとかロック待ちみたいなやつです。
449 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 22:43:33.00 ] ロック待ちがわかるんなら、そのまんま A で mkdir lock して B で [ -d lock ] かければ? while 文で無限ループ作って、sleep でも挟めば十分「処理待ち」になると思うけど。
450 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 22:44:29.80 ] >>448 FreeBSDなら lockf(1)、Linuxならflock(1)を使ってなんとかしろ。
451 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 23:06:08.54 ] >>449-450 ありがとうございます。 がんばってみます。
452 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 23:18:55.14 ] >>450 なんで似てるようで違う名前なの?
453 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/10(土) 00:14:30.88 ] カレーライスとライスカレーみたいなモン
454 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/10(土) 09:50:04.49 ] うまいなあ。それイタダキマス。
455 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 03:13:24.48 ] a=0 for FILE in `find / \( -iname "zoo*.png" -o -iname "land*.png" -o -iname "zoo*.txt -o -iname "land*.txt" \)`; do rm -vf $FILE echo $a done 初心者です、スクリプト書いてみたんですが、この$aで表示される数がおかしくてこまってます。 なぜかrmコマンドでは1つも削除されておらずメッセージも表示されていないのに4と表示されるのです。 やりたい事としてはこうです↓ 「zoo*.png、land*.png、zoo*.txt、land*.txtというファイル名のファイルを全て削除し、その数をカウントする」 何がおかしいのでしょうか?
456 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 04:32:12.07 ] >>455 4が表示されるのはオカルト。君もうすぐ死ぬんじゃない? ファイルを削除して数をカウントしたいだけなら find ほにゃらら -print0 | xargs -0 rm -v | wc -l でよい。変数もforも必要ない。 4が出るのは君がオリジナルのスクリプトをここにコピペするときに何か端折ったせいだろう。
457 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 04:53:51.30 ] >>456 ごめんなさい、a=$(($a + 1))が抜けてました... にしてもこんなにコンパクトになるもんなんですね ありがとうございました
458 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:05:01.28 ] xargsは原始人の道具。 find ほにゃらら -exec rm -v {} + | wc -l で良い。
459 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:11:05.46 ] -deleteが使えるfindもある find ほにゃらら -delete -print | wc -l
460 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:14:18.54 ] >>458 -exec の方が古い感覚だけどどうなんだろ?
461 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:17:25.43 ] >>460 -exec ';' なら古い感覚 -exec + は新しい感覚
462 名前:460 mailto:sage [2012/03/11(日) 08:29:08.31 ] >>460 + はいま使っているマシンの中では使えない物がほとんどかも。 -exec は元々 Unix に魅せられたポイントなので、1989 年には使ってた。 xargs はネットで教えてもらって 1995 年頃から使い始めた。 けど確か元からあったかも。
463 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:32:05.19 ] >>462 -exec + はSolarisでさえ使えるのに、どんな古いOS使ってるんだよ?
464 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:54:41.56 ] POSIXにも入っていてSVR4由来(当然Solarisにもある)でHP-UXにもあるのに、 使えないのを探す方が難しいよね。 原始人と言われたからってムキになってウソを教えるのは良くないな。 www.pasc.org/interps/unofficial/db/p1003.2/pasc-1003.2-210.html | One of these extensions, which I believe is supported at least on all | systems derived from SVR4 and on HP-UX (although in some cases it is an | undocumented feature), is a variant of the "find -exec" primary where | "find" does argument aggregation internally: | | find . -type f -exec some_command {} +
465 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 09:52:56.43 ] ちょっと前までテンプレにfindの項があったと思うが、今は無くなってるな。 確かテンプレではfind -print0 | xargs -0推奨で、スレ内議論では-exec +を使えと主張する人がいた。
466 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:09:06.10 ] テンプレにあったのはfind -print | xargs という回答には必ず言いがかりが付け られていたから。質問者のためではなく回答者のためのテンプレ。 -exec {} + 構文が紹介されてからはxargsを使う意味がなくなったのか削除された。 それでもしばらくは-exec {} + を知らない原始人がいたけど、そのたびに原始人と 呼ばれて、絶滅していった。テンプレから削除されたのはこの時点(絶滅後)かも。 -exec {} + ですべてが置き換え可能とは言わないが、find+xargsが必要になること は極めてまれ。
467 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:32:32.19 ] うーむ、結局その2つ違いって何ですか? あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか?
468 名前:460 mailto:sage [2012/03/11(日) 10:44:50.32 ] 俺が xargs 教えてもらった頃は -exec は fork するから良くないと言われてた。 + は SVR4 に入っているのなら俺のもだいたい動くね。 でも俺まだ Tower の SVR2 や SVR3 とも格闘してるから。 ファイル名の長さが 14 文字までのやつ。
469 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:44:55.57 ] >>467 2つの違い -print0や xargs -0は使えないOSがある。 >パイプで繋がってしまっているrmを画面にも tee
470 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:55:09.82 ] >>467 1 find -exec \; 構文ではファイル一つ毎に別プロセスが起動されるので効率が悪い。 2 そこでまとめて処理できるようxargsが作られた。初出はPWBだからかなり古い find -print | xargs 3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた find -print0 |xargs -0 4 そんな面倒な事しなくて済むように-exec {} + 構文が作られた -exec \; 構文と違い、別プロセスは(MAX_ARGSを考慮して)まとめて実行される。 > あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか? find ほにゃらら -delete -print |tee /dev/tty| wc -l find ほにゃらら -exec rm -v {} + |tee /dev/tty| wc -l
471 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:56:05.20 ] > -print0や xargs -0は使えないOSがある。 例えば? どっちも相当昔からある気がするけど
472 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:58:21.95 ] >>471 ちょっとは自分で調べろよ。Solarisで-print0等が使えないのは常識。
473 名前:460 mailto:sage [2012/03/11(日) 11:04:39.92 ] >>470 + 便利そうだな。
474 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:06:35.90 ] -0はFreeBSD 2.1.5-RELEASEにはない。FreeBSD 2.1.6.1-RELEASEにはある。 相当昔といえば言えなくはないが。 www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.5-RELEASE&arch=default&format=html www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.6.1-RELEASE&arch=default&format=html
475 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:22:05.20 ] 結局、自分が使ってるOSで使える方法を使えって結論になってるよね毎回
476 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:29:54.60 ] 答える側は質問者の環境を想像すべきだな。 SVR[23]のような骨董環境前提の回答なんか意味ない。
477 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:38:38.97 ] それなら結局xargsでも-exec +でもどっちでも良いんじゃない?十分に新しいLinux/*BSD環境前提なら。 自分はタイプ数の多いxargsは使わないけどね。 無用な-exec \;と-0無しのxargsさえ避ければ良い。 そもそも今回は-deleteが使えるならxargsも-exec +も要らないし。
478 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:42:53.84 ] >>477 だから、使える方法を使えばいいってことでしょ? 結論見えてないの?
479 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:51:09.25 ] >>469 >>470 できました!!ありがとうございましたm(_ _)m
480 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 15:05:46.64 ] >>470 > 3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた 改行というか、広い意味での空白($IFS)だな。
481 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 15:27:32.53 ] xargsは、$IFSの改行/スペース/TABだけじゃなく、 シングルクォート/ダブルクォートも解釈しちゃうという問題がある。 it_don't_mean_a_thing.mp3 とかのファイル名もそのまま通らない
482 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 20:30:34.37 ] こういうイヤーンなファイル名があるときって、makeが通らなくなって難儀する。 コロン(:)が含まれてるファイル名なんか最悪。。 FILES = $(wildcard *.mp3) $ make hoge Makefile:〓: *** multiple target patterns. Stop.
483 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 22:43:26.33 ] なんかもう素人の集団みたいになってるな 基本的な歴史としては>>470 の通りなんだが 現代においてはfindで引っかるファイル数が数十万〜数百万ということも珍しくなくなった そしてそのような場合{} +では処理できない、というか渡された先が悲鳴を上げる だから 5. としてxargsを-n付きで使うようになったわけ >>481 みたいな問題にもちゃんと解法はある、つーかググレカス ゆえに{} +はファイルを渡す先が確実に処理できると確信できる場合だけ使うべきで 癖をつけるなら-print0 | xargs -0の流れが正しい 何か問題が起きてもxrgsにオプション足すだけで解決する つーか、初期の頃はちゃんとそう説明する奴が居たはずだけどな…
484 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:15:55.26 ] >>483 > 現代においてはfindで引っかるファイル数が数十万〜数百万ということも珍しくなくなった > そしてそのような場合{} +では処理できない、というか渡された先が悲鳴を上げる <limit.h>に従った正しいプログラムなら何の問題もないです。 > だから 5. としてxargsを-n付きで使うようになったわけ これはあほなプログラム向けです。
485 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:18:50.93 ] 不特定個数の引数をとれるという仕様にもかかわらず悲鳴あげるのはバグ。 引数の個数に制限がある場合にはxargs -nも有効だが、そんなヘナチョコ コマンド出会ったことない、具体的には何?
486 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:24:03.91 ] >>483 その根拠は何? pubs.opengroup.org/onlinepubs/009604599/utilities/find.html > The size of any set of two or more pathnames shall be limited > such that execution of the utility does not cause the system's {ARG_MAX} > limit to be exceeded. >>484 あほなプログラムの実例 savannah.gnu.org/bugs/?func=detailitem&item_id=16738
487 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:37:58.77 ] というわけで2006年以前のfindutilsを使う可能性がある人は、 バグがあるので -exec {} + はやめたほうがいいということになるのかな
488 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 07:42:10.36 ] >>483 は渡された先が悲鳴あげるといっているので、それは違う。 もっとも、>>483 がその区別をつけられないだけかも知れないが。
489 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 17:53:31.98 ] 結局>>483 はボケ老人のタワゴトって結論でいいですか? ・悲鳴あげるヘナチョココマンドの存在は不明 ・>>481 のようなケースも-print0, -0で対処できるている。
490 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:00:08.91 ] >>489 >>481 はそういうことを言ってるんじゃない。 >>480 が $IFSだけが問題と言っているのでは誤解を生じるので、 それだけじゃなくクォートも、と言う話。
491 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:05:46.84 ] >>490 ボケ老人のタワゴトとは>>483 の↓この発言。>>481 の指摘は正しい。 > >>481 みたいな問題にもちゃんと解法はある、つーかググレカス
492 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:22:03.41 ] まあxargs対策でエスケープすればいいんだから、findの出力をfilterするなり解法はあるわな。 > 何か問題が起きてもxrgsにオプション足すだけで解決する こっちのほうが問題では。
493 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:28:41.55 ] GNU findutilsは、デリミタを指定すると(-d, -0)、quoteは無視するようになっている。 他のfindは使ってないので知らないが。
494 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:29:11.30 ] print0でNUL文字を区切りにしたんだから、ファイルシステムに 許されているいかなる文字もこれで対応でしょ。 > 何か問題が起きてもxrgsにオプション足すだけで解決する その問題とは? >>483 のボケた脳内にある悲鳴あげるコマンド しかないのですよ。
495 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 19:10:17.94 ] 今までなかったからこれからもないと信じるのはどうなのと思わなくもない
496 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 19:15:52.59 ] >>483 の脳内には現実に存在するみたいですよ。
497 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:17:38.36 ] お前らって、本当、どうしようもないバカだよな ちったぁ議論らしいことをしたいなら、前提について定義しろよ お前ら何のOSの事を想定してんだ?Solarisか?AIXか?386BSDか?バージョンは?え? 使ってるコマンドはどこの物だ?OSについてきたコマンドか?GNUのやつか?バージョンは?え? そこが全然明確じゃないから、いっつもいっつもループしてんのか前に進んでんだか 前にも進んでないんだか分からねえグダグダ展開になってんじゃねえか お前らの脳内それぞれで、前提狂った状態で、全然違うOSの事で話をしてたって、 意味も価値も実りある結論も、何もありゃしねえんだよ お前らって、本当、どうしようもないバカだよな
498 名前: 忍法帖【Lv=2,xxxP】 mailto:sage [2012/03/12(月) 22:21:20.93 ] 結局どっちがいいの? find . -print0 | xargs -0 -I{} mv -vb {} ../tmp とかした時って同名なのにバックアップ取られないファイルがあったんだけど、-exec +ならちゃんとバックアップされる?
499 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:24:10.73 ] >>497 バカからも得られるものはあるものさ バカってのはこういう事を考えてるんだ、こんな風に誤解してるんだ、その程度しか知らないんだ、 じゃあ分かってない人はその辺が分かっていないのかもしれないから、ちょっと注意しよう そんな目線での考察や気づきは、やっぱりバカからしか得られないものなのさ
500 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:33:58.20 ] 分かりやすい自演
501 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:37:33.62 ] >>498 find、xargs、mvの仕様、及びファイル名の状態(空白含んでるとか、日本語ファイル名だとか)次第 どんな名前のファイルがこようがこれなら何でもOKという万能包丁は、ぶっちゃけ無い FAQにも割とマジで"Use Samba and explorer.exe"ともある
502 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:04:49.76 ] バックグラウンドで何かを起動すると、 ジョブ番号とPIDが表示されるじゃないですか。 あれって表示させなくする方法ってあるんでしょうか? 時間のかかる処理をバックグラウンドで走らせて その間に別の処理をやって、waitで同期する、 みたいなことをやるスクリプトで、邪魔なんですよね。
503 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:08:46.69 ] >>498 両方使えば?っていう初心者の意見です
504 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:19:19.45 ] >>502 スクリプト実行しているシェルは何?
505 名前:名無しさん@お腹いっぱい。 [2012/03/12(月) 23:21:09.67 ] bourne shだったりcshだったり。 Solarisです。
506 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:30:30.20 ] csh使うのやめろ shは出ない
507 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:46:04.45 ] >>497 >>1
508 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:46:40.54 ] >>498 やってみればわかるよ
509 名前:265 mailto:sage [2012/03/13(火) 00:27:03.89 ] >>508 find . -exec cp -vb ../tmp + find: -exec: no terminating ";" or "+" だって・・・
510 名前:265 mailto:sage [2012/03/13(火) 00:27:31.16 ] まちがえた find . -exec cp -vb {} ../tmp +
511 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 04:25:42.37 ] 結局、print0 とかが必要になるのは Windows でファイルを処理しきれなかった時ばかりなので Unix 上のコマンドじゃなく Windows ネイティブな UNIX-Like tools が 完璧なファイル名対応出来ればいいんだけどな。 Unix 上ではそんなファイル作らない。
512 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 10:06:48.40 ] みんなそんなに移植性必要なの?
513 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 10:12:13.36 ] > 結局、print0 とかが必要になるのは > Windows でファイルを処理しきれなかった時ばかりなので 違うよ。root権限で動作するスクリプトが毒食わせられないための用心。
514 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 10:38:44.75 ] >>512 移植性が必要ならシェルスクリプトなんて使わないよ
515 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 12:31:59.14 ] ワンライナー手打ちするだけならそれこそどうでもいいし それ以上気を遣いたいんなら、単にLL使えばよくね Perlなら昔から標準でfind2perlとかついてくるし
516 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:03:21.13 ] シェルスクリプトを作る際の考え方はある程度使いまわせるが、移植性は低いわな実際 まぁ考え方っつっても、それは別にシェルスクリプトでしか習得できない考え方ではないけれど
517 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:19:15.02 ] autotoolsの中の人に聞かせてあげたい
518 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:27:28.51 ] 移植性のために数多くの制約に縛られるなんてのは、 シェルスクリプト的に本末転倒なことなのさ
519 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:30:41.17 ] いや、移植性を突き詰めていくとシェルスクリプトで全部やるという結論に至る。
520 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:50:33.10 ] 幸か不幸か自分のやりたい作業はシェルスクリプトで済んでしまう。perlもpythonもいらない。 だから(個人的には)シェルスクリプト GREAT! だね。
521 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 03:14:56.05 ] 質問です。 cp a.txt b.txt というシェルスクリプトが書かれた『hoge.sh』をダブルクリックで実行した場合、 普通はなんの反応もなく、コピーが実行されます。 これを、実行されたコマンドを端末に表示させることはできるでしょうか? はじめから端末内で bash hoge.sh とすればいいのですが、深い階層にあって面倒なので…。 それに、この場合も何のコマンドが実行されたのかが分かりません。
522 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 06:51:12.07 ] >>521 hoge.shに以下のように書いておく。 xterm -e sh -xc 'cp a.txt b.txt; set +x; echo -n Hit any KEY:; read key'
523 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 12:25:04.10 ] >>522 ありがとうございました m(_ _)m
524 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 23:14:00.92 ] tarって入力されたデータをそのままの順でアーカイブするけど -Tで渡すファイル名をソートする意味ってあるかな?
525 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 18:42:17.16 ] tarはアーカイブの先頭からファイルを展開していく 遅いテープに書き込むときに、早めに参照したいファイルをアーカイブの先頭付近に書いておくと 早めに展開される そんな特性があるので、その特性を活かすためにアーカイブするファイルの順序を指定することは、 意味がある わざわざソートして渡してるなら、その特性を理解してないだろうから、意味ないだろう
526 名前:名無しさん@お腹いっぱい。 [2012/03/15(木) 21:04:05.76 ] どなたか↓わかる方、今週末中にお願いします。 ──────────────────────────────────── 不定個数の整数の引数を与えて実行すると,それらの整数のGCMとLCMを計算して 表示するようなシェルスクリプトを作成せよ.使用シェルは/bin/shとする. 【実行例】 $ ./kadai15.sh 12 20 24 GCM = 4 LCM = 120 ────────────────────────────────────
527 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 21:51:58.41 ] GCMとLCMがわからん
528 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 22:02:52.24 ] lcmは最小公倍数だね。 gcmは最大公倍数? w
529 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 22:13:31.83 ] Greatest Common Measure Least Common Multiple >>528 はアホ
530 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 22:20:19.95 ] 最大公倍数 最小公約数
531 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 00:21:54.70 ] 本当にどうでもいいことだが、gcm ってメジャーなんでしょうか? 普通の数学では gcd が圧倒的で、gcm は数学教育の教科書でしか 見たことがない。
532 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 00:26:08.56 ] 数学板で聞いたら。
533 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 00:49:16.79 ] en.wikipedia.org/wiki/Greatest_common_divisor ejje.weblio.jp/content/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%B4%84%E6%95%B0
534 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 01:11:00.95 ] SEだが>>526 がわからんくて死にたい。 整数と小数の判定ってシェルでどうやんの?
535 名前:531 mailto:sage [2012/03/16(金) 01:13:58.15 ] メジャーなんですねgcmだけに、と無理矢理言っておきます
536 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 05:58:58.34 ] gcd() { a=$1; b=$2 while [ $b != 0 ]; do t=$(($a % $b)); a=$b; b=$t done echo $a } t=$1; shift for i; do gcd=`gcd $t $i` lcm=$(($t * $i / $gcd)) t=$lcm done echo gcd:$gcd lcm:$lcm
537 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:15:25.61 ] >>536 不正解 引数 12 20 24 の時、 gcd:12 lcm:120 と表示される。 正しくは GCM = 4 あと、/bin/shでは動かない $(( )) とか
538 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:43:40.34 ] >>537 freebsd の /bin/sh で動いたが