シェルスクリプト総合 その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/
0228名無しさん@お腹いっぱい。
2013/02/21(木) 15:56:58.86モード切替どうやってするつもりだよ
0229名無しさん@お腹いっぱい。
2013/02/21(木) 21:47:15.772chmate
0230名無しさん@お腹いっぱい。
2013/02/22(金) 12:12:03.87エラーが出てtarが生成されません。なにが間違っているか教えてください。
strArch="~/Desktop/a.tar"
/usr/bin/tar cf ${strArch} 1.jpg 2.jpg 3.jpg
と書くと
/usr/bin/tar: ~/Desktop/a.tar: open 不能: No such file or directory
/usr/bin/tar: Error is not recoverable: exiting now
というエラーが出ます。
一方、
/usr/bin/tar cf ~/Desktop/a.tar 1.jpg 2.jpg 3.jpg
と書くと正常にa.tarが生成されます。
0231230
2013/02/22(金) 12:13:52.840232名無しさん@お腹いっぱい。
2013/02/22(金) 12:40:05.30変数の中のチルダは展開されない。
$HOME/Desktop/a.tar
を使え。
0233名無しさん@お腹いっぱい。
2013/02/22(金) 13:01:39.80できました!
ありがとうございました。
0234名無しさん@お腹いっぱい。
2013/03/06(水) 16:19:19.20/private/var/mobile/Library/SBSettings/Commandsにcom.hoge.imaprowl-launch-when-toggle-is-off
というスクリプトから、/private/var/root/scripts/に置いたprowlchk.shを実行してimaprowl.rbを起動
させたいのですが失敗してます。
ターミナルから直接prowlchk.shを実行すれば起動します。
com.hoge.imaprowl-launch-when-toggle-is-offの中身は
#!/bin/sh
touch /var/mobile/Library/Preferences/com.hoge.imaprowl.flagfile
echo "com.hoge.imaprowl-launch-when-toggle-is-off" >>/var/mobile/script.txt
source /private/var/root/scripts/prowlchk.sh
です。
0235名無しさん@お腹いっぱい。
2013/03/06(水) 16:27:07.05#!/bin/sh
ps ax | grep '[i]maprowl'
if [ $? -eq 1 ]; then
cd /private/var/root/IMAProwl
./imaprowl.rb
fi
です。
private/var/mobile/Library/SBSettings/Commands/com.hoge.imaprowl-launch-when-toggle-is-off
をターミナルから実行すると、
883 s000 R+ 0:00.02 /bin/sh ./com.hoge.imaprowl-launch-when-toggle-is-off
となって、ログにボタンが押された事は出力されてますが、
/private/var/root/scripts/に置いたprowlchk.shは実行されずに、imaprowl.rbが起動しません。
検索してみてcdじゃなくドットコマンドやらsource使えだの試してみましたが、限界です。
アドバイス下さい。
0236名無しさん@お腹いっぱい。
2013/03/06(水) 16:33:01.26のところで、
com.hoge.imaprowl-launch-when-toggle-is-off
自身が引っかかっててif文の内部が実行されてないんじゃないの?
0237名無しさん@お腹いっぱい。
2013/03/06(水) 17:07:14.830238名無しさん@お腹いっぱい。
2013/03/06(水) 17:18:45.56>>236さん有難う御座いました。助かりました。
0239234
2013/03/06(水) 20:58:57.40>>236さんのアドバイスで
/private/var/mobile/Library/SBSettings/Commandsにcom.hoge.imaprowl-launch-when-toggle-is-off
から
/private/var/root/scripts/prowlchk.shを実行させることが出来るようになったのですが、
IMAProwlがDaemon化に失敗しているのかすぐに落ちてしまいます。
ターミナルから直接/private/var/root/scripts/prowlchk.shを実行すると、
hoge:~ root# /private/var/root/scripts/prowlchk.sh
LoadConf: /private/var/root/IMAProwl/config.yml
hoge:~ root# Daemonized. PID=4412
All logs will be written into /var/root/logs/imaprowl.log.
となって、ps axで見てみると
4412 ?? S 0:02.23 /usr/bin/ruby ./imaprowl.rb
でstatがSでちゃんとimaprowlが動作するのですが、
com.hoge.imaprowl-launch-when-toggle-is-offからprowlchk.shを実行した直後に、
ps axで見ると
4549 ?? R 0:02.75 /usr/bin/ruby ./imaprowl.rb
でstarがRになっています。
もう一回ps axで見ると./imaprowl.rbが落ちています。
なんでSにならずにRになってしまうのか、全く見当が付きません。
prowlchk.shに不足や問題があるんでしょうか。
0240名無しさん@お腹いっぱい。
2013/03/10(日) 20:45:09.980241名無しさん@お腹いっぱい。
2013/03/10(日) 21:09:19.61ファイルの数での制限じゃなくて、引数(ファイル名)の文字列の合計のバイト数で制限される。
man sysconf で出てくる sysconf(_SC_ARG_MAX) の値が最大値。
普通2MB程度ある。
0242名無しさん@お腹いっぱい。
2013/03/11(月) 09:14:37.19「普通」と言い切るには辛いような。
>uname -sr; getconf ARG_MAX
FreeBSD 9.0-RELEASE-p3
262144
$ uname -sr; getconf ARG_MAX
Linux 2.6.18-194.11.4.el5
131072
$ uname -sr; getconf ARG_MAX
Linux 2.6.32-279.9.1.el6.x86_64
2621440
0243240
2013/03/12(火) 01:55:55.140244名無しさん@お腹いっぱい。
2013/03/12(火) 06:45:07.310245名無しさん@お腹いっぱい。
2013/03/12(火) 07:26:34.920246名無しさん@お腹いっぱい。
2013/03/12(火) 09:39:44.340247名無しさん@お腹いっぱい。
2013/03/12(火) 10:34:57.840248名無しさん@お腹いっぱい。
2013/03/12(火) 19:35:11.23MS 系の OS はほとんど使ったことがないので聞くんだけど,
Unix 系でも, tty からの入力に対しては別の制限があること
はあるけど, それは, スクリプト内部の処理でも同様だったの?
だとすると, グロブの展開できないんじゃないの?
0249名無しさん@お腹いっぱい。
2013/03/12(火) 20:06:02.97だったところに初期値としてコマンドライン引数が展開された。
グロブの展開はシェルの仕事ではなく、プログラムが自分でやる。
MS-DOSの新しい奴は知らん。
0250 忍法帖【Lv=4,xxxP】(1+0:8)
2013/03/12(火) 21:04:44.160251名無しさん@お腹いっぱい。
2013/03/12(火) 21:08:27.160252名無しさん@お腹いっぱい。
2013/03/12(火) 21:35:11.650253名無しさん@お腹いっぱい。
2013/03/12(火) 22:16:08.230254名無しさん@お腹いっぱい。
2013/03/13(水) 07:44:16.190255 忍法帖【Lv=4,xxxP】(1+0:8)
2013/03/13(水) 07:53:20.45Redhatで出来てるけど
0256名無しさん@お腹いっぱい。
2013/03/13(水) 08:59:58.41書く順番が逆じゃんw
linuxのpsはどっちも理解する。
0257名無しさん@お腹いっぱい。
2013/03/13(水) 09:36:44.66linuxっていうかGNUのpsな
0258名無しさん@お腹いっぱい。
2013/03/13(水) 12:40:03.05もとより順番揃えて書いてないんだけど・・・
0259名無しさん@お腹いっぱい。
2013/03/13(水) 12:52:37.700260名無しさん@お腹いっぱい。
2013/03/13(水) 17:23:13.42メインスクリプトから裏で呼び出されるため、コンソール上でエラーを確認できなかった。
一晩みても、原因不明だった。 echo ここまでOK >>log.txt を随所に入れて
トレースデバッグすると、途中で止まる。あきらめて寝た。
翌日、再開したら1分で原因判明!
他言語とゴッチャになって、1箇所だけコメントの先頭をセミコロンにしてたwww
#に直したら一発起動。はぁあああああああああああ。
あとテストの [ $a =1 ] とイコールの次にスペースを開け忘れて、
常に不動作のif文もあった。
こういう超基本的な凡ミスに対して、作りたてのスクリプトを流し込むと
アラートを出すツールってありますか?
windows上でもシェル上でも、どちらでもおkです。
0261名無しさん@お腹いっぱい。
2013/03/13(水) 17:40:25.41それってどうやってミスなのか意図的なのか判断するんだよ?
キミがミスした所は使い方によっては正しい場合もあるんだよ。
0262名無しさん@お腹いっぱい。
2013/03/13(水) 17:40:46.27ハイ次↓
0263名無しさん@お腹いっぱい。
2013/03/13(水) 17:56:47.43そりゃそうなんだけど、イコールの次にスペースないよ、とかwarningレベルで教えてくれるとか
http://server-retrieval.sakura.ne.jp/sakura/ga/g10.gif
こういうの、ないの?
0264名無しさん@お腹いっぱい。
2013/03/13(水) 17:57:47.72横槍を入れてすまんが、
「これってミスじゃねーの?」っていちいち指摘してくるコンパイラがあるのだから、
シェルスクリプトも同様の支援プログラムがあってもよいのでは。
需要があるのかどうか知らないが。
0265名無しさん@お腹いっぱい。
2013/03/13(水) 18:25:45.280266名無しさん@お腹いっぱい。
2013/03/13(水) 18:26:09.13ないよ。
0267名無しさん@お腹いっぱい。
2013/03/13(水) 18:28:30.23需要はあるね
走行するまでわからん、ってのはダサいからな
0268名無しさん@お腹いっぱい。
2013/03/13(水) 18:29:08.34その=はファイル名の=かもしれないからなぁ
[ $a =1 ]
はもしかしたらa='-d'でファイル「=1」がディレクトリかどうか
判断してる場合もあるよ
ところで数値のテストをしたいなら
[ $a -eq 1 ]
とした方が良いんじゃないかな
0269名無しさん@お腹いっぱい。
2013/03/13(水) 18:33:28.83warningはほしいよな
Cコンパイラですら = と == は警告対象だ
0270名無しさん@お腹いっぱい。
2013/03/13(水) 18:38:16.82それはそれでウザいんだが。
0271名無しさん@お腹いっぱい。
2013/03/13(水) 18:42:23.86必要だと思う人が作ればいいさ。
0272名無しさん@お腹いっぱい。
2013/03/13(水) 18:46:38.57他の人には必要ないよ。
0273名無しさん@お腹いっぱい。
2013/03/13(水) 22:01:47.54「カッコウはコンピュータに卵を産む」で、侵入者が使ったpsコマンドの
オプションから、SysVユーザーと看破していた。
0274名無しさん@お腹いっぱい。
2013/03/13(水) 22:25:37.580275名無しさん@お腹いっぱい。
2013/03/14(木) 11:50:50.62-n でチェックしてるときは出してほしいな
0276名無しさん@お腹いっぱい。
2013/03/14(木) 11:51:35.63まじか。そんなかっこいい小説だったのか。
0277名無しさん@お腹いっぱい。
2013/03/14(木) 16:17:13.28list.txtに
a 111
b 222
c 333
といった各行二つの要素のデータを格納しています。
それぞれの行について、一つ目の要素をファイル名に、二つ目の要素をファイルの中身に
しようと思います。
a.txtの中身は111
b.txtの中身は222
c.txtの中身は333
といったたぐいです。
書いたスクリプトは
#!/bin/bash
for a in `awk '{print $0}' list.txt`
do
for b in `awk '{print $1}' list.txt`
do
echo $a >$b.txt
done
done
とした結果全てのファイルの中身が111となってしまいました。
for文を理解出来ていないように思います。
どなたか救いの手をよろしくお願いします。
0278名無しさん@お腹いっぱい。
2013/03/14(木) 16:29:15.04echo "$data" > "$filename"
done < list.txt
0279名無しさん@お腹いっぱい。
2013/03/14(木) 16:40:39.76readのあとに変数を並べればその順番に読み込むことを
教えていただきありがとうございました。
一行ずつデータを読むreadと
無限ループのwhileの組み合わせを用いると。
多謝
0280名無しさん@お腹いっぱい。
2013/03/14(木) 16:56:50.180281名無しさん@お腹いっぱい。
2013/03/15(金) 10:43:03.350282名無しさん@お腹いっぱい。
2013/03/15(金) 12:07:01.540283名無しさん@お腹いっぱい。
2013/03/15(金) 12:14:48.150284名無しさん@お腹いっぱい。
2013/03/16(土) 00:36:18.610285名無しさん@お腹いっぱい。
2013/03/16(土) 00:48:46.58いつかはマシンがお亡くなりになって終わるんじゃね?
0286名無しさん@お腹いっぱい。
2013/03/16(土) 01:40:44.77対話と一括を比較されても。
0287名無しさん@お腹いっぱい。
2013/03/16(土) 01:54:23.550288名無しさん@お腹いっぱい。
2013/03/16(土) 02:24:05.98癖の回避?
0289名無しさん@お腹いっぱい。
2013/03/16(土) 02:51:57.34シェルスクリプトでバッチ処理書けよ。
0290名無しさん@お腹いっぱい。
2013/03/16(土) 02:57:24.950291名無しさん@お腹いっぱい。
2013/03/16(土) 03:27:10.82仕様の提示をお願いします
0292名無しさん@お腹いっぱい。
2013/03/18(月) 10:03:03.010293名無しさん@お腹いっぱい。
2013/03/18(月) 11:16:27.600294名無しさん@お腹いっぱい。
2013/03/18(月) 12:18:58.230295名無しさん@お腹いっぱい。
2013/03/18(月) 12:47:55.910296名無しさん@お腹いっぱい。
2013/03/18(月) 14:06:22.94おまえヒアドキュメントでsshのパスワード入力できんのかよ
0297名無しさん@お腹いっぱい。
2013/03/18(月) 14:40:08.450298名無しさん@お腹いっぱい。
2013/03/20(水) 09:12:19.32ssh 自動化させるならパスフレーズ設定しない公開鍵作成しろよ。
0299名無しさん@お腹いっぱい。
2013/03/20(水) 10:01:53.76公開鍵使えよ。
0300名無しさん@お腹いっぱい。
2013/03/20(水) 13:11:02.19できないサーバがあるんだよ
0301名無しさん@お腹いっぱい。
2013/03/20(水) 13:30:49.450302240
2013/03/20(水) 14:17:01.940303名無しさん@お腹いっぱい。
2013/03/20(水) 14:47:31.510304名無しさん@お腹いっぱい。
2013/03/20(水) 14:56:14.39manのDBがぶっ壊れたんじゃねーの?
mandb -c
でもやっときゃ治るんじゃね?
0305名無しさん@お腹いっぱい。
2013/03/20(水) 15:54:26.54nroff -man とか -mandoc とかでは見えるのか?
0306名無しさん@お腹いっぱい。
2013/03/20(水) 16:29:00.10それは自動化するなってポリシーだろ。
0307名無しさん@お腹いっぱい。
2013/03/20(水) 16:34:18.88スレ違い
0308名無しさん@お腹いっぱい。
2013/03/20(水) 16:50:03.97そんなポリシー知ったことか
0309名無しさん@お腹いっぱい。
2013/03/20(水) 18:25:40.65ならヒアドキュメントに書けよ。
0310名無しさん@お腹いっぱい。
2013/03/20(水) 18:47:24.36で、>>308 サーバーがクソだという結論(sshの場合は)
対話が必要ってことは人間(>>308)にも使い道があるってことだよ。
なるべく減らした方が良いのは言うまでもないけど難しいね。
すれ違いだけどsshにはssh-agentとかagent forwardとかあるから
そういうことにも配慮されてる。agent forwardするとbackgroundで
動かしつつlogoutすると新規に接続できなくなるけど。
0311名無しさん@お腹いっぱい。
2013/03/20(水) 18:54:36.87ヒアドキュメントじゃ動かないよ・・・
0312名無しさん@お腹いっぱい。
2013/03/20(水) 18:56:53.20リモートでシェルコマンド実行したいときは仕方なくexpect+rlogin使ってるらしい
何を考えてそういうポリシーになってるのかは謎
0313名無しさん@お腹いっぱい。
2013/03/20(水) 19:48:21.83expectの中に書くってことだよ。
0314名無しさん@お腹いっぱい。
2013/03/20(水) 21:20:00.49どうやってサーバーサイドで公開鍵のパスフレーズ必須にできるんだよ。
0315名無しさん@お腹いっぱい。
2013/03/20(水) 21:40:52.890316名無しさん@お腹いっぱい。
2013/03/20(水) 21:45:17.550317名無しさん@お腹いっぱい。
2013/03/20(水) 21:46:23.080318名無しさん@お腹いっぱい。
2013/03/20(水) 21:47:36.650319名無しさん@お腹いっぱい。
2013/03/20(水) 21:58:29.79出来るから、それと混同してるんじゃないかな。
0320名無しさん@お腹いっぱい。
2013/03/20(水) 22:46:51.790321名無しさん@お腹いっぱい。
2013/03/20(水) 22:58:21.11もう1つ方法があるだろ、知らないのか?
0322名無しさん@お腹いっぱい。
2013/03/20(水) 23:33:19.79ないよ。
0323名無しさん@お腹いっぱい。
2013/03/20(水) 23:40:01.59バカに教えておいてやる。rfc4252で定義されている認証方式は
7. Public Key Authentication Method: "publickey"
8. Password Authentication Method: "password"
9. Host-Based Authentication: "hostbased"
の三種類。このうち公開鍵を利用した認証方式は7と9
7,9のどちらもパスフレーズは送らない。
0324名無しさん@お腹いっぱい。
2013/03/21(木) 00:14:14.882chの情強視点の正しい使い方。
0325名無しさん@お腹いっぱい。
2013/03/21(木) 00:44:29.260326名無しさん@お腹いっぱい。
2013/03/21(木) 01:09:02.59たださらに間違いを重ねてくる場合も。微妙に間違える場合も。自分で確認しろってことやね
0327名無しさん@お腹いっぱい。
2013/03/21(木) 01:29:06.00サーバサイドってか、会社のポリシーで強制してんじゃないの。
■ このスレッドは過去ログ倉庫に格納されています