シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ: シェルスクリプト総合 その28 http://mevius.5ch.net/test/read.cgi/tech/1532397676/ >>284 wait()すりゃいいんだよ。 普通はinitが拾ってくれるんだが、誰にでも好き嫌いはあるということだろう。 >>280 >コマンドがINTシグナルで終了した場合、シェルが擬似的にシグナルハンドラ呼んでるっぽいかな(もしくは自らにINTシグナル出してるのかな 違うか。control-cでのINTシグナル送るやつの文献ってどこぞにあるかなあ Ctrl+C が、子プロセスやパイプラインのジョブグループに、 どのように伝達されていくかとか、難しい いろいろ間違っていた。訂正する。 まずCTRL-Cは関係なさそう。実は正常な動作でも(プログラム実行中に)ゾンビができることがあった。 ゾンビができると今は無限ループ状態になるので気づいたが、ちょっと前まではプログラムの構造上、 ゾンビを放置して正常終了していたと思う。zshではあまりテストしていなかったから気づかなかった。 バックグラウンドプロセスが関係あるかないかはよくわからない。 何回か動かしているがバックグラウンドプロセスを使用しない場合は今の所再現していない。 あとなんかWSLとのからみな気がしてきた。 速度が違うから断定は出来ないがLinuxだと再現しない。 今の所、WSL環境にて、zshで、バックグラウンドプロセスを使用し、 その中でパイプを使った処理を行うと、まれにゾンビプロセスができる。 >>286 シグナル一般の話ではなくてttyの話だったら、詳解Unixに載ってた気がするが、 当然そのくらいは読んでるよね。 >>287 ,289 なるほど すまん、読んでない。遠い記憶では読んでいたような気もするが忘れたので読んでない 再現コード出来た。このコード、なにか問題有る? これを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 dash、bashでは再現しない。kshでも再現した。 いずれもWSLのみ。これもうWSLの問題だろ・・・ きっとWSLのバグをzshとkshが踏んじゃったんだな 次のWindows 10のリリースで治ってんじゃないですかねー もういいか Zombie zsh processes left behind that consume 8 % CPU each https://github.com/Microsoft/WSL/issues/3940 Killing a defunct zombie leaks the zombie process forever https://github.com/Microsoft/WSL/issues/3741 https://docs.microsoft.com/en-us/windows/wsl/release-notes#build-18267 Fix issue where zombie process may not be reaped and remain indefinitely. read -r text <<HERE printf [%s]\n it's a "s'm'a'l'l 'w"o'r"l'd" HERE $text ↓出力 [it's] [a] ["s'm'a'l'l] ['w"o'r"l'd"] この仕様、うまくすればなにかに使えそうな気がしている。 文法エラーにもならずevalとはまた違った挙動だ。 とゆうかどういう仕様なんだろう? $ cat b.pl #!/usr/bin/perl -w print("$_\n") foreach @ARGV; $ cat c.sh #!/bin/bash IFS=+ ./b.pl a b c ./b.pl a+b+c while read -r v ; do $v ; done <<EOF ./b.pl a b c ./b.pl+a+b+c EOF $ ./c.sh a b c a+b+c ./c.sh: 行 6: ./b.pl a b c: そのようなファイルやディレクトリはありません a b c $ # うん、なかなか面白いね。どうしてこうなるかは man に書いてあるよ。 $ # 簡単に言うと、単語の分割というのは最初に行われるものと $ # 変数が展開された後に行われるものがあるんだ。 $ シェルスクリプト(対話操作含め)が実行される手順って結構複雑な割に他の言語よりずっと単純だから 理論から実践(この場合はシステム処理とか?)への、かなり良い足掛かりになるよね。 http://www.sample/ {01..10}.jpg これが書かれたtxtを読み込んでブレース展開して出力する方法ないです? $ printf "%s\n" < foo.txt 適当にこうやっても上手く行かなくて eval $(echo -n 'echo '; cat foo.txt) とか? sh << END printf "%s\n" $(cat foo.txt) END echo "printf '%s\n' $(cat foo.txt)" | sh でよかった >>304 内側のリダクレクトが何かと思えば $(cat file)の変形があったとは 複数行も対応してるしこれなら行けそうですわ ごめん、もうちょっとシンプルに書けた。 eval echo $(<foo.txt) >>306 これいいね! ……正直,実際に使う機会は少なそうだけど シェルの処理をしっかり把握してないと思い付かない回答。 例えばさ、 bash -n -c 'a=(a b c)' ↑これはbashとして正しい文法だけどさ sh -n -c 'a=(a b c)' ↑これは文法エラーになるじゃん? 実行していなくても これみたいに、実行してないのにあるシェルではOKで 別のシェルではNGみたいな文法って他に何かしらない? >>308 君と似た例ではあるが; $ bash -n -c '%=a' $ sh -n -c '%=a' eval 'printf "%s\n" '$(cat foo.txt) これprintfをシングルクォートで囲まないと改行されないのね http://www.sample/01.jpgnhttp ://www.sample/02.jpgnhみたいな結果ばかりでちょっと悩んだ zsh使ってないけどこれはforの後の二重括弧に空白が必要だとかなんとか {には空白がいるのにfor((が通るbashの方が不自然なのか export -p と export の違いってなに? \n の処理をだれがいつやらかすのかってとこかな。printfにやらせたいprintfに \n のまま渡さなくてはという感じ eval printf "'%s\n'" $(cat foo.txt) eval printf '%s\\n' $(cat foo.txt) そもそもなぜ eval を使うのかというと、コマンドラインの解釈において ブレース展開がコマンド置換より前だから コマンド置換してからブレース展開するためには eval を使って解釈を最初からやり直す必要があるためで しかしながら printf と "%s\n" にはその必要がないのだから、つまり printf "%s\n" $(eval echo $(<foo.txt)) でいいんじゃないかな。 ダブルクリックで実行できるのとできないシェルスクリプトの違いって一体 whileとcaseで簡易メニュー作ってたんだけどダブルクリックしても画面に何も出ない上に 起動されたbashがCPUがかなり食ってた 無論端末から実行はしっかり通る ls結果を外部保存するような単純な奴はダブルクリックでも正常通りなんだけど >>311 マニュアル嫁 つーか実行すれば一目瞭然だぞ ……と思ってやってみたらexportはオプション成しで起動すると export -pと同じ動作をするんだね >>314 使ってるGUIシステムがX11なら x-terminal-emulatorなんかを使って仮想端末を立ち上げてからじゃないと メニューみたいな端末出力を必要とするものは期待した通りに動かないよ。 >>316 そうマニュアルに書いてあるだろう。なんのボケ?w 模範解答 export -p がどう表示されるかはPOSIXで規定されていますが、 export がどう表示されるかは未定義です。(同じとは限りません) つまり、exportがどうなるかはシェル毎に異なります。 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#export 更にexport -pはbashではPOSIXに反してdeclareで表示されます。 これらは各シェルのマニュアルには書いていません。 bashで abc*が展開できると出来ないときがあって それをテストするのに [ "abc*" = 'abc*' ] とやりたいのにできません どうやったらできますか? >>321 何がどうできないのかよく分からないけどシングルクォートとダブルクォートは 処理が違うから「=」にならないと思うよ シングルクォート側は文字列なので「abc*」っていう文字列になるけど ダブルクォート側は解釈されるので「*」にあたるものが存在しないと何もない 状態なので「abc」って文字列になるんじゃないかな abc*が展開できない時はそのままabc*になるのでそう思って書いてみました abc* というファイルが実際にあるというというのは除外でいいのね? ダブルクォートで囲んでも囲んじゃうとglob展開は行われない変数などのようには。(>>322 見るとデフォでは??展開できるなんかあっったかなあ) [ "$(echo abc*)" = "abc*" ] とかかな any='abc*'; [ "$(echo $any)" = "$any" ] 日本語がダメな奴と日本語がダメな奴が 初心者同士の会話をしてる。 ついていけない。 >>327 ありがとうございます echoを使わずできたらお願いします 無理なら諦めます >>328 答えてやれよ。マウントとりではなくて。ふたレスもするくらいな (>>322 は正直お前の>>323 と同じだが、それだけじゃなというのと、もしかしてもしかしてもしかしてだけど) >>329 echoを使わずの条件がわからない。他にもやり方があるけど、複数行にだったり stackoverflowではなんか凝ったのより ls が人気みたい。見た目でわかりやすからかな 何をやりたいのかわからない。 端末にecho *って入力して あぁ、展開されましたねって 確認すりゃいいだけじゃんか なんで[ ]とか使うのか >>332 お前が何言っているのかわからない シェルスクリプトで判断してなにかその後にする部分のことを聞いてきているのだろう。その判断するとこだけを書いているのだろうと読むと思うけど (日本語どうの言うなら、他人の日本語より自分の日本語を疑った方がいいようなw) >bashで abc*が展開できると出来ないときがあって abc* としても、該当するものがあってglob展開する場合と、該当するものがなくてglob展開しない(出来ない=globのまま)ときがあって >それをテストするのに 展開できなかった場合はマズいので(とかなんとで)、それをテストするのに [ "abc*" = 'abc*' ] >とやりたいのにできません としてみましたが、思ったようになりません だよ。たぶんw Ruby で該当するファイル数を数えれば? それが、0 なら、該当なし p Dir.glob( 'C:/Users/Owner/Documents/*.txt' ).length #=> 0 >>333 お前はさ、なぜこういう質問に至ったかまで考えられてないんだよ。 意味不明なんだよ。 >>334 そう思うやろ?だったら意味不明って気づかなきゃ。 > 展開できなかった場合はマズいので つまり、現時点で「展開できてる」はずなわけだよ。 展開の仕方を知ってる。 なのに展開できないと言ってる。意味不明だろう? >>336 なにを言っているのかさっぱりわからん。意図目的とすることがな。いや後半はまったくわからん、お前の頭の世界の話だけのようで。ちょっと怖いぞw ただマウントとりたいだけというのはわかるぞw 読めなかったらのをごまかすためにむちゃくちゃ言っているんだな うん。そゆことにしとこ。でないとアレだなということで だーかーらー、いつもどおりのやってるやり方で展開して それをチェックすればいいだけだろと ぜんぜん「だーかーらー」でもなんでもないな。お前の言っていることはわからん どうも自称初心者じゃない自称日本語ダメじゃない人の自分の脳の世界でなんか言ってるとしか見えない お前の言う初心者の ID:6T3A9gnL は >>327 ので不満があるようだがそれでも答えになってるらしいぞ お前の変な言い分はお前のためでしかなく、他に対する目的も意味もない。マウントとりたいだけのお前には意味があってもな。マウントとりたいから延々続くのか? 誤 お前の言う初心者の ID:6T3A9gnL は 正 お前の言う初心者の ID:6O+4Q2Ek は なんかすまん > お前の言う初心者の ID:6T3A9gnL は >>327 ので不満があるようだがそれでも答えになってるらしいぞ だからなんなのか知らんが、お前ら、いつもどおりの展開ってecho使ってんのか? 使ってないだろ。いつもどおりの使えばいいだけなのに、 悩んで(?)別の方法模索してるから、意味不明だって言ってるんだよ。 質問者にも回答者にも むちゃくちゃww 自分で>>332 って書いているのに 言うにことかいて「だからなんなのか知らんが」だってwwwもろマウントとりたいだけ、マウントとり失敗してわけわからんだけだな 展開されるかどうかの確認はそれでいいし、 プログラムでならいつもどおりのやり方で展開すればいい 何をやりたいのかわからないのに、どちらの話かわかるわけないだろ どちらにしろ「は?」なわけだが っていうか、正しいやり方知らんのか? echo使って検査するんじゃないぞ(それじゃできない) それじゃできないっていうのはコレな > abc* というファイルが実際にあるというというのは除外でいいのね? abc* というファイルが実際にあることも考慮するやり方をするべき そうすれば正解にたどり着く ダメな場合もあるのはわかって聞いているんだけど。本人がいいっていったからそれに合わせてだよ だれかみたいに「すべき」とか強要するつもりも知識自慢したくてたまらないとかもないからな。その最後のといい、なんか偉そうにしたいのね、質問者の意図とか読まずに、知識自慢するためのw質問者の他の情報も引き出そうともせずに shopt使うとかいう知識自慢だったら笑うぞ。別にabc*という実ファイルがあった場合でものshopt使わずにの方法もあるけどな 本当に差があるやつとの会話は疲れるw > bashで abc*が展開できると出来ないときがあって 展開でするやり方知っってるよな?それ使え > それをテストするのに 展開できないことのテストはいらん お前が知ってるはずの、展開するやり方を使って、 -f (もしくは -d や -e 等)で、その名前の そのファイルが実査に有るかどうかを調べるだけ shoptとかもしらん やっぱり、まだわかってないんだな、「展開〜」という質問を shoptとかもしらん.... -f とか、まさかそんな「当たり前の」こと言い出すとは まさか「その程度」だとは思わなかったわっ。なんだろこれw × shoptとかもしらん ○ shoptとかもいらん なんで当たり前の正解を言ったら お前悔しがってんの?w 知識自慢したのお前じゃん そして「は?」の意味わかっただろ。 全く見当違いのことをやろうとして、 全く見当違いの解答をしてるんだよ。 クソガキどもが そりゃ、お前が悪い。shoptもな なんかもったいぶってるだけでだからな。自覚がないのか?さんざん偉そう俺は初心者じゃないってだけの、質問から外れたことばっかり言っている お前が>>349 を>>352 で書けば終わってることだからな 俺は別にお前みたいな知識自慢したくてなんてないぞ。おまえがさんざん俺偉いというだけのような&「そうすれば正解にたどり着く」とかうやむやなこと言うからだろうに とうとう、「クソガキども」のお言葉いただきましたっ。なんだじじいかw自称他人を自分より劣ると言える 誤 お前が>>349 を>>352 で書けば終わってることだからな 正 お前が>>349 を>>332 で書けば終わってることだからな だから何をやりたいのかわかったのは それ以降のレス読んでからだろうが 意味不明だし、馬鹿がクソな回答しやがるし ほんと低い >だから何をやりたいのかわかったのは イミフ。おまえもたいがい日本語ダがメだぞ?w いままでのレスの数々でも やっぱり「俺高いお前低い」とは言いたいのね。なんでそう言いたいのか自分に問いてみような ああ、「クソガキども」のお言葉いただいたので(なんでそんなこと言いたくなったのか自分に問いてみようなw)、もういいや > なんでそう言いたいのか自分に問いてみような 邪魔だからだな。頭悪そうな兄ちゃんがきて 頭悪そうな会話をしてる。そんな感じだ。 質問する側が馬鹿すぎると馬鹿を引き寄せるだけなんだよなあ。 まず、まともな質問をするために man を読もうよ。 よくわからんが、なんで -f が出てくるんだ? ファイルの有無が問題じゃないんだろう? globしたかしないかが問題なんだろう? ""で囲むと展開されなくて""で囲まないと複数の引数として認識するから出来ないので諦めますね >>361 globでファイル名に展開されるかどうかは ファイル(ディレクトリなども含む)の有無で決まるから >>363 こういう奴がセキュリティホールを作り込むのかね そもそも、ファイル名に、半角英数字、- _ (base64url encoding)以外を使うような、 システムを作る奴が悪い さらに、Windows では、大文字小文字だけが異なる、ファイル名も作れないし。 例、aB, Ab >>364 セキュリティホールを作るのは、 お前のように正しく理解してないからだよ。 問題が有るというのなら言ってみな。 なぜ自信満々なのか、馬鹿の頭の構造はわからないな。 シェルの歴史に詳しくなれるサイト見つけた https://www.in-ulm.de/ ~mascheck/ bashのさ、<() ってさ、sort test.txt みたいなのを sort <(cat test) って書けるから リダイレクトを受け付けないコマンドに、一時ファイル作らずに渡せると思ったけど、 そうとはかぎらないよな?例えば、同じファイルを二回読み込むとかさ そういうのってやっぱ一時ファイル作らないと無理だよな? >>371 パイプの概念がないのか? sortコマンドもどこでどうなったのかを気にしないで使うというのもよくわからない。 >>372 知らんがな。俺に言うなや。 そのツールが、そうなってるんだから sortコマンドはただの例だからこれ以上追求しなくていい てか、複数ファイルを入力したり複数ファイルを出力したりすることだって あるんだから、必ずパイプで解決できるわけじゃない diffコマンドとかそうだろ 同じ出力のデータを分けて処理することは可能だが、なぜ魔法文にこだわっているのかがわからない。 >>374 その話は関係ないから打ち切ろう あるツールが「引数で指定した同じファイルを二回読込みしている」 そういう処理をしている。(そのツールの修正は不可能) ここまでは理解しているかな? まあ結論としては無理ってわかってんだけどさ bashの拡張を持ってしても あ、一時ファイル(FIFOファイル含む)作りたくないっていうのが最終的な希望ね。 メモリだけ(tmpfsや類似のメモリベースのファイルシステムやブロックデバイス除く)でやりたい。 無理ってわかってるけど。 >>371 例がないと何を言っているか意味がよく分からない。 teeとかファイルに出力しながら標準出力にも出力しているけど、 そのようなことがbashだけで表現できればOK? >>379 「リダイレクトを受け付けないコマンド」例 ファイル内容と行数を表示するために「同じファイルを二回読み込む」 これは "例" でありこのコマンドの内容についてのレスは不要 実際には中身はわからずバイナリで修正不可能なものとする。 #!/bin/sh cat "$1" wc -l "$1" ↑このコマンドに対して、一時ファイル(FIFOファイル含む)を作らないでデータを渡す >>380 ファイルを作らないでメモリだけでっていうことなら、 ↓こんな感じならOKなの? dat=$(cat $1) >>381 それでもいいよ 何をしたいのかわからんけど kono-comand ? ↑?の部分になんて書く? 明らかに読み間違えてるレスがくると疲れるんで、 一時ファイルを使った場合の例も書いておくは これは例なんで、この例を修正しろなんてレスは不要 generate-text > /tmp/test.txt kono-comand "/tmp/test.txt" この一時ファイル test.txt を作りたくない なんで?とかいう質問も不要 >>383 ホントに意味が分からないんだは、 上の例でもこれでいいんじゃないのと思っちゃう。 generate-text | kono-comand だからこれを直せってほうが意味通じるかも。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる