[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 02/25 20:39 / Filesize : 53 KB / Number-of Response : 234
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合 その21



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
できました!
ありがとうございました。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<53KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef