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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:34:47.98 ID:/eJt2TVD.net]
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ:
シェルスクリプト総合 その28
mevius.5ch.net/test/read.cgi/tech/1532397676/

194 名前:デフォルトの名無しさん [2019/04/08(月) 22:57:42.88 ID:b/SlAWxT.net]
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/glob.7.html

195 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:22:25.12 ID:Ih2qq+NP.net]
の、POSIXのところは
pubs.opengroup.org/onlinepubs/009695299/functions/glob.html
GLOB_NOCHECK
かな?オプション名が意図不明だが説明文からは

196 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:37:03.41 ID:8H4AhNTa.net]
>>194
これを読んでも同じ結論になるわけだけど

> 先に与えた、わかりやすく簡単なルール、 「ワイルドカードパターンをマッチしたパス名のリストに展開する」と言うのは、
> オリジナルの UNIX における定義であった。 これはパターンが空のリストに展開されることも許可されていた。 例えば

> において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにならない。
> しかし POSIX では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そのまま変更されずに残されることになっている。

なぜ、わかり易く簡単なルールを捨てて、POSIXでは「そのまま変更されずに残されることになっている。 」を
選んだのかが書かれてないんだよね。

197 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:45:50.70 ID:Ih2qq+NP.net]
・探せたが、読めなくて文句つける
か... 探してじゃなくてっぽいけどw
書いてあることが。読めれば」>>152もわかるだろうに。どういう意味で言ったかわからん最小の原則wとかやらにあっているだろう

まあ、単に「認めたくない」だけだろな
何か他にファイルなどがあるとこで、*.hogeなんてファイルがなかったとしよう、
ls *.hoge
でどう動くのが望ましい?この例「だけ」に噛み付くのじゃなく、ちゃんと頭を使って考えような

198 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:50:01.35 ID:8H4AhNTa.net]
>>197

1. 見つからない場合はエラーとなってls自体が実行されない
2. ls "" とみなされる

のどちらかだろうな。

次はあんたが、頭を使ってレスしてくれなw

199 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:52:32.47 ID:8H4AhNTa.net]
>>197
ついでだから、ファイルが見つからない時

for i in *.txt; do
 echo "$i"
done

はどう動くのが望ましいか書いてくれよ。
今の動きや仕様を書くんじゃなくて
どう動くのが望ましいかをね

200 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:53:17.08 ID:Ih2qq+NP.net]
ほんとに脊髄だけで、頭使わないのな
POSIXはシェルスクリプトだけを考えてるわけではないのだよ
ls *.a *.c *.c
で、どれかがあってどれかが無い場合の動作は?よくそれで頭使ってる風に言えるもんだ。

201 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:54:01.05 ID:8H4AhNTa.net]
> で、どれかがあってどれかが無い場合の動作は?

>>198に書いたとおり

202 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:54:41.62 ID:QfzJZ21c.net]
Ruby のglob を使った方が、バグらないので良い!



203 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:55:27.24 ID:8H4AhNTa.net]
空のディレクトリで実行するとこうなるのかw

$ ls *.a *.c *.c
ls: '*.a' にアクセスできません: そのようなファイルやディレクトリはありません
ls: '*.c' にアクセスできません: そのようなファイルやディレクトリはありません
ls: '*.c' にアクセスできません: そのようなファイルやディレクトリはありません

204 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 23:58:38.45 ID:8H4AhNTa.net]
多分あいつは、
> この例「だけ」
のことしか考えてない予感がするなw

205 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:00:36.62 ID:cRtn1aSe.net]
>>202
そうだね。ファイルが見つからないときは
ちゃんと空のリストを返してくれる。
シェルスクリプトのように、「*」を返すことはないね。

irb(main):001:0> Dir.glob('*')
=> []

206 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:01:15.03 ID:cRtn1aSe.net]
ID変わったけど、俺が ID:8H4AhNTa な

207 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:01:53.02 ID:b0dEtQwc.net]
まだ、ゴネてる。自分の思ったようにならないってだけでよくそれだけ粘れるな
POSIXの仕様に意味があるのはさんざん言った。お前が認めたくないなんて知ったこっちゃない
POSIXの仕様に合わせてそんなのが動くように普通に書けるし、嫌だったらbashのオプションであんたの好きにできるだろうに

>>201
ls: : No such file or directory
ls: : No such file or directory
ls: : No such file or directory
って、出て来るのが望ましいのね
ls: *.a: No such file or directory
ls: *.b: No such file or directory
ls: *.c: No such file or directory
POSIXの人も俺と同じだと思うよw

>>203
イミフ。なにを言いたいの?

なんで、いちいちいちいちいちいち説明教えなきゃならいないねん

208 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:12:14.14 ID:cRtn1aSe.net]
>>207
この質問は無視?

for i in *.txt; do
 echo "$i"
done

はどう動くのが望ましいか書いてくれよ。

209 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:12:42.47 ID:cRtn1aSe.net]
>>207
やっぱりlsの例だけしか考えてないようだね

210 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:15:06.05 ID:b0dEtQwc.net]
その例だけなら、回らないのが望ましいだろな。だが、POSIXはシェルスクリプトだけを考えてるわけではないからしょうがないうちだろな
で?

211 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:16:54.68 ID:b0dEtQwc.net]
>>209
何を言いたいのかわからんな。どゆこと?まさか「正確」と同じパターンじゃないよな?その気しか思えないので具体的に言って

212 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:18:30.84 ID:cRtn1aSe.net]
ついでにPHPの場合

$ php -r "print_r(glob('*'));"
Array
(
)

Perlの場合
perl -MData::Dumper -e 'print Dumper [glob "*"]'
$VAR1 = [];

Rubyと同じく、見つからない場合は
デフォルトでは空のリストが帰ってくる。



213 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:19:17.64 ID:cRtn1aSe.net]
>>210
さっきから

> POSIXはシェルスクリプトだけを考えてるわけではないから

を繰り返してるけど、シェルスクリプト以外とは何の話をしてるの?
そして、シェルスクリプト以外ではどうだって言いたいの?

214 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:20:20.88 ID:cRtn1aSe.net]
>>211
だからお前、"lsの場合では" *だったらエラーがわかりやすいって言ってるだけじゃん。

forの場合では、当てはまらないじゃん。

215 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:20:53.10 ID:b0dEtQwc.net]
>>213
マジか...

216 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:21:12.57 ID:cRtn1aSe.net]
>>215
逃げるなよ

217 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:24:19.08 ID:b0dEtQwc.net]
>>214
ああ、なんだ「シェルスクリプト」の(それも特定な)場合か。「ls」なんて言ってるから他のコマンドとかと思ったぞ
POSIXはシェルスクリプトだけを考えてるわけではないからw
話にならない、POSIXを勉強して出直してね

218 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:24:33.50 ID:cRtn1aSe.net]
C言語めんどくせーなーと思ったら、サクッとソースコード見つかった。
https://qiita.com/sassy_watson/items/03c16bd03b56e5579477

↑のコードの ./*.txt を * に変換したけど、
やはり、空のディレクトリで * と表示されることはなく
何も表示されなかった。

POSIXってほんと何を言いたいんだろう?

219 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:25:50.97 ID:b0dEtQwc.net]
>>216
逃げるも何も「文句をつける対象を理解してない」のにどう相手をすれと?あんたにこれ以上こまごまこまごま教えてなきゃならんのか?
だったら、逃げるよ

220 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:26:21.07 ID:cRtn1aSe.net]
POSIXはシェルスクリプトだけを〜とか、じゃあC言語のことなんですかねぇ
でもC言語でも空のディレクトリで * が返ってくることはないし
ほんと何が言いたいんだかw

221 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:27:47.89 ID:cRtn1aSe.net]
POSIXはシェルスクリプトだけを考えてるわけではないから

→ Ruby・・・空の配列を返す
→ Perl・・・空の配列を返す
→ PHP・・・空の配列を返す
→ C言語・・・空の配列を返す

シェルスクリプト以外は空の配列を返します。

222 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:28:27.37 ID:b0dEtQwc.net]
>>218,220
はあ...最後な
>>194,195をよーく読め。なんでそれがbashでになってるのかも



223 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:29:23.15 ID:b0dEtQwc.net]
以後、脊髄反射マンと呼ぶからなw

224 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:29:27.03 ID:cRtn1aSe.net]
>>222
またそれか。よく読んでも、そうした理由は書いてない。

225 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:29:47.10 ID:cRtn1aSe.net]
>>223
脊髄反射マン必死だなw

226 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:31:21.79 ID:b0dEtQwc.net]
Supports rule 3 in the Shell and Utilities volume of IEEE Std 1003.1-2001, Section 2.13.3, Patterns Used for Filename Expansion.

227 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:32:12.65 ID:b0dEtQwc.net]
>>225
モロ体現してありがたい。オモロイなあんたは

228 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:32:37.61 ID:cRtn1aSe.net]
>>226
何度も言ってるが、
俺が聞いているのは、そういう仕様にした"理由"であって
仕様の場所は聞いてはいない。

ほんと、脊髄反射しかしねーなw

229 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:34:36.17 ID:b0dEtQwc.net]
>>228
言っているけど。「読めれば」そう書いてあるんだけどな。「読めない読めない」言われてもしょうがない
あんただって、「空」だったらマズいときもあるって認めてるやん
本当にただただ「認めたくない」だけなんだな。その「コロ」っとあんたの原点に戻るあたり
まあ、がんばりや

230 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:35:06.66 ID:cRtn1aSe.net]
そして面白いのが、シェルスクリプトは glob で見つからない場合に
検索パターンを返すのに対して、シェルスクリプト以外では
見つからない場合に、空のリストを返すって所だな。

231 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:37:41.48 ID:cRtn1aSe.net]
>>229
お前、マズイときもあるし、マズくない時もあるって
自分で認めてるやんw

ということはお前の主張は、所詮マズイときの例でしかなく
マズくない時には当てはまらないってことになるんだぞ
わかってるのか?お前の主張が崩れてるの

で、シェルスクリプト以外は空のリストを返しているのに
シェルスクリプトだけは、見つからなかった時に * という
文字列を返すという仕様にした理由は?

232 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:39:30.00 ID:cRtn1aSe.net]
結局、一番マトモな理由は >>191が書いた

> おそらく, そういう仕様をきめてからそういう動作をさせたわけではないとおもいます.

これだけなんだよな。特に理由はない。
(深く考えずに)そうしてしまった。

もちろん、正式なドキュメントとして
この理由が、書かれている文書は見つかってないがね。



233 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:42:08.93 ID:cRtn1aSe.net]
あ、みなさん。もし ID:b0dEtQwc を擁護したい人がいるならば
ID:b0dEtQwc が示したドキュメントの中から、
「そういう仕様にした"理由"」を書いてある所を指摘して構わないんですよ?

ないでしょう? 誰も指摘しないもんね。それが証拠だよ。

234 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:42:13.89 ID:b0dEtQwc.net]
何言っているの?
>この仕様、なにか便利なの?
が、お前の原点だろ?それ以後「認めなたくない」のであーだこーだ言っているだけだな

235 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:43:58.23 ID:b0dEtQwc.net]
とうとう誰とも言えない人に頼るようになったか...ww

236 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:46:08.72 ID:cRtn1aSe.net]
>>234
ちゃんと流れを読むように

107 自分:デフォルトの名無しさん[sage] 投稿日:2019/04/04(木) 17:59:04.72 ID:opkeFDjY [4/21]
>>104
聞いてるのは仕様ではなくて、
どうしてそうしたかの理由です。

237 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:50:22.73 ID:b0dEtQwc.net]
>>236
流れというかレスを読めないあんたに言われたくないw
いや、原点の話でしかないな。あんたの都合に(それもあんたの都合の良いようになだけな)合わせる必要性はこれっぽちもないな
とりあえず、原点の問題は解消した&マズい場合もあるそれが理由ってことも解消したってことで、おしまい

238 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:51:41.47 ID:cRtn1aSe.net]
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/glob.7.html

> において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにならない。
> しかし POSIX では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そのまま変更されずに残されることになっている。
> bash では、次のコマンドで昔からの振る舞いに設定することができる。
>
> shopt -s nullglob

なぜ昔からの振る舞いから替えたのか?その理由が謎
(理由を明確に述べているドキュメントがない)

239 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:52:47.78 ID:cRtn1aSe.net]
>>237
おしまいなんで、あんたは消えていいです。
1ヶ月後にちゃんと答えてください(笑)

240 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 00:54:45.59 ID:cRtn1aSe.net]
> POSIXはシェルスクリプトだけを考えてるわけではないから

↑これも結局何が言いたいのか不明だったな
まあ、何も考えずに(調べずに)シェルスクリプト以外の言語でも
* を返してるはずだって思い込んだんだろうなw
(実際には見つからない場合は空のリストを返します。)

241 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 01:01:34.97 ID:b0dEtQwc.net]
なにか勝ち誇って妄想全開のようだが、全然違う
>>195をよく読もうな。>>226と注目すべきとこあげたのに

他の言語でもglobなんて自ら実装したりはしないんじゃないの。単にそのオプションがデフォルトでは設定されていない、オプションが設定できるのは設定すれば同じになるんじゃないの。妄想お疲れさん

242 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 01:09:06.87 ID:cRtn1aSe.net]
> POSIXはシェルスクリプトだけを考えてるわけではないから

↑これで何が言いたいのかを書けば済む話
それが出来ないのはなぜだろうw



243 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 01:09:51.04 ID:cRtn1aSe.net]
あ、ちなみに「注目すべきとこ」には何も書いてませんよ。
いつもどおりです。

244 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 01:15:27.47 ID:b0dEtQwc.net]
ほんとーーにっ、「読めない」のな、この脊髄反射マンっw

245 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 01:16:58.07 ID:cRtn1aSe.net]
読めないって言わずに、具体的に引用すればいいだけなのに
それをしないのは、結局引用する場所がないからなんだよね

246 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 01:23:40.88 ID:b0dEtQwc.net]
「無い」から「引用できない」に変わったけど、同じパターンやな。そして前言はなかったことにという前々からの同じパターン

247 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 01:25:22.47 ID:cRtn1aSe.net]
>>246はとりあえずレスしてみましたってだけで
中身がなにもないことに、皆さん気づきましたか?

248 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 01:26:56.18 ID:b0dEtQwc.net]
なんか少しは自分を見直すとかあって、ここでもこんなクソ(俺のも含めて)なレスの応酬もなく、見てためになる万人が楽しめるレス、Q&Aになるかと思ったが、無理かやっぱ(偉そう偉そう)
そりゃ無理かっ。なんか急に飽きた、じゃな

249 名前:デフォルトの名無しさん mailto:sage [2019/04/09(火) 01:29:05.84 ID:cRtn1aSe.net]
はい、コイツは何度目かの逃亡宣言です。
また懲りずに来ますよw

250 名前:デフォルトの名無しさん mailto:sage [2019/04/10(水) 08:51:10.36 ID:1CG1Z7Gt.net]
bashの算術計算で小数を使う方法ってないです?
+=で加算したいんですが

251 名前:デフォルトの名無しさん mailto:sage [2019/04/10(水) 12:14:47.90 ID:sSiaigIF.net]
>>250
それ俺も欲しいんだよね。

前にやった実装は、小数点以下2位固定だったから
1.23 を 123 にして計算してから、後ろ2桁の間にドットを入れて対応したけど
小数点以下の桁数が1.2とか1.234とかだったら面倒なんだよね。

bcコマンドとか呼び出せば簡単なんだが。

252 名前:デフォルトの名無しさん mailto:sage [2019/04/11(木) 17:03:23.97 ID:bMTFn+JP.net]
exec 3>&1; exec >&-; exec >&3
たまにこんなのを見ますがこれはどんな時に使うんです?
ファイルディスクリプタ自体は理解しましたがfdの複製や切り替える目的が分からなくて
cmd 2>err.txtは意識せず使えてますが



253 名前:デフォルトの名無しさん mailto:sage [2019/04/11(木) 17:46:50.14 ID:cVfQRf/N.net]
>>252
不勉強なんで「3」ってfdは知らないんだけど、「>&」ってリダイレクトを
使うと書き込みじゃなくて切替になるんだけど、これを使うとエラー
出力を標準出力に切り替えて標準出力で両方の出力を得たりする
ことができるです

「Command > FileName 2>&1」ってするとエラー出力の内容が標準
出力になってFileNameに両方の内容が書き込まれる
逆に「Command 2> FileName 1>&2」ってすると標準出力がエラー
出力になっるので、エラー出力でFileNameに書き込むことが出来る

で、何に使うのかっていうと、「grep」なんかは検索結果は標準出力に
でるけど「指定されたのはディレクトリだよ」みたいなメッセージは
エラー出力に出される
両方の出力をみて処理したいとかの時にはこれで切り替えて標準
出力の内容を変数に保存しておいて処理するとかに使うです

例が雑でわかりにくいかもだけど、エラーと通常の出力を同じ出力で
使う方法ってことで、あとはスクリプトなんでアイデアしだいなんで

254 名前:デフォルトの名無しさん [2019/04/11(木) 23:20:48.83 ID:smzX9gsy.net]
>>252
tldp.org/LDP/abs/html/x17974.html

255 名前:デフォルトの名無しさん mailto:sage [2019/04/12(金) 00:07:43.92 ID:XpqpR76r.net]
>>252 はリダイレクトを知りたいんじゃなくて、fd=1 を 3 にコピーして 1 をクローズして再度 3 から 1 にコピーする意味
が何なのかを質問しているんだと思う。
結局もとのファイルに繋ぎなおすだけだよね。
一旦クローズするから flush されるとか?ならわかるんだが、実際どうなのかわからん。

256 名前:デフォルトの名無しさん mailto:sage [2019/04/12(金) 00:45:21.11 ID:L59U/aC1.net]
ファイルディスクリプタに関しては
逆引き辞書が必要なんだと思う

○○をしたい時 → こうします。っていうやつ

257 名前:デフォルトの名無しさん mailto:sage [2019/04/12(金) 03:08:23.09 ID:WO5SLys3.net]
ファイルディスクリプタ(FD) 3番からは、システムが使うけど、ユーザーも使うことができる。
FD0 : 標準入力、FD1 : 標準出力、FD2 : 標準エラー出力

端末に、ls と打つと、
1. シェルが、lsコマンドのプロセスを起動して、それに、FD0〜2 を渡す
2. lsプロセスは、FD3 を使って、ファイル一覧を作って、FD1 に出力する

主なFD3 の使用方法は、標準入力を、ファイル・キーボードの2つで、切り替えて使いたい時

標準入力をファイルからにすると、キーボード入力が出来なくなるため、
一旦、標準入力(FD0)をFD3 にして、ファイルから入力して、済んだら元に戻す

こんな事を一々、シェルスクリプトでやるよりも、Ruby でやればよい。
FD何番を使っているとか、意識せずにすむ

258 名前:257 mailto:sage [2019/04/12(金) 04:14:55.73 ID:WO5SLys3.net]
exec 3<&0 < a.txt # FD3 から入力

while read LINE
do
echo "--- ${LINE} ---"
done

exec 0<&3 3<&- # 標準入力を元に戻し、FD3 を閉じる

# 上のようにも書けるが、下の方が、標準入力のファイルディスクリプタ(FD)0 をいじらないので、安全

exec 3< a.txt

while read LINE 0<&3 # FD3 から入力
do
echo "--- ${LINE} ---"
done

exec 3<&- # 閉じる

「UNIX シェルスクリプト・コマンドブック 第2版、山下哲典」の、exec の説明の所に書いてある。
第3版には載っているかどうか、知らないけど

259 名前:デフォルトの名無しさん mailto:sage [2019/04/12(金) 13:25:25.09 ID:L59U/aC1.net]
もう少しまともに説明できるやついないのかな・・・

260 名前:デフォルトの名無しさん mailto:sage [2019/04/12(金) 13:27:28.90 ID:I415couP.net]
宿題は自分でやろうな

261 名前:デフォルトの名無しさん mailto:sage [2019/04/12(金) 16:22:09.16 ID:zYICSkfs.net]
CTRL+Cのトラップについて教えて

以下のスクリプトの時、実行してすぐにCTRL+Cを押すと
#!/bin/sh
set -e
sigint() { echo sigint; }
trap 'sigint' INT
#trap 'echo $?' EXIT
sleep 10

こんな感じでバラバラなんだけどさ

dash・・・トラップできない。終了コード130
(ただしコメントアウトしてるEXITのtrapを有効にするとトラップできる)
bash・・・トラップできる。終了コード130
zsh・・・トラップできる。終了コード130
ksh・・・トラップできない。終了コード130
(コメントアウトしてるEXITのtrapを有効にすると258と表示される。トラップできず)
mksh・・・トラップできる。終了コード0
(コメントアウトしてるEXITのtrapを有効にすると0と表示される。トラップできる。)
posh・・・トラップできない。終了コード130
(ただしコメントアウトしてるEXITのtrapを有効にするとトラップできる)
yash・・・トラップできる。終了コード130
(コメントアウトしてるEXITのtrapを有効にすると386と表示される。トラップできる。)

なんでこうなって、どれが正しい動きで、どれでも同じ動きさせるには、どうすりゃいいの?

262 名前:デフォルトの名無しさん mailto:sage [2019/04/12(金) 16:46:27.11 ID:2vVcl4ag.net]
宿題は自分でやろうな



263 名前:デフォルトの名無しさん [2019/04/13(土) 06:04:26.25 ID:blG/UTRx.net]
Ruby では、カスタムハンドラを定義した場合、終了しない。
デフォルトのままなら、Ctrl+C で終了する

つまり、デフォルトハンドラから、カスタムハンドラへ付け替えたため

sleep 7 #=> ここではデフォルトハンドラだから、Ctrl+C で終了する

previous_handler = Signal.trap( :INT ) do
puts "シグナルハンドラへ入った!"
end

print "previous_handler = "
p previous_handler #=> "DEFAULT"

sleep 7 #=> ここでは、カスタムハンドラへ付け替えたので、終了はしない

264 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 06:40:14.96 ID:mImzJn5T.net]
それはシェルスクリプトも同じだろうな。上の終了しているのは set -e しているからじゃないのかな
シェルスクリプトは子プロセスを起動していてシグナルを受けるのが子プロセスでが多くタイミング的に〜以下省略

265 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 07:34:12.37 ID:bIdtQ5MW.net]
> set -e しているからじゃないのかな
それをわかってるから、サンプルコードにも入れてるんだけどねw

問題はそこじゃなくて、なんでシェル毎に挙動違うんだよ!?
どれが正しいんだよ!?という話なわけで

266 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 07:57:58.58 ID:i5T2wQ7z.net]
CTRL-Cを入力するタイミングが下手すぎるって話だろ
まさか手入力じゃあるまいな?

267 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 08:08:06.94 ID:bIdtQ5MW.net]
>>266
手入力しないでやる方法を教えてくれ!

268 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 08:08:38.43 ID:bIdtQ5MW.net]
いやkill使うのは知ってる。それをどういう風に使えば、
手入力と全く同じことを再現できるのかという話だ。

269 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 08:12:44.72 ID:bIdtQ5MW.net]
2つの端末を使って一方で実行してから
もう一方で(手入力で)実行するっていうのは
結局手入力してるのと変わらないし、

1つのスクリプトでkillすると、
それこそわけわからんことになる。
イベントハンドラ内でkillするか、違う場所でkillするか
シェルによって挙動が違う

270 名前:263 mailto:sage [2019/04/13(土) 08:51:59.71 ID:blG/UTRx.net]
Ruby では、

previous_handler = Signal.trap( :INT ) do
puts "シグナルハンドラへ入った!"
end

print "previous_handler = "
p previous_handler #=> "DEFAULT"

# 自プロセスへシグナルを送ると、カスタムハンドラが呼ばれるが、終了はしない
Process.kill :INT, Process.pid

Signal.trap( :INT, previous_handler ) # 元のハンドラへ戻す

sleep 7 #=> ここでは、デフォルトハンドラへ戻したので、Ctrl+C で終了する

「改訂2版 Ruby逆引きハンドブック」では、もっとややこしい記述をしてる

シグナルハンドラはグローバルだから、
他のスレッドに変更されないように、Mutex で排他制御してる

271 名前:263 mailto:sage [2019/04/13(土) 09:02:30.89 ID:blG/UTRx.net]
シングルスレッドでは、sleep 7、としてる間に同時に、

Process.kill :INT, Process.pid
と、自プロセスの命令を実行できない

マルチスレッドなら出来るのだろうが、マルチスレッド・プログラミングはややこしい!

272 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 09:27:42.11 ID:bIdtQ5MW.net]
>>271
マルチスレッドのほうが楽だな。

それらをマルチプロセスでやってくれ。
子プロセスは自分で作成したものだけじゃなくて
既存のプログラムも使い、バックグラウンドプロセスも使ってみること



273 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 09:36:25.97 ID:bIdtQ5MW.net]
zshの謎な挙動はこれが原因か?
https://fumiyas.github.io/2013/12/05/trap-exit.sh-advent-calendar.html

> でました、zsh の非互換! zsh はシグナルハンドラー※内で終了すると、 EXIT ハンドラーを実行してくれません。酷い。 (※この例では SIGINT のデフォルトのシグナルハンドラー)

> こんな感じで bash, ksh, zsh には微妙な動作の違いがあったりするので、 ちょっと変わったことしようとするときは特に注意しましょう。

274 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 09:39:48.45 ID:bIdtQ5MW.net]
読みづらいなw

$ zsh -c '
atexit(){ echo "Bye!"; };
trap atexit EXIT;
trap "trap - EXIT; atexit; exit -1" TERM;
kill -TERM $$
'

275 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 11:31:16.12 ID:6byp94bf.net]
全てのシェルで適切に終了処理をするって難しいな・・・

276 名前:263 mailto:sage [2019/04/13(土) 11:39:28.75 ID:blG/UTRx.net]
Ruby で、at_exit に、終了処理を書いておけばよい

シェルスクリプトで、書く必要がない

277 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 11:55:58.29 ID:6byp94bf.net]
時たま出来てしまうゾンビは何が原因なんだろう?
kill -TERM 0 してるから全部死んでくれるはずなんだが・・・

278 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 11:57:21.41 ID:6byp94bf.net]
あ、バックグラウンド処理とかしてる
そしてCTRL-Cで強制終了した時の話
ゾンビだから消せなくて困る

279 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 13:02:33.69 ID:blG/UTRx.net]
ゾンビは、子プロセスが終了して、
OS が、その終了コードをどう扱えば良いのか、わからないから、ひとまず保存している状態

普通なら、子プロセスの終了コードは、親プロセスへ渡されるのかな?

ゾンビが生まれた時に、親プロセスがどうなっているのか?

280 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 14:09:25.74 ID:mImzJn5T.net]
>>265
お前には言ってない

>>266
タイミング的に子プロセスが受け取るのかシェルが受け取るのかってことなんだけどね。コマンドを実行中なのかシェルが実行中なのか
set -e を使うからややこやしい、シグナルの基本をわかってないんじゃないんだろなとしか思えんけど。コマンドがINTシグナルで終了した場合、シェルが擬似的にシグナルハンドラ呼んでるっぽいかな(もしくは自らにINTシグナル出してるのかな?)

何したいのか知らんけど、set -e 使わずに、INTシグナルハンドラでexitすればいいんじゃないの

281 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 14:29:06.39 ID:6byp94bf.net]
>>279
その理屈はわかるんだけどねぇ

まず必ずゾンビになるんじゃなくてたまになる。だからタイミングの問題
CTRL-Cを押した時になる。通常の処理では発生しない。
CTRL-Cのハンドラでは作業ディレクトリの削除を行っている。

ワーカー(& によるバックグラウンド処理)が複数ある。サブシェルを使ってるせいか
同じな名前のプロセスがたくさんいる。ワーカーを生成した後はwait(引数なし)を実行している。
ゾンビの存在は確認しているが、誰がゾンビになったのかその親が誰かはよくわかっていない。
(たまにしかならんので探しにくい)ただし内部で呼び出してるtrやmvがゾンビになったこともある。

CTRL-Cのハンドラでは作業ディレクトリの削除の他、多数生きてるワーカー(労働者)を
皆殺しにするためにジェノサイド(kill -TERM 0)を発動している。
ただし労働者を消した後に、労働者の作業場(作業ディレクトリ)も片付ける
必要があるので自分だけは死なないようにしている。(trap ':' TERM)
実際にはもっと複雑だけど、死なないのは自分だけなはずなんだけどな

バグでゾンビになったこともあるので記憶が曖昧だけど
(バグを修正した今は)zshだけしか発生しなくなっているかもしれない。
もしかしたらzsh内蔵のkillにバグがあって殺す順番とか
子供が生まれるタイミングで発生してるとか?

でもまあなんだかんだでシンプルにしていったら
ゾンビの発生率も下がってきたし諦めるかな

282 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 14:40:48.63 ID:6byp94bf.net]
うーん、おかしい。trってワーカー(バックグラウンドプロセス)の
中で使っているとはいえ、パイプの右側でしか使ってないんだが?



283 名前:279 mailto:sage [2019/04/13(土) 15:17:27.06 ID:blG/UTRx.net]
漏れにも、ゾンビになるプログラムとならないプログラムの、違いがわからない

ゾンビになるメカニズムを検索してみれば?

284 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 15:21:25.04 ID:6byp94bf.net]
「ゾンビになるメカニズム」で検索してみた

管理テーブルにデータが残ってるだけなら
消す方法(もしくは隠す方法)があってもいいと思うんだがねぇ

285 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 16:27:29.48 ID:i5T2wQ7z.net]
>>284
wait()すりゃいいんだよ。
普通はinitが拾ってくれるんだが、誰にでも好き嫌いはあるということだろう。

286 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 16:33:30.75 ID:mImzJn5T.net]
>>280
>コマンドがINTシグナルで終了した場合、シェルが擬似的にシグナルハンドラ呼んでるっぽいかな(もしくは自らにINTシグナル出してるのかな
違うか。control-cでのINTシグナル送るやつの文献ってどこぞにあるかなあ

287 名前:279 mailto:sage [2019/04/13(土) 17:05:08.41 ID:blG/UTRx.net]
Ctrl+C が、子プロセスやパイプラインのジョブグループに、

どのように伝達されていくかとか、難しい

288 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 17:21:22.57 ID:6byp94bf.net]
いろいろ間違っていた。訂正する。

まずCTRL-Cは関係なさそう。実は正常な動作でも(プログラム実行中に)ゾンビができることがあった。
ゾンビができると今は無限ループ状態になるので気づいたが、ちょっと前まではプログラムの構造上、
ゾンビを放置して正常終了していたと思う。zshではあまりテストしていなかったから気づかなかった。

バックグラウンドプロセスが関係あるかないかはよくわからない。
何回か動かしているがバックグラウンドプロセスを使用しない場合は今の所再現していない。

あとなんかWSLとのからみな気がしてきた。
速度が違うから断定は出来ないがLinuxだと再現しない。

今の所、WSL環境にて、zshで、バックグラウンドプロセスを使用し、
その中でパイプを使った処理を行うと、まれにゾンビプロセスができる。

289 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 17:27:02.88 ID:i5T2wQ7z.net]
>>286
シグナル一般の話ではなくてttyの話だったら、詳解Unixに載ってた気がするが、
当然そのくらいは読んでるよね。

290 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 17:36:42.95 ID:mImzJn5T.net]
>>287,289
なるほど
すまん、読んでない。遠い記憶では読んでいたような気もするが忘れたので読んでない

291 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 17:43:50.87 ID:6byp94bf.net]
再現コード出来た。このコード、なにか問題有る?

これをWSL+ZSHで実行すると、人目につかず永遠とbcコマンドで1+1を計算し続け、
CTRL-Cで停止するときにbcコマンド含めたプロセスグループ全体をkillする(はず)
これをやるとbcコマンドがゾンビ化する。(Linuxだとしない)

#!/usr/bin/zsh

int() {
echo kill
kill -TERM 0
echo killed
exit 1
}
trap 'int' INT
trap ':' TERM

worker() {
while :; do
echo '1+1' | bc > /dev/null
done
}

for i in $(seq 16); do
worker &
done

echo wait
wait

292 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 17:44:42.87 ID:6byp94bf.net]
やっぱり詳解Unixは買わねばいかんか・・・



293 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 17:54:41.69 ID:6byp94bf.net]
dash、bashでは再現しない。kshでも再現した。
いずれもWSLのみ。これもうWSLの問題だろ・・・
きっとWSLのバグをzshとkshが踏んじゃったんだな

294 名前:デフォルトの名無しさん mailto:sage [2019/04/13(土) 17:55:48.18 ID:6byp94bf.net]
これ関連してるのかな?

Why are there many zombie process in windows subsystem for linux(WSL)? How to kill them totally?
https://superuser.com/questions/1419292/why-are-there-many-zombie-process-in-windows-subsystem-for-linuxwsl-how-to-ki






[ 続きを読む ] / [ 携帯版 ]

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

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