トップページunix
987コメント278KB

シェルスクリプト総合 その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
>>227
モード切替どうやってするつもりだよ
0229名無しさん@お腹いっぱい。2013/02/21(木) 21:47:15.77
>>226
2chmate
0230名無しさん@お腹いっぱい。2013/02/22(金) 12:12:03.87
シェルスクリプト内でtarアーカイブ化するとき、アーカイブ名に変数を指定したいのですが、
エラーが出て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が生成されます。
02312302013/02/22(金) 12:13:52.84
環境はcygwinで、シェルはbashです。
0232名無しさん@お腹いっぱい。2013/02/22(金) 12:40:05.30
>>230
変数の中のチルダは展開されない。
$HOME/Desktop/a.tar
を使え。
0233名無しさん@お腹いっぱい。2013/02/22(金) 13:01:39.80
>>232
できました!
ありがとうございました。
0234名無しさん@お腹いっぱい。2013/03/06(水) 16:19:19.20
iPhoneのSBSettingsのトグルを押すとIMAProwlが起動するようにしたいのですが嵌りました。
/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
/private/var/root/scripts/に置いたprowlchk.shの中身は

#!/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
grep '[i]maprowl'
のところで、
com.hoge.imaprowl-launch-when-toggle-is-off
自身が引っかかっててif文の内部が実行されてないんじゃないの?
0237名無しさん@お腹いっぱい。2013/03/06(水) 17:07:14.83
>>236さん、全く気が付かなかったです、今からちょっと治して試してみます、ありがとうございます。
0238名無しさん@お腹いっぱい。2013/03/06(水) 17:18:45.56
ファイル名変えて動きました。
>>236さん有難う御座いました。助かりました。
02392342013/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.98
cat のコマンドライン引数で指定できる参照ファイルの数はいくつなのか、どうしたらわかりますか
0241名無しさん@お腹いっぱい。2013/03/10(日) 21:09:19.61
>>240
ファイルの数での制限じゃなくて、引数(ファイル名)の文字列の合計のバイト数で制限される。

man sysconf で出てくる sysconf(_SC_ARG_MAX) の値が最大値。
普通2MB程度ある。
0242名無しさん@お腹いっぱい。2013/03/11(月) 09:14:37.19
>普通2MB程度ある。

「普通」と言い切るには辛いような。

>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
02432402013/03/12(火) 01:55:55.14
なるほどめちゃよくわかりました
0244名無しさん@お腹いっぱい。2013/03/12(火) 06:45:07.31
なるほど普通のOSでは2.5MBほどあるんですね
0245名無しさん@お腹いっぱい。2013/03/12(火) 07:26:34.92
昔の普通のOSでは数KB程度だったよ
0246名無しさん@お腹いっぱい。2013/03/12(火) 09:39:44.34
windowsなんてもっともっと少なかったような。
0247名無しさん@お腹いっぱい。2013/03/12(火) 10:34:57.84
DOSは128バイト
0248名無しさん@お腹いっぱい。2013/03/12(火) 19:35:11.23
>>247
MS 系の OS はほとんど使ったことがないので聞くんだけど,

Unix 系でも, tty からの入力に対しては別の制限があること
はあるけど, それは, スクリプト内部の処理でも同様だったの?

だとすると, グロブの展開できないんじゃないの?
0249名無しさん@お腹いっぱい。2013/03/12(火) 20:06:02.97
MS-DOSはCP/Mと互換のメモリ配置で、CP/MではDMAバッファ領域(80H〜FFH)
だったところに初期値としてコマンドライン引数が展開された。
グロブの展開はシェルの仕事ではなく、プログラムが自分でやる。

MS-DOSの新しい奴は知らん。
0250 忍法帖【Lv=4,xxxP】(1+0:8) 2013/03/12(火) 21:04:44.16
ps ax って人と ps -ef って人がいるんだけど、どっちなのよ
0251名無しさん@お腹いっぱい。2013/03/12(火) 21:08:27.16
ps axはbashの機能
0252名無しさん@お腹いっぱい。2013/03/12(火) 21:35:11.65
SYS-VとBSDの違いだろ
0253名無しさん@お腹いっぱい。2013/03/12(火) 22:16:08.23
DOSの話はよその板でやれよ。
0254名無しさん@お腹いっぱい。2013/03/13(水) 07:44:16.19
ps -efはDOSの機能
0255 忍法帖【Lv=4,xxxP】(1+0:8) 2013/03/13(水) 07:53:20.45
>>254
Redhatで出来てるけど
0256名無しさん@お腹いっぱい。2013/03/13(水) 08:59:58.41
>>252
書く順番が逆じゃんw

linuxのpsはどっちも理解する。
0257名無しさん@お腹いっぱい。2013/03/13(水) 09:36:44.66
>>256
linuxっていうかGNUのpsな
0258名無しさん@お腹いっぱい。2013/03/13(水) 12:40:03.05
>>256
もとより順番揃えて書いてないんだけど・・・
0259名無しさん@お腹いっぱい。2013/03/13(水) 12:52:37.70
それは意識して揃えようよ
0260名無しさん@お腹いっぱい。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
>>260
それってどうやってミスなのか意図的なのか判断するんだよ?
キミがミスした所は使い方によっては正しい場合もあるんだよ。
0262名無しさん@お腹いっぱい。2013/03/13(水) 17:40:46.27
ありません。これ昔からだなぁ
ハイ次↓
0263名無しさん@お腹いっぱい。2013/03/13(水) 17:56:47.43
>>261
そりゃそうなんだけど、イコールの次にスペースないよ、とかwarningレベルで教えてくれるとか

http://server-retrieval.sakura.ne.jp/sakura/ga/g10.gif

こういうの、ないの?
0264名無しさん@お腹いっぱい。2013/03/13(水) 17:57:47.72
>>261
横槍を入れてすまんが、
「これってミスじゃねーの?」っていちいち指摘してくるコンパイラがあるのだから、
シェルスクリプトも同様の支援プログラムがあってもよいのでは。
需要があるのかどうか知らないが。
0265名無しさん@お腹いっぱい。2013/03/13(水) 18:25:45.28
sh -n
0266名無しさん@お腹いっぱい。2013/03/13(水) 18:26:09.13
>>263
ないよ。
0267名無しさん@お腹いっぱい。2013/03/13(水) 18:28:30.23
>>264
需要はあるね
走行するまでわからん、ってのはダサいからな
0268名無しさん@お腹いっぱい。2013/03/13(水) 18:29:08.34
>>263
その=はファイル名の=かもしれないからなぁ
[ $a =1 ]
はもしかしたらa='-d'でファイル「=1」がディレクトリかどうか
判断してる場合もあるよ
ところで数値のテストをしたいなら
[ $a -eq 1 ]
とした方が良いんじゃないかな
0269名無しさん@お腹いっぱい。2013/03/13(水) 18:33:28.83
>>268
warningはほしいよな
Cコンパイラですら = と == は警告対象だ
0270名無しさん@お腹いっぱい。2013/03/13(水) 18:38:16.82
たとえあったとして、「このセミコロンって#の間違いじゃね?」とか警告だすか?
それはそれでウザいんだが。
0271名無しさん@お腹いっぱい。2013/03/13(水) 18:42:23.86
>>263
必要だと思う人が作ればいいさ。
0272名無しさん@お腹いっぱい。2013/03/13(水) 18:46:38.57
そうだな自分が良く間違うパターンを検索するスクリプトを書けば良い。
他の人には必要ないよ。
0273名無しさん@お腹いっぱい。2013/03/13(水) 22:01:47.54
>>250
「カッコウはコンピュータに卵を産む」で、侵入者が使ったpsコマンドの
オプションから、SysVユーザーと看破していた。
0274名無しさん@お腹いっぱい。2013/03/13(水) 22:25:37.58
それわざわざ書き込むほどのことか?
0275名無しさん@お腹いっぱい。2013/03/14(木) 11:50:50.62
>>270
-n でチェックしてるときは出してほしいな
0276名無しさん@お腹いっぱい。2013/03/14(木) 11:51:35.63
>>273
まじか。そんなかっこいい小説だったのか。
0277名無しさん@お腹いっぱい。2013/03/14(木) 16:17:13.28
お尋ねします。
list.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.04
while read filename data; do
echo "$data" > "$filename"
done < list.txt
0279名無しさん@お腹いっぱい。2013/03/14(木) 16:40:39.76
動きました。
readのあとに変数を並べればその順番に読み込むことを
教えていただきありがとうございました。

一行ずつデータを読むreadと
無限ループのwhileの組み合わせを用いると。
多謝
0280名無しさん@お腹いっぱい。2013/03/14(木) 16:56:50.18
いや無限ループじゃねーよ?
0281名無しさん@お腹いっぱい。2013/03/15(金) 10:43:03.35
もしもデータが無限なら?
0282名無しさん@お腹いっぱい。2013/03/15(金) 12:07:01.54
それは>>279がnamed pipeを知っている場合に限られる。
0283名無しさん@お腹いっぱい。2013/03/15(金) 12:14:48.15
思いのすべてをデータにして
0284名無しさん@お腹いっぱい。2013/03/16(土) 00:36:18.61
シェルとバッチって、癖の回避的に、どっちがクソ?
0285名無しさん@お腹いっぱい。2013/03/16(土) 00:48:46.58
>>282
いつかはマシンがお亡くなりになって終わるんじゃね?
0286名無しさん@お腹いっぱい。2013/03/16(土) 01:40:44.77
>>284
対話と一括を比較されても。
0287名無しさん@お腹いっぱい。2013/03/16(土) 01:54:23.55
シェルスクリプトとバッチって、癖の回避的に、どっちがクソ?
0288名無しさん@お腹いっぱい。2013/03/16(土) 02:24:05.98
何言ってるかさっぱり分からん。
癖の回避?
0289名無しさん@お腹いっぱい。2013/03/16(土) 02:51:57.34
>>287
シェルスクリプトでバッチ処理書けよ。
0290名無しさん@お腹いっぱい。2013/03/16(土) 02:57:24.95
燃料を投下したのにあっさり流された
0291名無しさん@お腹いっぱい。2013/03/16(土) 03:27:10.82
>>289
仕様の提示をお願いします
0292名無しさん@お腹いっぱい。2013/03/18(月) 10:03:03.01
対話型しか選べないコマンドってクソだと思うわ
0293名無しさん@お腹いっぱい。2013/03/18(月) 11:16:27.60
expectやptyがあれば怖いものはないです。
0294名無しさん@お腹いっぱい。2013/03/18(月) 12:18:58.23
expectやpty通さなきゃならないコマンドってクソだと思うわ
0295名無しさん@お腹いっぱい。2013/03/18(月) 12:47:55.91
ヒアドキュメントで良いじゃん
0296名無しさん@お腹いっぱい。2013/03/18(月) 14:06:22.94
>>295
おまえヒアドキュメントでsshのパスワード入力できんのかよ
0297名無しさん@お腹いっぱい。2013/03/18(月) 14:40:08.45
じゃあ冷やすとリングで
0298名無しさん@お腹いっぱい。2013/03/20(水) 09:12:19.32
>>296
ssh 自動化させるならパスフレーズ設定しない公開鍵作成しろよ。
0299名無しさん@お腹いっぱい。2013/03/20(水) 10:01:53.76
>>296
公開鍵使えよ。
0300名無しさん@お腹いっぱい。2013/03/20(水) 13:11:02.19
>>298
できないサーバがあるんだよ
0301名無しさん@お腹いっぱい。2013/03/20(水) 13:30:49.45
公開鍵とパスフレーズ両方使うよ (震え声)
03022402013/03/20(水) 14:17:01.94
manが壊れて真っ白なんだけどどうしたらいいですか
0303名無しさん@お腹いっぱい。2013/03/20(水) 14:47:31.51
何言ってんだ。
0304名無しさん@お腹いっぱい。2013/03/20(水) 14:56:14.39
>>303
manのDBがぶっ壊れたんじゃねーの?
mandb -c
でもやっときゃ治るんじゃね?
0305名無しさん@お腹いっぱい。2013/03/20(水) 15:54:26.54
roffソースは見えるのか?
nroff -man とか -mandoc とかでは見えるのか?
0306名無しさん@お腹いっぱい。2013/03/20(水) 16:29:00.10
>>300
それは自動化するなってポリシーだろ。
0307名無しさん@お腹いっぱい。2013/03/20(水) 16:34:18.88
>>302
スレ違い
0308名無しさん@お腹いっぱい。2013/03/20(水) 16:50:03.97
>>306
そんなポリシー知ったことか
0309名無しさん@お腹いっぱい。2013/03/20(水) 18:25:40.65
>>308
ならヒアドキュメントに書けよ。
0310名無しさん@お腹いっぱい。2013/03/20(水) 18:47:24.36
元々は>>292
で、>>308 サーバーがクソだという結論(sshの場合は)
対話が必要ってことは人間(>>308)にも使い道があるってことだよ。
なるべく減らした方が良いのは言うまでもないけど難しいね。

すれ違いだけどsshにはssh-agentとかagent forwardとかあるから
そういうことにも配慮されてる。agent forwardするとbackgroundで
動かしつつlogoutすると新規に接続できなくなるけど。
0311名無しさん@お腹いっぱい。2013/03/20(水) 18:54:36.87
>>309
ヒアドキュメントじゃ動かないよ・・・
0312名無しさん@お腹いっぱい。2013/03/20(水) 18:56:53.20
パスワードでのrloginはできるけどssh/rshは使っちゃダメな会社はあるらしいね
リモートでシェルコマンド実行したいときは仕方なくexpect+rlogin使ってるらしい
何を考えてそういうポリシーになってるのかは謎
0313名無しさん@お腹いっぱい。2013/03/20(水) 19:48:21.83
>>311
expectの中に書くってことだよ。
0314名無しさん@お腹いっぱい。2013/03/20(水) 21:20:00.49
>>300
どうやってサーバーサイドで公開鍵のパスフレーズ必須にできるんだよ。
0315名無しさん@お腹いっぱい。2013/03/20(水) 21:40:52.89
できないと思いこんでる情弱だらけだな
0316名無しさん@お腹いっぱい。2013/03/20(水) 21:45:17.55
ssh1,ssh2ともにプロトコル上パスフレーズ送らないんだから、制限なんか出来るわけがない。
0317名無しさん@お腹いっぱい。2013/03/20(水) 21:46:23.08
そもそもパスフレーズは秘密鍵側に設定するものであってだね。
0318名無しさん@お腹いっぱい。2013/03/20(水) 21:47:36.65
「長いログインパスワード」だと思ってるんじゃねーの。
0319名無しさん@お腹いっぱい。2013/03/20(水) 21:58:29.79
「鍵認証を禁止してパスワード認証のみ許す」なら
出来るから、それと混同してるんじゃないかな。
0320名無しさん@お腹いっぱい。2013/03/20(水) 22:46:51.79
expectって古くない?それ専用でスクリプト書かないといけないし、tclが要るし。emptyってどうよ
0321名無しさん@お腹いっぱい。2013/03/20(水) 22:58:21.11
>>316
もう1つ方法があるだろ、知らないのか?
0322名無しさん@お腹いっぱい。2013/03/20(水) 23:33:19.79
>>321
ないよ。
0323名無しさん@お腹いっぱい。2013/03/20(水) 23:40:01.59
>>321
バカに教えておいてやる。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.88
あきらかに間違ったことを書いて適当に煽ると正しい情報が出てくる。
2chの情強視点の正しい使い方。
0325名無しさん@お腹いっぱい。2013/03/21(木) 00:44:29.26
何という高等テクニック
0326名無しさん@お腹いっぱい。2013/03/21(木) 01:09:02.59
>>324
たださらに間違いを重ねてくる場合も。微妙に間違える場合も。自分で確認しろってことやね
0327名無しさん@お腹いっぱい。2013/03/21(木) 01:29:06.00
>>314
サーバサイドってか、会社のポリシーで強制してんじゃないの。
■ このスレッドは過去ログ倉庫に格納されています