1 名前:名無しさん@お腹いっぱい。 [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。 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でそれらしい単語による簡単な検索もできます。 ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆーな □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも awkまたはperlの方が適した処理にはそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 □回答者への注意事項: ・シェルスクリプトでの処理方法を質問しているのに、よくわからずに 「そういうのはperl使いましょう」と回答するのはやめましょう。 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。 前スレ シェルスクリプト総合 その20 toro.2ch.net/test/read.cgi/unix/1339083351/
184 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 09:31:47.72 ] >>183 仕様変えた。Linuxでも古いカーネルだと#!/スクリプトは不可。 #!スクリプトがループしてた場合は単にexecve(2)がエラーになるだけ。 一応ループ判定はしてるみたい。
185 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 09:43:22.30 ] >>183 スクリプトのネスティングが4回程度でエラーになるようになってるから、 ループしてたらそれでエラーになる。無限ループでハマることはない。
186 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 10:16:14.90 ] なるほど、 >>177 25 if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || 26 (bprm->recursion_depth > BINPRM_MAX_RECURSION)) BINPRM_MAX_RECURSIONまでは再帰するのか。 >>183 の例では/bin/aho, /bin/bakaの実行を何回も試みてBINPRM_MAX_RECURSIONに 達してやっとエラーか。 ダサッ
187 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 10:42:07.89 ] シンボリックリンクのループ検出と一緒だろ。OSによらず。 2つだけでループしててもMAXに達するまでずっとたどってようやくエラー。
188 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 12:47:54.49 ] そういえばそうだな。でも自己参照くらいはその場でチェックしてもいいだろ。 $ cat /bin/aho #!/bin/aho
189 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 12:52:21.55 ] その場でチェック()
190 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 13:55:52.24 ] Patches Welcome
191 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 14:29:29.40 ] そもそも自己参照していない正常なスクリプトの方が圧倒的に多いんだから、 自己参照をチェックするとそのオーバーヘッドが、全ての正常なスクリプトにも 負担させられることになって、実行速度がかえって遅くなるかと。
192 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 16:42:35.29 ] ファイルからの読み込み行ってるんだから、スクリプトファイル名の比較の 負荷なんてゴミでしょ。
193 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 17:04:30.10 ] >>192 のプログラマのセンスのなさはわかった。
194 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 17:42:33.16 ] >>193 具体的に解説ヨロシク
195 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 17:53:16.99 ] まずコードを書け、話はそれからだ
196 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 18:21:24.09 ] >>195 だよな >>193 には具体的なコードを示す義務がある
197 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 18:25:49.84 ] >>196 何を言ってるんだ?コードの話をしているお前ら全員だよ
198 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 19:34:09.72 ] >>187 > シンボリックリンクのループ検出と一緒だろ。OSによらず。 シンボリックリンクのループ検出なんてある? どういった場合に検出する?
199 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/01/27(日) 19:56:14.74 ] >>198 $ ln -s hoge /tmp/hoge $ cat /tmp/hoge cat: /tmp/hoge: Too many levels of symbolic links
200 名前:名無しさん@お腹いっぱい。 [2013/02/12(火) 18:33:08.66 ] ttp://d.hatena.ne.jp/m-hiyama/20071221/1198221671 some-command 3>&1 >/dev/null 2>&3 3>&- | less 1番の値が最終的にどこいったのがかわからんのです・・・ 1→3→2とコピーされて標準エラー出力になるんじゃないの?
201 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/12(火) 18:46:22.72 ] >>200 1は/dev/nullだよ。
202 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/12(火) 18:53:12.63 ] >>200 1は3経由で最終的に2にコピーされて、その状態でsome-command が実行されてる、 で合ってるよ。 その「2にコピーされたもの」はパイプの入力だから、 結果的にsome-commandの標準エラー出力がパイプにつながる。 some-commandの標準出力は >>201 のとおり /dev/nullに捨てられてる。
203 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/12(火) 19:05:35.88 ] リダイレクトは左から順番に解釈していけば良いよ。 (1) 3は1(標準出力)に向けられる。 (2) 1は/dev/nullに向けられる。 (3) 2は3(標準出力)に向けられる。 (4) 3は閉じられる。 結果として 1は/dev/nullに2は標準出力に向いてる。
204 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/12(火) 20:55:57.35 ] 再度質問です shの機能で >>200 みたいに だーってリダイレクトが出来るじゃないですか その文法から「1」が最終的にどこ行ったのか わーって追跡したいんです 出来ますの?勿論ググりましたが、当方馬鹿なのでわかりません サルでも分かるような回答を強く期待します 僕はこういう小バカにしたような書き方しか出来ませんが、凄く切実に知りたいです さぁどうぞ↓
205 名前:200 [2013/02/12(火) 21:09:43.68 ] うごごごご
206 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/12(火) 21:24:31.15 ] >>204 > aその文法から「1」が最終的にどこ行ったのか わーって追跡したいんです ktrace とか truss とか strace ってのはダメ?
207 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/14(木) 11:04:26.66 ] シェル変数にコマンドを文字列として設定しておいて、それを実行したい。 CMD="printf '%x %x\n'" #これはダメ $CMD 13 32 を実行して printf '%x %x\n' 13 32 と同じ出力を得たい。 $CMD 13 32の行は変更不可。 CMD="printf '%x %x\n'"ではダメでした。 CMDにどのような文字列を与えると実現できるでしょうか? bashの拡張機能を使ってもよいですが、なるべく使わない方向で。
208 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/14(木) 11:09:32.45 ] お題が不正確でした > $CMD 13 32の行は変更不可。 $CMD 13 32 を含むシェルスクリプトがある。環境変数としてCMDを与えて printf '%x %x\n' 13 32 と同じ出力を得たい。 CMDに #!/bin/sh printf '%x %x\n' "$@" というスクリプトのパスを与える方法は思いつきましたが、スクリプトファイルを作成しないで実現したい。
209 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/14(木) 11:44:48.59 ] >>208 CMD='printf %x\040%x\n' バックスラッシュが化けるので全角にしたので半角に直してね
210 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/14(木) 13:05:11.46 ] evalって知ってる?便利だよ
211 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/14(木) 13:12:07.63 ] >>210 > $CMD 13 32の行は変更不可。 evalも使用不可
212 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/14(木) 14:38:40.47 ] >>211 CMDの中にeval入れれば行けるだろ CMD="eval print ..以下略
213 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/16(土) 14:38:00.54 ] >>212 それでOKでした。
214 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/16(土) 21:58:07.02 ] >>211 >>211 >>211
215 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/17(日) 00:35:16.20 ] ももクロはズリネタ探しをしている人には理解出来ないよ
216 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/17(日) 00:51:10.81 ] awkのprintで 1, print $2 2, print \$2 3. print\ \$2 1、2は2列目て事だと思うけど3てどうなるの?
217 名前:215 mailto:sage [2013/02/17(日) 01:31:05.17 ] あれ・・盛大に誤爆ってたwごめん
218 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/17(日) 02:55:22.76 ] >>214 呼び出すところが変わってないから良いんじゃないの?
219 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/20(水) 21:18:41.67 ] 2chの画像スレ開いて、Ctrl+aでコピーしたのをdl.txtにコピーしておいて そのカレントフォルダでこれ実行すると、びっくりするほどユートピア grep -E "(^http|^ttp)" dl.txt |sed -e "s/http/ttp/g; s/ttp/http/g"| wget -A jpg,png,gif -N -i -
220 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/20(水) 21:43:00.53 ] 昔そういう事やってたけど グロ画像が紛れ込んじゃうからやめたよ 安心してシコシコできない
221 名前:219 mailto:sage [2013/02/20(水) 21:54:17.39 ] >>220 それなんだよ...URLのブラックリストとか出来ないかな?まぁ出来ても遅くなりそうだけど
222 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/20(水) 22:04:29.90 ] ブラックリスト作っておいてgrep -vで除外するくらいかな? いちいちグロ画像調べてNG登録するのが嫌でね…
223 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/20(水) 22:48:10.03 ] grepしてからsedですか、そうですか
224 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/21(木) 00:53:50.25 ] >>221 専ブラ使えよ。 グロってレスがついてたら、モザイクかけてくれたり。
225 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/21(木) 01:03:43.88 ] >>219 スレとってくんのもwgetでいいだろ。なぜに手動。
226 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/21(木) 10:19:46.09 ] >>224 >グロってレスがついてたら、モザイク それ便利そうだな! どこの専ブラ? うちはかちゅ〜しゃ使ってるけど
227 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/21(木) 13:17:14.46 ] >>220 いやいや、落としたら、シコシコする前に、まず賢者モードで分類とか整理しろよ。
228 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/21(木) 15:56:58.86 ] >>227 モード切替どうやってするつもりだよ
229 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/21(木) 21:47:15.77 ] >>226 2chmate
230 名前:名無しさん@お腹いっぱい。 [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が生成されます。
231 名前:230 mailto:sage [2013/02/22(金) 12:13:52.84 ] 環境はcygwinで、シェルはbashです。
232 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/22(金) 12:40:05.30 ] >>230 変数の中のチルダは展開されない。 $HOME/Desktop/a.tar を使え。
233 名前:名無しさん@お腹いっぱい。 mailto:sage [2013/02/22(金) 13:01:39.80 ] >>232 できました! ありがとうございました。