1 名前:login:Penguin mailto:sage [2008/05/17(土) 13:44:57 ID:9hFWtCOD] UNIX板のスレを見ている方も多数おられるかと思いますが、 まあそれはそれとして、BASHウゼーとか言われる心配なく 平和にLINUX的スクリプト談義しましょうよ。 初めての自作スクリプト、自信ないから見てください。な初心者から トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで いろいろな人に参加して頂けると嬉しいです。 perlやらPythonやらの話が混ざっても良いんでない? Part3 : pc11.2ch.net/test/read.cgi/linux/1184077033/ Part2 : pc11.2ch.net/test/read.cgi/linux/1154578200/ Part1 : pc8.2ch.net/test/read.cgi/linux/1121994321/ >>2-5 あたりに色々と。
520 名前:login:Penguin mailto:sage [2008/10/24(金) 10:02:49 ID:2zYy9Dkj] >簡単な例でけっこうですので grep 'atコマンドなど' /var/log/messages > /tmp/hoge
521 名前:login:Penguin [2008/10/24(金) 20:25:05 ID:14T+pOpU] >>517 /etc/syslog.conf とか? 外してたらごめん
522 名前:login:Penguin mailto:sage [2008/11/02(日) 21:57:45 ID:AykxzKW2] シェルスクリプト関連の本って今では結構いろいろ出てるけど、どれがいいんだろう? シェルって何?って人に最適な本もあるだろうし、実務でスクリプトを書く人に最適な本もあるはず。
523 名前:login:Penguin mailto:sage [2008/11/02(日) 22:12:17 ID:XwJU1nJV] >>522 Advanced Bash-Scripting Guide tldp.org/LDP/abs/html/
524 名前:login:Penguin mailto:sage [2008/11/02(日) 22:51:26 ID:AykxzKW2] >>523 な、なにこれスゲー。今悩んでる問題が二つ解消した。たった数分読んだだけで。
525 名前:login:Penguin mailto:sage [2008/11/03(月) 00:18:52 ID:iKa/7Y2g] その2つを語ってみたまい。 「そんなことで悩んでいたのかクソ馬鹿」と罵倒してあげるから。 …いえ、ウソです。
526 名前:login:Penguin mailto:sage [2008/11/03(月) 01:46:09 ID:jQDIWjiF] 板違いだったらごめんなさい なぜ find には -exec があるんですか?パイプ では駄目?
527 名前:login:Penguin mailto:sage [2008/11/03(月) 02:48:26 ID:bJlJMSV4] #スレ違いと思うけど、それは置いて。 findに-print0が無かった頃、 find ... -print | xargs rm としたら思わぬ結果になり、 find ... -exec rm {}\; と習慣づけるようにしたような、淡い記憶がある。 記憶違いかもしれないけれど。
528 名前:login:Penguin mailto:sage [2008/11/03(月) 11:40:47 ID:+Mz0PYlF] >>526 一個一個に対してコマンドを実行したいとき。 whileとreadで回すほどでもないときに使う。 xargsはなんかそんな気分の時に使う。
529 名前:login:Penguin mailto:sage [2008/11/04(火) 00:03:44 ID:28eBvx3Z] xargs rm だと一個一個消す訳じゃないらしいけど その理屈がようわからん どうやってんの?
530 名前:login:Penguin mailto:sage [2008/11/04(火) 01:51:16 ID:lE3PYV5Z] x68000.q-e-d.net/~68user/unix/pickup?xargs
531 名前:login:Penguin mailto:sage [2008/11/04(火) 06:42:20 ID:n6LEGgbQ] >>529 xargsの場合 rm a b c d -execの場合 rm a rm b rm c rm d
532 名前:login:Penguin mailto:sage [2008/11/04(火) 18:22:21 ID:IOim9jxY] だから、findでは -delete 使うか、末尾を\+にする。
533 名前:login:Penguin mailto:sage [2008/11/04(火) 20:33:27 ID:gko7k3GT] 「だから」って… 「findに-print0が無かった頃」と予めことわっているのに、 やはり無かった"-delete"とかを持ち出されても。
534 名前:login:Penguin mailto:sage [2008/11/04(火) 21:23:41 ID:W3AqIadF] -deleteなんてあったんだorz。 使い古したコマンドでも時々manを見るべきだな。
535 名前:login:Penguin [2008/11/08(土) 01:22:38 ID:/AB41I5S] どなたかご教授ください。 以下のような形式のログファイル(test.log)の処理を行っています。 # cat test.log 日付 ・・・・必要な情報@・・・・・・・必要な情報A・・・・・・・・・ 日付 ・・・・・・・・・・必要な情報@・・・・・・・・必要な情報A・・・・・ ※「・・・」には、ログのその他、不要な情報が入っています。 このtest.logの中で、1,2行目の必要な情報@と必要な情報Aのみを 抜き出して、別ファイルに保存したいです。 ■保存したい例 必要な情報@ 必要な情報A 必要な情報@ 必要な情報A awkを使おうと思ってたのですが、必要な情報の列(位置)が、 ログの行によって、まちまちでawkで処理する事が出来ません。 この「必要な情報」については、目印となる文字列が含まれているのですが、 grepのようなコマンドで、検索キーワードが含まれる行を抜き出すのではなく、 検索キーワードの該当する文字列そのものを抜き出すような方法は無いでしょうか。 分かりにくい説明で申し訳ありません。アドバイス頂ければと思います。 bashが良いのですが、他のシェルでも方法がありましたら、ご教授ください。
536 名前:login:Penguin mailto:sage [2008/11/08(土) 02:20:54 ID:Sn/dZhVJ] ^[^キーワード]*,と,[*キーワード]*$ をsedとかで消しちゃえばいいんじゃない?
537 名前:login:Penguin mailto:sage [2008/11/08(土) 08:26:09 ID:spq9OVhg] 「・・・」と略されたら、必要な情報と不要な情報の区切が解らへん。
538 名前:login:Penguin mailto:sage [2008/11/08(土) 10:43:36 ID:QmgRkUw9] awk を使うのなら、たとえば、こういうデータに対して aaa word1 bbb word2 ccc ddd word3 eee word4 fff zzz yyy xxx word5 ggg hhh iii #!/usr/bin/awk -f { line = "" for (i = 1; i<=NF; i++) { if ($i ~ /word/) { line = line "\t" $i } } sub(/^\t/, "", line) if (line != ""){ print line } } というのはどう? 改良の余地は大いにあると思うけれど。
539 名前:login:Penguin [2008/11/09(日) 00:42:41 ID:+8LPtwQh] bashでの配列について教えてください ファイルの内容を1行づつ読み込んで、変数に格納するには どうすれば良いでしょうか。
540 名前:login:Penguin mailto:sage [2008/11/09(日) 00:53:45 ID:WldBda9P] つ while read i; do echo $i; done < file つ IFS=' ' FILE=(`cat /etc/passwd`) echo ${FILE[21]}
541 名前:login:Penguin [2008/11/09(日) 01:04:17 ID:+8LPtwQh] >>540 ありがとうございました! こちらのほう、使わせて頂きます。 FILE=(`cat /etc/passwd`) echo ${FILE[21]}
542 名前:login:Penguin mailto:sage [2008/11/10(月) 00:15:54 ID:ZSdeBKA2] read
543 名前:login:Penguin mailto:sage [2008/11/10(月) 00:35:00 ID:KJ/5CLnz] 複数ディレクトリにある重複して存在してるファイルをリストアップしたいんですけど (同じ名前とは限らない) find dirA dirB dirC -exec cksum {} \; でチェックサムを出したところまではいいんだけど この値が一致してたらリスト出力するってのはどうすればいいでしょう?
544 名前:login:Penguin mailto:sage [2008/11/10(月) 07:43:00 ID:J2OShanR] 一致行の出力でよければ、 $ find ... | sort | uniq -OPTION 何かオプションが要るような気がするので、uniq(1)を見て。
545 名前:login:Penguin mailto:sage [2008/11/10(月) 12:58:27 ID:25jIkch2] >>535 awkでできないことなんかないよw 処理速度はきついが 普通に 【必要な情報】で検索すればいいだろ?列なんか関係なしに。
546 名前:login:Penguin mailto:sage [2008/11/10(月) 19:22:12 ID:zHbtNtaX] >>543 なんかいまいち find "$@" -type f -exec cksum \{\} \; | sort -k 1,2 | \ awk '{ if (c == $1 && s == $2) { print l, $0; l = ""; } else { c = $1; s = $2; l = $0 "\n" } }'
547 名前:login:Penguin mailto:sage [2008/11/10(月) 19:28:01 ID:K/Z638b2] 前スレの683-に出てたので参考までに
548 名前:login:Penguin [2008/11/10(月) 20:17:51 ID:TV5/2e6C] >>535 sed 正規表現 置換 パターンマッチ(\1 \2とか) ?
549 名前:login:Penguin [2008/11/10(月) 20:21:36 ID:TV5/2e6C] >>543 uniqは-wと-dが肝 あとfindには-type fも
550 名前:login:Penguin mailto:sage [2008/11/11(火) 00:28:16 ID:aoTr0xeG] 重複ファイルのリストアップ、まだやってたのか。 ほれ。 つ find a b -type f | xargs md5sum | sort | uniq -D -w 32
551 名前:login:Penguin mailto:sage [2008/11/11(火) 08:00:53 ID:bvC0wffI] いや、もうやっていない。10日が〆切だった。残念。
552 名前:login:Penguin mailto:sage [2008/11/11(火) 21:21:58 ID:sJWsKHcQ] 出力結果をテキストに書き出す時、複数行あるものを一行にまとめるにはどうすればいいですか?
553 名前:login:Penguin mailto:sage [2008/11/11(火) 21:25:37 ID:Skn7DdSq] >>552 改行を削除する
554 名前:login:Penguin mailto:sage [2008/11/11(火) 21:44:28 ID:sJWsKHcQ] 削除のためのコマンドが知りたいです。 trで改行を空白に置き換えるのはダメでした。
555 名前:login:Penguin mailto:sage [2008/11/11(火) 21:44:56 ID:CoD3HoI5] 個人的によくやるのは、 command | gawk '{printf("%s",$0)}'
556 名前:login:Penguin mailto:sage [2008/11/11(火) 22:05:38 ID:mJ48vZc0] tr -d じゃダメなの?
557 名前:login:Penguin mailto:sage [2008/11/11(火) 22:05:59 ID:sJWsKHcQ] ありがとうございます 試してみます
558 名前:login:Penguin mailto:sage [2008/11/11(火) 23:38:49 ID:et4tOJwy] cat hoge | tr -d "\n" > piyo こんなんで どうでしょうか
559 名前:login:Penguin mailto:sage [2008/11/12(水) 00:24:39 ID:xwzZIHRk] linuxのcrontab なスレが見つからなかったのでここで質問させてください Debian なのですが、 例えば 午前8時から18時まで20分おきにあるスクリプト(get-data.sh)を起動したいのですが /etc/cron.d/get-data.sh を用意して、 */20 8-18 * * * oreore /usr/local/get-data.sh というエントリを登録したのですが、実行されません。 */20 * * * * oreore /usr/local/get-data.sh だと20分おきに実行されます。 前者の記述はどこがおかしくて実行されないんでしょうか?
560 名前:login:Penguin mailto:sage [2008/11/12(水) 00:39:11 ID:eUoTfImJ] 記述はあってるけど、get-data.sh ってほんとはどこにおいてるの?
561 名前:login:Penguin mailto:sage [2008/11/12(水) 00:54:56 ID:81ljxwzq] >>559 レンジ指定を時と分で両方やるってかち合っちゃうんじゃないかな? 恐らく 0,20,40 8-18 * * * oreore /usr/loca/get-data.sh は出来るはず。
562 名前:login:Penguin mailto:sage [2008/11/22(土) 15:37:29 ID:qj5ispiW] cygwin環境なんですが P=00010001 Q=`expr length $P` R=`echo "32-$Q"|bc -l` for i in `seq $R` do P="0"`echo $P` done echo $P 不細工ですが、二進数の桁をそろえるスクリプトを書こうとしています 実行したところ、seq: invalid floating point argynebt 24 というエラーが出てしまいます bcの計算結果が整数として代入されず、seqの引数として不適当という事じゃないかな、と考えてるのですが じゃあどうしたらいいのか?とmanを読んでもさっぱり解りません どなたか教えてください
563 名前:login:Penguin mailto:sage [2008/11/22(土) 15:47:57 ID:XCvIqY7p] >>562 cygwin 使ってないから外してるかもしれんけど、 > R=`echo "32-$Q"|bc -l` > > for i in `seq $R` > 実行したところ、seq: invalid floating point argynebt 24 というエラーが出てしまいます $R に変な改行コードまで入ってるんじゃないの?
564 名前:login:Penguin mailto:sage [2008/11/22(土) 17:33:09 ID:8Embcy7k] 質問から外れるが、わしなら、 perl -e 'printf("%032b\n", 0b10001 )' とかで済ましてしまう気がする。
565 名前:login:Penguin [2008/11/22(土) 17:36:52 ID:lvsMYtv2] >>562 こっちのLinuxやCygwinは正常に実行できるよ ただ双方の環境とも $ seq "24 " って末尾にスペースくっつけてやると seq: invalid floating point argument: 24 ってなるよ もしかして後ろに何かくっついてる? # 敢えてロジック書くのは、勉強の為のシェルスクリプトかな
566 名前:login:Penguin mailto:sage [2008/11/22(土) 18:38:22 ID:qj5ispiW] >>563 >>562 試行錯誤しているうちに実行できました >$ seq "24 " >って末尾にスペースくっつけてやると ご指摘の通り、やはり余計な文字が入っていたのが原因のようでした よく解らないのですが、バッククォート部分にスペースが入り込んでいたのが悪かったかな…? >>565 >>564 >質問から外れるが ># 敢えてロジック書くのは、勉強の為のシェルスクリプトかな 一応目的があってやっていることなのですが、いちいち調べて勉強しないことには 前に進めない状態です… 正直調べる事に疲れてしまって、目的を遂げられるならもう何でもいいのですが…
567 名前:login:Penguin mailto:sage [2008/11/22(土) 18:39:59 ID:qj5ispiW] 肝心のお礼を忘れてしまいました >>563->>565 ありがとうございました これで何とか一歩前進です
568 名前:login:Penguin mailto:sage [2008/11/23(日) 01:16:33 ID:ahm0Z7lP] Cygwin は Linux じゃねーよ。
569 名前:login:Penguin [2008/11/24(月) 11:45:40 ID:qXSmazjs] echoでシングルコートで囲まれた文字列の中に、シングルコートとダブルコートを含ませた文字列を指定したいんだが、 以下のようになってしまう。 $ echo 'hello'"hello' > エスケープしてもだめだったんだが、どうすればいいんでしょうか?
570 名前:login:Penguin mailto:sage [2008/11/24(月) 11:48:58 ID:Ut9dLgFH] $ echo "hello'\"hello" hello'"hello
571 名前:login:Penguin mailto:sage [2008/11/24(月) 12:27:14 ID:lGu01kSy] 悪のりしたる。 $ echo 'hello\047\042hello' hello'"hello
572 名前:>>569 [2008/11/24(月) 14:10:49 ID:qXSmazjs] >>570 ありがとう! ちなみに、あえてシングルコートで文字列を囲みたい場合は、どうすればいいんですか? やっぱできませんかねぇ、、、
573 名前:login:Penguin mailto:sage [2008/11/24(月) 14:11:33 ID:O/sQuX/l] >>569 ダブルクオートを閉じてないから,続きの入力を求められてる。 シングルクオートの中ではエスケープできないから, シングルクオートを表示したかったら,ダブルクオートで囲むしかないね。
574 名前:login:Penguin [2008/11/24(月) 14:16:50 ID:qXSmazjs] >>573 へー、ためになります。
575 名前:login:Penguin mailto:sage [2008/11/24(月) 14:42:30 ID:UgOcYWXS] >>572 こうゆうことか? $ echo 'hello'\''"hello' hello'"hello
576 名前:login:Penguin mailto:sage [2008/11/24(月) 15:29:36 ID:WL2QfG05] >>575 シングルクォートの外じゃん。
577 名前:login:Penguin [2008/11/25(火) 01:20:38 ID:r0vzabBk] ログのディレクトリを消去したいと思うのですが、 rm -rf /var/hoge/log/* とすると/bin/rm Argument list too longと出てしまって消せません。 どうやったら 消せるでしょう? サブディレクトリもあります。
578 名前:login:Penguin mailto:sage [2008/11/25(火) 01:46:29 ID:xvFoqJfe] >>577 rm -rf /var/hoge/log mkdir /var/hoge/log /var/hoge/log/.moge は残したい、って場合はこれじゃだめだけど。
579 名前:login:Penguin mailto:sage [2008/11/25(火) 02:30:00 ID:qwKBFJS7] いや普通に考えたら find /var/hoge -exec rm {} \; とか find /var/hoge | xargs rm だろ?
580 名前:login:Penguin mailto:sage [2008/11/25(火) 02:34:44 ID:WFFUc0FW] for i in /var/hoge/log/*;do rm -rf $i;done じゃなくて?
581 名前:login:Penguin mailto:sage [2008/11/25(火) 02:36:41 ID:qwKBFJS7] >>580 ファイル多すぎて*展開できなくてエラーになってんだから無理じゃね?
582 名前:login:Penguin mailto:sage [2008/11/25(火) 02:39:23 ID:gfINAer7] >>577 echo /var/hoge/log/* | xargs rm -rf >>579 find 使うなら maxdepth とか使わないと無駄に処理が増えると思う。
583 名前:login:Penguin mailto:sage [2008/11/25(火) 02:53:59 ID:qwKBFJS7] >>582 いやだからファイル多すぎて*展開できないからエラーなんだろ? echoにも渡せないと思うんだけど・・・ 気のせいだったらすまんけど
584 名前:login:Penguin mailto:sage [2008/11/25(火) 02:57:22 ID:WFFUc0FW] シェルが*を展開するところまではできてるでしょ。 その結果をシェルからまとめて渡されたrmがエラー吐いてる訳で >/bin/rm Argument list too long
585 名前:login:Penguin mailto:sage [2008/11/25(火) 03:09:26 ID:qwKBFJS7] ああ確かにその通り echoの引数はARG_MAX超えても大丈夫?で、 xargsはrmに渡すときに調整?してくれるからこれが一番軽いと・・ 覚えときます
586 名前:login:Penguin mailto:sage [2008/11/25(火) 03:10:33 ID:gfINAer7] >>580 以前、くだ質にも同じこと書いた気がするけど rm を for 文の外に出して for i in AAAA/* ; do echo $i ; done | xargs rm -rf とかやった方が早いよ。 # 速度なんか気にしてないってのならスルーしてくれ。
587 名前:577 mailto:sage [2008/11/25(火) 04:35:06 ID:r0vzabBk] 色々提案ありがとうございます。 勉強になりました。 特に*はシェルには展開されている けどコマンドで弾かれているという認識は参考になります。 さて、最終的に採用したいと 思いますのは>>578 さんの rm -rf /var/hoge/log mkdir /var/hoge/log です。 これが圧倒的に早い。 1万個の空ファイルを削除するのに>>586 ですと 2.9秒ほどかかったのですが、>>578 ですと0.5秒ぐらいで終わっちゃいます。 やはり1つのバイナリの中で完結してしまうのは強いですね。 ありがとうございました。
588 名前:login:Penguin mailto:sage [2008/11/25(火) 07:54:57 ID:xvFoqJfe] find とか xargs の構文を忘れてても >>578 ならすぐ実行できるし。 もっと早く /var/hoge/log/ の使用を再開したいなら↓で。 mv /var/hoge/log /var/hoge/log.old mkdir /var/hoge/log rm -rf /var/hoge/log.old &
589 名前:login:Penguin mailto:sage [2008/11/25(火) 08:52:27 ID:6LjfCVVr] >>586 はまとめてrmに渡してるから同じエラーになんじゃないの?
590 名前:login:Penguin mailto:sage [2008/11/25(火) 11:08:32 ID:DFgMW53d] >>589 xargs使ってるから平気だよ
591 名前:login:Penguin [2008/11/25(火) 17:00:27 ID:JcNYShCy] 失礼します。シェルスクリプト作成がてんでわからないのでどなたか教えて下さい。 作るものは以下のものです。 1:引数に複数の整数を与えたときに、それらの和を計算するシェルスクリプトの作成。 具体的には $ ./sum.sh 1 2 3 4 5 15 のようになるシェルスクリプト 2:現在の時刻に応じて Good morning / Hello / Good evening / Good night のどれかを表示するシェルスクリプト (例えば、5:00〜11:00であればGood morningと表示) その際、引数として名前が入力されればその名前を、引数が 入力されなければ“sir”を付け加えて表示させる。 具体的には $ ./hello.sh Taro Hello, Taro. $ ./hello.sh Good morning, sir. となるシェルスクリプト どなたか宜しくお願いします。
592 名前:login:Penguin mailto:sage [2008/11/25(火) 17:03:09 ID:xvFoqJfe] >>591 来年は授業ちゃんと聞こうな。
593 名前:login:Penguin mailto:sage [2008/11/25(火) 17:04:41 ID:v/fLv6x4] 宿題丸投げとか、頭緩すぎるだろ
594 名前:login:Penguin mailto:sage [2008/11/25(火) 17:14:14 ID:D5OL3C0Q] >>591 同じところだwww 講師は2chを監視しているから注意な
595 名前:login:Penguin mailto:sage [2008/11/25(火) 17:44:18 ID:MTxeuCTC] #!/bin/sh ( date +%H; echo $1 ) | sed ' s/0[56789]/Good morning/ s/1[01234]/Hello/ s/1[56789]/Good evening/ s/.*/Good night/ N s/\n$/\nsir/ s/\n\(.*\)/, \1./ ' 足し算ってどうすんだ
596 名前:login:Penguin mailto:sage [2008/11/25(火) 17:56:31 ID:DFgMW53d] 宿題かよw shスクリプト 足し算 でググれば一発だろw
597 名前:login:Penguin mailto:sage [2008/11/25(火) 18:10:21 ID:MTxeuCTC] 一発だった^^ #!/bin/sh for i in "$@"; do echo $i; done | sed ' 1 {h; s/.*/hgfedcba/; x} H; g :a s/9$/aaaaaaaaa/; s/8$/aaaaaaaa/; s/7$/aaaaaaa/; s/6$/aaaaaa/ s/5$/aaaaa/; s/4$/aaaa/; s/3$/aaa/; s/2$/aa/; s/1$/a/; s/0$// s/\(aa*[^a]*\)\(a*\)/\2\1/ s/a\{11\}/ba/ y/hgfedcba/gfedcbah/ /^h/!ba; s/.$//; h; $!d s/\([a-z]\)\1\1\1\1\1\1\1\1\1/9/g; s/\([a-z]\)\1\1\1\1\1\1\1\1/8/g s/\([a-z]\)\1\1\1\1\1\1\1/7/g; s/\([a-z]\)\1\1\1\1\1\1/6/g s/\([a-z]\)\1\1\1\1\1/5/g; s/\([a-z]\)\1\1\1\1/4/g; s/\([a-z]\)\1\1\1/3/g s/\([a-z]\)\1\1/2/g; s/\([a-z]\)\1/1/g; s/\([a-z]\)/0/g s/^0*\(.\)/\1/ '
598 名前:login:Penguin mailto:sage [2008/11/25(火) 18:14:44 ID:DFgMW53d] >>597 sed好きなの? 一応、>>596 は >>591 に対して言ったつもりだからね^^
599 名前:login:Penguin mailto:sage [2008/11/25(火) 20:44:14 ID:b3v2wMU+] 普通はexprとかletなんだろうな あとはbcに渡しちゃうとか。 bashならこんな書き方もできるけどあまり使わないな。 $hoge=$[$1 + $2 + $3 + $4 + $5]
600 名前:login:Penguin mailto:sage [2008/11/25(火) 21:27:49 ID:Q3bl66bL] >>599 これははじめてみたなぁ $(())といいこれといい、演算機能つけるなら普通に $hoge=$1+$2+$3+$4+$5 みたいな書き方許してくれもいいのにね
601 名前:login:Penguin mailto:sage [2008/11/25(火) 22:33:31 ID:MTxeuCTC] $(( $1 + $2 )) はPOSIX shellの範囲にあるけど $[ $1 + $2 ] はbash拡張(しかもdeprecated)だ。letもPOSIXにない。
602 名前:login:Penguin mailto:sage [2008/11/25(火) 22:49:51 ID:+1wUZzkP] >>599-601 単なる宿題の手伝い、つまんね。sed狂の人ぐらいヒネってちょ。
603 名前:login:Penguin mailto:sage [2008/11/26(水) 01:23:56 ID:XqTaeM1U] $(( $1 + $2 )) これってできるんだ? $((hoge + hogehoge)) みたいな書き方しかできないと思い込んでた
604 名前:login:Penguin mailto:sage [2008/11/26(水) 16:54:19 ID:fRJ0bu/c] >>602 題意を満たしながらも難解で意味不明で実用性皆無なスクリプトを書くのも楽しいな。 #!/bin/sh echo $@`shift;echo -e \\\t|expand -t$#|tr \ +`p|dc とか。
605 名前:login:Penguin mailto:sage [2008/11/27(木) 12:25:07 ID:nbCEJRVf] 引数不定で最短なら (IFS=+;echo "$*")|bc とかどうだろう
606 名前:login:Penguin mailto:sage [2008/11/27(木) 13:28:41 ID:u0PIuWVz] >>604 シェルスクリプトにバイナリ埋め込んどくとかな。 …よく考えたら、これは悪どいな。 実行するまで何が起こるか判らないし、自分が生徒からこんなの 送りつけられたら無条件で○をあげてしまいそうだ。
607 名前:login:Penguin mailto:sage [2008/11/27(木) 17:14:51 ID:Rh4WMeZa] $ echo "#!/bin/bash" > hoge とすると bash: !/bin/bash": event not found とエラーになります。 $ echo "#\!/bin/bash" > hoge と ! をエスケープしたつもりでも $ cat hoge #\!/bin/bash と \ が余分に付いてしまいます。 !を上手くエスケープするにはどうしたら良いでしょうか?
608 名前:login:Penguin mailto:sage [2008/11/27(木) 17:30:00 ID:L8oSt/LM] よくわからないから '#!/bin/bash'
609 名前:login:Penguin [2008/11/27(木) 19:33:56 ID:JHgCmyIe] >>607 $ echo "#!/bin/bash" の解釈↓ $ man bash イベント指示子 (Event Designator) !string string で始まるコマンドのうち、一番現在に近いところで実行したものを参照します。
610 名前:607 mailto:sage [2008/11/28(金) 20:18:54 ID:yC0octAN] >>608 >>609 ダブルクォート内では ! のエスケープはできないようですね。 シングルクォートで囲むことにします。 ありがとうございました。
611 名前:login:Penguin mailto:sage [2008/12/07(日) 04:03:19 ID:wQWU7SKF] 厳密にはexpectの質問なので、スレ違いだはと思うのですが… 1 #!/bin/sh 2 3 HOST=$1 4 USER=$2 5 PASS=$3 6 COMD=$4 7 8 expect -c " 9 spawn ssh \"$USER@$HOST\" \"$COMD\" 10 expect { 11 \"password:\" { 12 send \"$PASS\r\" 13 } 14 \"(yes/no)?\" { 15 send \"yes\r\" 16 exp_continue 17 } 18 } 19 expect 20 " 21 echo $? 9行目でspawnしたsshの戻り値を得たいのですが、どうしたら良いでしょうか? 上記だと、当然ですが、21行目で表示されるのは8行目のexpectの戻り値になります。 あt、19行目のexpectが無いと動かないのですが、そんな物なんでしょうか?
612 名前:login:Penguin mailto:sage [2008/12/09(火) 09:16:00 ID:73r9bgNC] ssh-agent使った方が簡単。 1. exit statusはwaitを使って得て、exitでshellに引き渡してください。 2. 10行目のexpectで、パスワード、ホストキー以外の出力も食うようにする。
613 名前:login:Penguin mailto:sage [2008/12/13(土) 01:21:37 ID:jyj+RUH2] >>612 > 1. exit statusはwaitを使って得て、exitでshellに引き渡してください。 これのやり方をもう少し具体的にお願いできませんか? manに以下の記述はあるんだけど、 wait は、通常 4 つの整数のリストを帰す。最初の整数は、終了を待ち構え ているプロセスの pid である。 2 つめの整数は、関連する spawn id であ る。 3 つめの整数は、オペレーティングシステムエラーがあれば -1、そう でなければ、0 である。 3 つめの整数が 0 であれば、4 つ め の 整 数 はspawn さ れたプロセスからのリターンコードである。3 つめの整数が -1 であれば、4 つめの整数はオペレーティングシステムによって設定さ れ た errno の値である。 この値をどうやって受け取るのかわからないのです。 tarballのexampleの中も見てみたけど、waitから値を受け取るような処理は無いようでした。
614 名前:login:Penguin mailto:sage [2008/12/13(土) 22:44:02 ID:b12qnNPM] #!/bin/sh echo '何かオモシロいスクリプトをうpして'
615 名前:login:Penguin mailto:sage [2008/12/13(土) 22:49:30 ID:4TqEVqdZ] >>614 sudo su -c ”yes ’\(^o^)/’ > /dev/sda” これやってから、ハードディスクを覗くと楽しいよ
616 名前:login:Penguin mailto:sage [2008/12/14(日) 03:10:56 ID:YLiph78l] >>615 新しいなwww
617 名前:login:Penguin mailto:sage [2008/12/14(日) 03:51:27 ID:07cIEQdu] yesなんてコマンド始めて知ったわ。 健全な使い道あるのか?と思ってググったら 同じ疑問持ってる人が一杯いた。 rpm -e yes じゃ削除できないし。 GNUはこんなコマンド標準装備するな
618 名前:login:Penguin mailto:sage [2008/12/14(日) 04:46:19 ID:x3iOnWd3] >>617 つ yes no | rm -i ... rm -iのトコはまともにバッチ実行させてくれない色々なクサレプログラムに 置き換えて使え。
619 名前:login:Penguin mailto:sage [2008/12/14(日) 09:43:49 ID:M7gNbgdV] 誰のせいでもありゃしない みんなGNUが悪いのさ と「悲しき願い」の節で浮かんだ。 "yes"コマンドの責めまで負わせられるとはGNUも気の毒に。
620 名前:login:Penguin mailto:sage [2008/12/14(日) 09:45:30 ID:h0ChkGK1] ベースシステム=GNUなんだろうな。 だからGUI厨は・・・