- 1 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 17:54:23.25 .net]
- シェルスクリプトの総合スレです。
□お約束 ・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。 bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 ・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています 最新の仕様はこちらへ pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」 から参照することができます。) ・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。 src.illumos.org/source/xref/illumos-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。 質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう 前スレ シェルスクリプト総合 その26 https://mevius.5ch.net/test/read.cgi/unix/1489979246/
- 554 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 13:57:32.52 .net]
- だな。なんで、へー、そう書けるんだとかならずに、あれが駄目これが駄目ってばっかなんかな。会話として見ててくもそ面白くない、いらいらすんなw
- 555 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 14:08:40.82 .net]
- >>527
> pythonはもっと汎用言語よりだからずっと長くなる。 汎用言語だから長くなるんじゃなくて、 Pythonには向かない作業だから長くなるっていうのが正解
- 556 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 18:38:07.06 .net]
- >>529
RFC準拠ってなんの話してるの? CSV形式ではないと明確に言われてるのに まだCSV形式にこだわってるの?
- 557 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 18:40:26.84 .net]
- よほどお前がこだわってるな。てかキモいわ
- 558 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 18:46:13.86 .net]
- 俺はレスしただけだけど?
>>529が書かなければ、この話をすることもなかった
- 559 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 18:49:00.93 .net]
- 新参なので>>513ってなんのこっちゃと、ちょっと前スレの当該箇所を流し読みしてはいた。ふーんてな
で、>>538となんか同じようなのがあったようなww
- 560 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 18:51:25.65 .net]
- お前の落ち度だってのはわかった
- 561 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 18:52:26.75 .net]
- >>540
>>538のな?w
- 562 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:00:28.24 .net]
- 自分のことだって自覚してるからレスしたんだろ?
- 563 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:03:32.17 .net]
- へ?
さすが、自分のことだけはよくわかってるな。それはお前がそうだからだろう 何を言っているのかわからん、>>538によく似合うレスだなっていう
- 564 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:12:05.82 .net]
- どうも同一人物みたいだが(>>539に対しての?>>540あたりからも)、だとしたら>>513はすげえなっということでw
- 565 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:16:54.17 .net]
- 自作自演
- 566 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:18:03.28 .net]
- いつまでも俺のこと話題にしつづけてくれ! まで読んだ
自意識過剰すぎてきもい
- 567 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:21:22.12 .net]
- >>546
いやあ、本人はそうは思ってなさそうだけど?自己顕示欲は満々みたいだけど まあ、話題にしている>>513や俺などに対する当てつけ的になら、なんかすまん
- 568 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:23:17.23 .net]
- 自作自演2
- 569 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:27:22.55 .net]
- なにか気に触るようだな、繰り返しとはwなにが気に触ってるのかさっぱりだな
- 570 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:37:04.17 .net]
- これ以上そのクソを撒き散らすなら大量のコピペでスレ埋め尽くすぞ
- 571 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:39:25.91 .net]
- 問題定義をはっきりせずに、回答に対して一方的にダメ出ししてるから当たり前だろ。
>>521 だって awk や perl の解は >>521 とほぼ同程度の記述量なのに (GECOS に /bin/bash とか書いてあっても誤動作しないという点ではむしろ優れてる) 「シェルスクリプト以外しらない」とかいう視野の狭さを撤回しないし。 ほぼすべてのプログラマーにとってシェルスクリプトってのは 第二・第三言語であって、シェルスクリプトが最適な用途なら使うけど、 そうじゃない場合があることは当然知ってて、 こんな風
- 572 名前:に威張って使うものじゃないんだよ。
インフラ担当ならシェルスクリプトが第一言語ってのもありうるけど、 そういう場合にはこんなに威張らないよなあ。 [] - [ここ壊れてます]
- 573 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:40:09.57 .net]
- なんでやねんっwヤツより悪質/ヤツ以下になってどうするねん
まさかお前(てか、ここ一連の)はヤツじゃないよな?
- 574 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:42:22.47 .net]
- この板ってワッチョイは使えるんだっけ?
次回からいれるか
- 575 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 19:42:45.45 .net]
- >>551
たぶん、前スレの最初の方で言っていた人のヤツの性質があたり的な 真っ当なやりとりはできなさそうな上に逆に私怨を持ちやすいタイプだから、そういう真っ当なのをちゃんと聞くかどうか怪しいな
- 576 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 21:34:04.16 .net]
- シェルスクリプトのデバグに関する質問です
eval XXX というコマンドで実行されるコマンドを確かめるには evalをechoに置き換えて echo XXX とやればいいですかね。 両者の間に、実行されるか表示されるだけかの違い以外の差異はありますか? 例えばある種の展開が行われないとか。
- 577 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 22:22:58.09 .net]
- eval を echo に書き換えるという方法でデバッグはできるんだけど、
a='echo $PATH' という状況で echo $a →「echo $PATH」と表示する eval $a →「echo /bin:/usr/bin:/usr/local」を実行する みたいな違いはある。 eval は引数文字列に含まれるシェルのメタキャラクタを再評価するけど、 eval 以外の普通のコマンドではそういうことはないので。 あとデバッグは sh -x スクリプト名(ないしスクリプト先頭で「set -x」)して 実行状況を標準エラーに表示させるってやり方もお勧め。
- 578 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 22:40:48.60 .net]
- >>556
ありがとうございます。 シングルクオートでも展開されるのは盲点でした。 sh -x のほうが確実ですね…… 訊いてよかったです。
- 579 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 22:45:26.76 .net]
- >>557
ちなみにevalで再評価されてるシェルのメタキャラクタは シングルクオートじゃなくて $PATH の $ の方ね。 シングルクオートは代入時に字句解釈されるだけで、 $a の中身には残ってないので。
- 580 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 23:19:14.33 .net]
- >>551
> >>521 だって awk や perl の解は >>521 とほぼ同程度の記述量なのに > (GECOS に /bin/bash とか書いてあっても誤動作しないという点ではむしろ優れてる) いや、そんなことドヤ顔で言われましても・・・ 4文字追加で終わりだし cat /etc/password | grep ':/bin/bash$' | cut -d: -f1 減らそうと思えば減らせるし grep ':/bin/bash$' /etc/password | cut -d: -f1 あれあれ、じゃあこれ↑は、"grep向き" の問題ってことですかね?w 俺が言ってるシェルスクリプト向きの問題っていうのは 既存のコマンドの実行と組み合わせが簡単に実行できるってことだよ
- 581 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 23:34:25.44 .net]
- >>551
> ほぼすべてのプログラマーにとってシェルスクリプトってのは > 第二・第三言語であって、シェルスクリプトが最適な用途なら使うけど、 はぁ?第二とか第三とか何いってんだか。 適切な言語を使うだけの話だろ シェルスクリプトじゃなくてPythonを使えばいいと言われたから、 "シャルスクリプトで普段やってること" = >>521で書いたような 外部コマンドの実行とそれをパイプでつないで簡単に処理することが 簡単にできるって例に出したのに、 お前は「catを実行して、その出力結果をgrep に渡して、さらにcutにわたす」 というお題を、awkやperlに置き換えるしpythonで全く違うコードに書き換えるしw 今からでも良いんやで、pythonで 「catを実行して、その出力結果をgrep に渡して、さらにcutにわたす」 を書いてみなよ。 いいか? catコマンドとgrepコマンドとcutコマンドを ちゃんと呼び出すんだぞ。今度は間違えるなよw ほんとシェルスクリプトがなにが得意なのか全くわかってねーわw
- 582 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 23:41:12.01 .net]
- な?www
- 583 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 23:43:50.91 .net]
- な?問題を誤解して的はずれなレスを出すんやで
話にならんわ
- 584 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 23:46:19.16 .net]
- >>5
- 585 名前:59
> あれあれ、じゃあこれ↑は、"grep向き" の問題ってことですかね?w 勿論そうだよ。 正規表現で書ける条件だったから、grepでうまくいった。 世の中には正規表現で書けない条件とかも当然あって、そういう場合 perlやawkなら自明にかけるけど、スクリプト言語使わずに シェルだけで書こうとすると面倒だったりする。 > 俺が言ってるシェルスクリプト向きの問題っていうのは > 既存のコマンドの実行と組み合わせが簡単に実行できるってことだよ それに反対してる人は誰もいないと思うよ。 それこそがシェルが特化している応用分野なわけで。 しかし>>521はそれを示す例題としてはよろしくない。 他の言語ならコマンドの組み合わせとかせずに容易に解ける問題だからね。 []- [ここ壊れてます]
- 586 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 23:47:07.64 .net]
- お前に言ってない。さすがだなwwいつもその調子。問題出すのもその調子だからなあw
- 587 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/12(火) 23:48:09.54 .net]
- >>563
真面目だなっ!w ある意味尊敬(馬鹿にはしてない)
- 588 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 00:13:02.23 .net]
- >>563
お前が問題を理解できなかっただけのこと >>516 > 今時Python使わないでわざわざシェル使う理由って? 俺はこれ↑に対して、シェルスクリプトの方が適した問題だからって コマンドをつなげて実行できるのが簡単だと↓以下のように>>518でレスしたわけだが > pythonであるコマンドを実行して > それを他のコマンドに流すみたいな > ことが簡単にできたらね 結局、だから俺が最初から言ってるように、シェルスクリプトの方が 適してるんだろ? ならもうお前口塞げ、混ぜっ返してるだけでなにも役に立ってない
- 589 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 00:20:43.06 .net]
- >>563
あとなやっぱりわかってないわお前 grepもperlもawkもコマンドなんだよ。 シェルスクリプトっていうのは、そのコマンドを "組み合わせる"のが得意って話だ。 だからgrepもperlもawkもシェルスクリプトのパワーの一つなんだよ。 もちそんそれだけじゃない。便利な多くのコマンドが 用意されてる。それらはシェルスクリプトの関数であると言える pythonで、せっかく用意されたこれらのコマンドを使わないで python用ライブラリとか使って冗長にコードを書くならそれは無駄だし コマンドを使う場合でも、シェルスクリプトほど簡潔にできない。 シェルスクリプト(grep, perl, awkを組み合わせること) VS python(grep, perl, awkコマンドを使う もしくは 使わない) って話であって、perlの方が〜awkの方が〜っていうのは シェルスクリプトの方がシンプルに書けることの反論になってないんだよ。
- 590 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 00:23:56.99 .net]
- なんか変な人が居着いちゃった
- 591 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 00:24:50.12 .net]
- >>568
前からやで。ずっといついている ずっと前から俺はいる
- 592 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 01:18:17.08 .net]
- IDもワッチョイもないからオレオレ言われてもレスの時系列で追えないし面倒だわ
まあキチガイ君がお題の条件だしが決定的に出来ない子なのはよく分かる >「catを実行して、その出力結果をgrep に渡して、さらにcutにわたす」 >521読んで道程まで完全に一致させろいう意図だと理解できたやつがいたら天才だわ 普段から人と会話してなさそう
- 593 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 01:27:58.12 .net]
- >>521
grep /bin/bash </etc/password | cut -d: -f1
- 594 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 01:32:08.64 .net]
- >>570
>>518を読んでいればわかるだろ > pythonであるコマンドを実行して > それを他のコマンドに流すみたいな > ことが簡単にできたらね
- 595 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 01:38:12.94 .net]
- 普段から人と会話してなさそうが如実
- 596 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 01:40:17.86 .net]
- そういう悪口しか言えなくなったらおしまい
- 597 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 01:55:40.86 .net]
- そろそろ名前つけてくれませんかね
- 598 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 02:14:43.53 .net]
- POSIX shで絶対値をなるべく簡単に扱いたいんだけどいい方法ありますかね
exprコマンドにabsとかがあればよかったんだけども
- 599 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 02:31:02.70 .net]
- >>571
入力側のリダイレクトって読みにくいので、自分もcatで書くかも
- 600 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 03:18:10.80 .net]
- >>575
いやでござるwww >>576 マイナスだけでいいなら echo ${a#-} プラスも考慮するなら echo $((${a#-}))
- 601 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 03:20:58.92 .net]
- お前じゃないよ自意識過剰
- 602 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 05:05:47.59 .net]
- >>576
こんなのどうだろう $(((0 < a)?a:a * -1)) (aに値を代入)
- 603 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 05:23:49.94 .net]
- なんで俺が短く書いたのに、わざわざ冗長なコード書くかね?
しかも三項演算子を使ってもっと短くかけるし $(((0 < a)?a:a * -1)) $((a>0?a:-a)) $((${a#-})) ${a#-}
- 604 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 06:09:33.52 .net]
- >>581
おまえのコードは本質的じゃない 彼が望むのは「絶対値」であって「マイナスを除いたもの」ではない OK? 分かったらひっこんでろ低能 もしこれに反論があったら「分かってない」ことになるからな?
- 605 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 06:26:16.58 .net]
- >>582
わかってないのはお前では? つーか、その反論されたら困るからって 「反論したら俺のかちー」みたいな言い方やめた方がいいよ 恥ずかしいw 俺は反論したから、さあ、次はお前が反論する番だ
- 606 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 06:48:30.93 .net]
- なんで阿呆が二人に増えるんだよ
- 607 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 08:16:13.42 .net]
- もう消えろお前ら
このスレに相応しくない なんだよ最近のこのスレの雰囲気最悪じゃねーか 長文ダラダラ返信長々と最後にレスしたほうが勝ちみたいな古い争いしやがってからに
- 608 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 08:17:03.30 .net]
- ヒント:一人二役
- 609 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 08:17:43.72 .net]
- >>577
簡潔に書きたいというお題じゃなかったのか
- 610 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 08:31:11.05 .net]
- >>577
<をどこに書いてもいいことはあまり知られていない。 </etc/password grep /bin/bash | cut -d: -f1
- 611 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 08:38:00.62 .net]
- いや読みにくいって話であってだな
- 612 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 08:45:03.32 .net]
- >>577
そりゃあんたの頭のレベルが低いからだと思うよ
- 613 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 08:58:22.24 .net]
- >583の脳内では全く論がない噛みつくだけの行為も反「論」になるらしい
これもう日本語が分かってないってレベルじゃないな ただの小学生だわ
- 614 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 09:13:46.26 .net]
- 小学生なら簡単に構ってちゃんになりそうなのはわかるな。もう構うなw
- 615 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 09:49:23.22 .net]
- GNU grep なら
$ grep -Po '^.+?(?=:.+:/bin/bash$)' /etc/passwd
- 616 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 09:56:16.86 .net]
- >>591
論じゃなければ、何か言い返せよって言うだけの話だけど? ほんと本質じゃないどうでもいい所にしか反応しないのなw
- 617 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 10:00:11.88 .net]
- さいごにレスしたぼくがしょうりなんだ!
- 618 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 10:17:30.52 .net]
- >>595
違うと思うぞw でもあんたはそう思ったから、書き込んだんだよね
- 619 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 10:21:55.43 .net]
- なんにでもレスするやつ
- 620 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 10:56:37.40 .net]
- レスしなきゃ負けると信じてるみたいだからしょうがないね
- 621 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 11:34:13.17 .net]
- $ cat <<. <<.
1AAA . 2BBB . とやると 2BBB とだけ出力されるんだけど、これどういう理屈か分かる? 標準入力ってヒアドキュメントでさえ上書きされる仕様なの?
- 622 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 11:42:05.35 .net]
- strace で見ると 2BBB だけ read してるな(1AAA は無視)。
- 623 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 12:01:06.03 .net]
- >>598
なるほど。だから「さいごに〜」とか話に全く関係ないことを言い出したのねw >>599 ヒアドキュメントって標準入力として読み取るものでしょ? そこは何らおかしくない cat < /proc/loadavg < /proc/uptime ってかいて、/proc/uptime からしか読み込まないのと一緒だと思うよ
- 624 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 12:22:00.85 .net]
- >>595
0x03e8 ばんさえとれればあなたのしょうりです。
- 625 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 16:23:41.49 .net]
- >>601
なるほどね $ somecmd < a.file < b.file ↑これでb.fileしか読み込まれないのも(やったことなかったから)知らなかった。 ありがとう
- 626 名前: []
- [ここ壊れてます]
- 627 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 16:51:47.47 .net]
- リダイレクトは引数じゃないからね
実質これと同じわけだし exec </proc/loadavg exec </proc/uptime cat
- 628 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 17:56:57.18 .net]
- >>604
なるほど、納得
- 629 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 18:05:22.98 .net]
- >>593
を〜、grep -oで切り出しできるのね 久々にこのスレで参考になりました
- 630 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/13(水) 18:44:51.04 .net]
- なんか嫌らしい感じ
- 631 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 18:54:32.62 .net]
- コロンを含むディレクトリを$PATHに登録した場合ってどういう挙動になるんだろう
- 632 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 20:11:28.93 .net]
- コロンがセパレータなのでそこで分かれる
- 633 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 20:52:33.17 .net]
- findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど
どうにかなりませんかね。 今のところ/dev/nullに標準エラー出力を捨てることで解決してるんですけども。 find . -exec basename \{\} \; | head ↑これで再現するはずです。 解決するときはできればPOSIXの範囲でやりたいです。findのGNU拡張で解決できるならそれでもいいんですが メインPCがOS Xなので、最低でもBSD拡張、さらに言えばPOSIXに限定してほしいです すいません。
- 634 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 21:25:25.31 .net]
- macOSだが再現しないなあ
- 635 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:13:02.03 .net]
- FreeBSDは再現しない。
CentOSは再現した。 対策は後で考える。
- 636 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:18:48.70 .net]
- なにか最近やけに POSIX にこだわってる奴が多いが同一人物か?
- 637 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:31:37.92 .net]
- >>613
単純にPOSIXの価値というかシェルスクリプト全体の有用性が見直されているだけでは たとえば*BSDのスレでGNUライセンスに拘ったレスが連続するのはおかしいが BSDライセンスを重視するスレがたくさんあっても別におかしくはないだろう
- 638 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:32:42.05 .net]
- パイプでなのでfindとhead が同時にプロセスとして存在
findが標準出力に出力するとパイプを通して/パイプとして繋がってるheadの標準入力に入力として headが目的を達して終了=パイプが無くなる、だがしかし、findは出力を続けようとし出力しようとしたらパイプが壊れてるうううっ 普通何もしなくても、パイプが損失したらSIGPIPEが飛んできて(強制)終了するんだけど(フィルタとしてもなUNIX的な望ましいデフォルト動作)、なぜかSIGPIPE無視して続けようという謎動作? findとheadが直接は繋がっていなくてかもしれんが。パイプの送出側がSIGPIPEを無視って謎動作なのは変わらないかな
- 639 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:38:09.62 .net]
- >>615
basenameが標準出力につながってるだけだから、findはwriteしないのでSIGPIPEを受け取らないよ。 basenameが事故死したのをfindが報告してるだけ。 というわけで、basenameが事故死したらfindを続けるのをやめるようにしてみた。 この方が無駄にbasenameを続けるよりよかろう。 find /var \( -exec basename {} \; -o -quit \) | head ただし、最初の事故死についてだけはfindがおせっかいに報告してしまう。 あとはまかせた。
- 640 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:41:30.04 .net]
- >>616
そのへんが実装によりちょっと違うってとこなのかなあ。出る出ないは
- 641 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:48:28.09 .net]
- >>613
自分側で「なにか違って」動かなかったらめんどくさいってだけじゃないの、単に
- 642 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:49:53.08 .net]
- >>610
- 643 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:50:38.44 .net]
- CentOS$ strings /bin/find | grep -i signal
signal %s terminated by signal %d FreeBSD$ strings /
- 644 名前:usr/bin/find | grep -i signal
なんもなし 以上、findのおせっかい度の差。 [] - [ここ壊れてます]
- 645 名前:619 mailto:sage [2018/06/14(木) 22:51:53.48 .net]
- すまん間違えて送信しちゃった
$ find /etc -exec sh -c 'basename {}' \; | head これでどうだろう。 -quitオプションはPOSIXの範疇ではないけどこれはPOSIXに準拠してる ちなみに>>610のコマンドラインはDebian GNU/Linuxのfind 4.7で再現した。
- 646 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:55:42.54 .net]
- >>619,620
なーるほどっ ww なるほどっ、なっとく
- 647 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/14(木) 22:57:07.67 .net]
- >>621
ん? それSIGPIPEは回避できるけど別の問題が発生しない? 「basename: 余分な演算子 XXX」←みたいに怒られるんだが あと $ find /etc -exec sh -c 'echo {}' \; | head ↑これをやるとやっぱりSIGPIPEが出されるようだ。
- 648 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:01:24.90 .net]
- >>613
どこかの先生が課題にそう書いてるんだろう。 ちゃんと調べないで持ってくるバカ学生が多いんじゃないの。
- 649 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:03:14.56 .net]
- >>610
>findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど この動作は、POSIX的にはどうなの? まずいというならPOSIX的にどうまずいの?
- 650 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:08:14.14 .net]
- find . -exec basename \{\} \; | { head; cat >/dev/null; }
- 651 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:14:45.23 .net]
- >>626
どういう仕組みなん?
- 652 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 00:39:45.42 .net]
- -execにこだわりがないのであれば、
find . -print0 | xargs -0 -L 1 basename | head 今度はxargsがお節介メッセージ出すけど、findはheadが終了したら終了する
- 653 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 01:01:37.95 .net]
- xargs(1)に-0オプションはない(POSIX厨)
- 654 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/06/15(金) 02:22:41.09 .net]
- findにも-print0は無いけどな。BSDにもあるからいいんじゃね
|

|