1 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:34:47.98 ID:/eJt2TVD.net] シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ: シェルスクリプト総合 その28 mevius.5ch.net/test/read.cgi/tech/1532397676/
185 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 18:50:10.35 ID:3hZl3Wdo.net] >>184 安心しろ。俺以外の人も見つけられない。 だからここに俺とお前以外の人間が書くこともない。 俺が言ってることが正しければな(笑)
186 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 18:56:04.68 ID:6GvfotlI.net] ほんと「読めないのな」。よかったはそういう意味じゃない わざとかと思えなくもないけど、いままでの「読めなさ」からはわざとではないとしか思えない どう見ても、お前の都合のよいことだな、さすがだよ 場所のレスもらえればお前がいままで知りたかったことがわかり、黙って逃げるだけw(そこにお前の苦悩とかなさげ) もらえなかったら、お前の中では自己肯定の補強にになるだけとういう。間違いでもな しょうがないな、1ヶ月後に教えてやるよw何もなかったら1ヶ月後に、この話題はw
187 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 19:02:14.14 ID:3hZl3Wdo.net] なんなら一年後でいいんやで?w
188 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 19:09:11.60 ID:6GvfotlI.net] イミフ。下衆い意味で言っていそうではあるがwじゃ、適当な時にな
189 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 19:20:16.01 ID:3hZl3Wdo.net] それまで別の話題でお会いしましょう(笑) あ、他の人、manにないのは明らかなんで探さなくていいですよ〜w 時間の無駄でしょうし。
190 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 19:24:11.57 ID:3hZl3Wdo.net] __ - ____ ________ - ___
191 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 21:48:40.20 ID:9U0C5XME.net] >>136 bashがそういう仕様にした理由は, shにあわせたからです. shがそういう動作をする理由は, expand()が0をかえしたときはもとの引数文字列でmakearg()するようにつくられているからです. おそらく, そういう仕様をきめてからそういう動作をさせたわけではないとおもいます.
192 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 22:28:59.33 ID:Ejuihx1D.net] ようやくまともなレスがw >>191 その動き(expandやmakearg)はソースコードから? 補足しておくと俺は「"bashは"なぜそうしたのか?」とは 聞いてなくて、シェルスクリプト(元をたどればsh?)が どうしてそういう動作をするのかの理由を聞いてる。 で、それは特に理由はないのかな?たまたま最初の実装した人が あまり考えず、そうしましたぐらいの理由で。 だから理由を探しても見つからないと
193 名前:デフォルトの名無しさん mailto:sage [2019/04/08(月) 22:36:01.12 ID:Ejuihx1D.net] まとめ for i in *.txt; do echo "$i" done 何もファイルがないディレクトリで↑を実行すると 「*.txt」 というファイルが見つかったかのような動きをします。 「*.txt」というファイルだけがあるディレクトリで実行すると 全く同じように「*.txt」 というファイル名が表示されます。 つまり空ディレクトリでも「*.txt」というファイルがあっても 表示結果が全く同じになります。これは驚き最小の原則に反しています。
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が拾ってくれるんだが、誰にでも好き嫌いはあるということだろう。