1 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 11:53:21.38 ID:BBiLRgnj0.net] !extend:on:vvvvv:1000:512 !extend:on:vvvvv:1000:512 シェルスクリプトに関する総合スレッドです。 スレ立て時は以下の文を先頭行に加えて下さい。 後のつけ忘れ防止の為に複数行重ねて追加推奨 !extend:on:vvvvv:1000:512 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ シェルスクリプト総合 その28 mevius.5ch.net/test/read.cgi/tech/1532397676/ VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
121 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 00:30:44.79 ID:ej0n10jM0.net] 煽りだよ だって明らかに学校の課題かなにかでしょ。 そんなのに真面目に付き合うほど俺は素直じゃない。
122 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 00:44:57.49 ID:m57KKa9e0.net] 苦しすぎな言い訳w
123 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 01:48:10.18 ID:ej0n10jM0.net] まあそう思っとけw
124 名前:デフォルトの名無しさん [2018/10/03(水) 01:59:13.13 ID:jikKostS0.net] >>115 echo は使っては駄目? 拡張されていない sh だと echo はビルトインではなく /usr/bin/echo だと思うが。
125 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:01:17.96 ID:NkO7phbc0.net] >>118 そう。変数禁止なので不正解 >>121 変数禁止とか学校の課題ででるわけないじゃないw
126 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:03:27.25 ID:NkO7phbc0.net] >>124 使ってOK。 俺の知る限りechoがビルトインでないものは知らない 関係ないけどechoみたいな基本的なコマンドが シェルによって挙動が違うのはどうにか ならなかったんだろうか
127 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:14:54.02 ID:NkO7phbc0.net] そうか。evalとか外部コマンドは実装不可能なものを除いて ビルトインで実装することなんて決まりはないのか では外部コマンドの定義を「現存するシェルでビルトインで実装されたことがないもの」にしよう オレオレシェル作ってビルトインするのは問題の意図から外れるので、 現存する(誰もが容易に入手可能な)いずれかのシェルで ビルトインされているならば使って良いものとする
128 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:18:56.23 ID:NkO7phbc0.net] あと拡張POSIX機能も使用してOKにしよう。 それを実現する裏技みたいなのがあったら嫌だなと思って入れたが、 もしそれでできるなら俺も勉強になるし。 ようするにPATH環境変数を空にして、どれかのシェルで動けばOKってことだな 条件がグダグダになってしまったw
129 名前:デフォルトの名無しさん [2018/10/03(水) 12:27:47.15 ID:61GCF4dla.net] if や while を外部コマンド動かさずに使うには [ がビルトインのシェルでないとダメだな。 昔の sh は [ が test コマンドへのシンボリックリンクで外部コマンドだったし。 今でもその名残で /bin または /usr/bin に [ が入ってるよな。
130 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:43:00.79 ID:NkO7phbc0.net] 別件で現在主要のシェルで何がビルトインか調べたことがあるよ . : [ break cd command continue echo eval exec exit export false kill pwd read readonly return set shift test times trap true umask unset wait これらは全てのシェルで使えると言っていいだろう poshはログインシェルとしては使わないもの扱いなのか alias bg fg type ulimitが削除されている。(typeないとか地味につらい) busyboxはgetoptsがないみたい 意外だったのはprintfがビルトインでないシェルがmkshとposhの2つもあったこと。 しかも両方共echoでエスケープシーケンスを解釈してくれるから文字をそのまま出力できない。 mkshの方はset -o posixでエスケープシーケンスを無効にできるしビルトインのprintで代用できるんだが poshは調べた限りビルトインコマンドでそのまま出力する方法がない
131 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:47:38.74 ID:m57KKa9e0.net] いいから、お題の参考答えを出しなさいw オレオレ定義が曖昧すぎでお題になってないから、もういいでしょ
132 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:57:02.54 ID:NkO7phbc0.net] >>131 問題訂正してやるから、もう少し頑張れやw お題 ある関数に対して、apple orange banana ... とN個(Nは任意の個数)の引数を渡した時、 以下のような、引数とその引数のインデックス番号を出力する関数を作成せよ (単語に対して数値が対応しているわけではない) apple 1 orange 2 banana 3 : ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること (ここでいう変数とはsetコマンドで表示されるもののことである) (使用するコマンドはいずれかのシェルのビルトインコマンドであればよいが、 この問題用に独自シェルを作成するのは禁止とする)
133 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:59:49.96 ID:m57KKa9e0.net] なんの目的かさっぱりわからんな。自分でできてんの?っていう疑問からなんだけどなw >変数の使用は禁止とし >(ここでいう変数とはsetコマンドで表示されるもののことである) 環境変数のことを言っているのかと思えば違うし、これだけでも曖昧というかオレオレ定義が曖昧だろう
134 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:11:05.97 ID:NkO7phbc0.net] >>133 setコマンド実行してみてみばわかるでしょw setコマンドで表示される変数はシェル変数(環境変数含む)だよ それを使うのは禁止ってこと
135 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:13:32.35 ID:NkO7phbc0.net] 今日の24時までに答えが出なければヒント出しますw
136 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:16:57.73 ID:6m7pNgyW0.net] そのヒントとやらもグダグダなんでしょw
137 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:17:05.40 ID:m57KKa9e0.net] 変数を使わない 言語(マシン語すら) は知らんなあ。そういう縛りを設けての目的はなんなん? やってみたできるけど、クソのようなwにしかならんから、どうか、参考の答えを出してw
138 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:19:23.20 ID:NkO7phbc0.net] 答えは明日。まあヒントみれば気づく人はすぐわかるでしょう。 コロンブスの卵だよ
139 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:20:30.02 ID:m57KKa9e0.net] なんで常時上から目線なのかw コードで語ればいいのに 素晴らしいコードならそんなおれおれ上から目線しなくてもいいくらいなのに。なんかしらんがもったいつけてのまだ「ヒント」とかもったいつけてるしw
140 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:21:39.64 ID:m57KKa9e0.net] なんかしらんが見つけて、俺すげーしたいだけっぽいなw
141 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:22:11.11 ID:NkO7phbc0.net] > そういう縛りを設けての目的はなんなん? その理由も答えと一緒に明かします
142 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:23:23.18 ID:m57KKa9e0.net] いや、もういらんわw なんかキモすぎて付き合いきれないw
143 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:36:43.15 ID:ej0n10jM0.net] 多分だけど学校の課題だと予想 根拠は二点: 1. 問題が実利的でない。学校(それもあまり学力の高くない)にありがちな「こんなのできるかな?」系の問題である。 2. 煽ったらそれに乗っかって答えを出してくれる人が思ってるという点で質問者が精神的に幼ない。(高校生くらいか?)
144 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:45:22.66 ID:m57KKa9e0.net] posh とかいつもの人でしょ いつもの人が学校の課題をしなきゃならん人なのか知らんけどw
145 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 15:06:30.08 ID:ej0n10jM0.net] poshなんていうシェルがあるのね。初耳だわ。
146 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 15:10:04.24 ID:NkO7phbc0.net] >>2 に書いてあるよ。俺もここ(の何スレか前)で初めて知った
147 名前:デフォルトの名無しさん [2018/10/03(水) 15:58:50.21 ID:4kFnpcnsa.net] $# と shift を使って逆順に値を付加することは簡単にできたんだがな。
148 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 17:25:26.25 ID:NkO7phbc0.net] >>147 俺も第一歩目はそこまでだったw 俺の本来の目的(今回の問題とは別件)は逆順でも実現できたんだけど なんか悔しかったので、もう一歩進めたら逆にすることなく実現できた
149 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 21:20:26.89 ID:SM8JpmZX0.net] ちょっと前にもこんなグダグダ無かったっけ?
150 名前:デフォルトの名無しさん [2018/10/03(水) 21:48:53.18 ID:Tma5IQlaF.net] 変数使ってはダメって、非合理的でない? シェルの仕様否定してどーするの? 外部コマンドだって、それがUNIXの設計思想なんだからそれさえも否定するってのも理解不能 ならば、OSそのものを仮想的なものを仮定して その上で動かすとでもしないと 大昔の情報処理技術者試験用に作られたアセンブラみたいな感じでさ 変数使わない、外部コマンド使用禁止、そんなアルゴリズムが何の役に立つんだろう?
151 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 22:35:14.41 ID:ej0n10jM0.net] でも前はワッチョイやIDがなかったから もっと酷かった。 今はNGすればオッケー☆
152 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:37:38.01 ID:8ua9ZMtc0.net] ヒント忘れてたわw func() { ********* while [ $# -gt 1 ]; do ********* shift done } func apple orange banana ********の所は1行とは限りません
153 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:41:45.65 ID:8ua9ZMtc0.net] >>150 シェルスクリプトはPOSIXの範囲では ローカル変数がないから、変数名がかぶると困るんだよ もちろんサブシェルを使うという手もあるが 引き出しは多いほうが良い
154 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:43:44.36 ID:8ua9ZMtc0.net] >>151 それなw 見たくないやつが絡んでこなくなったので 過ごしやすくなった。
155 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:46:12.13 ID:8ua9ZMtc0.net] >>150 ちなみにこれアルゴリズムじゃないよ アルゴリズム系だと一時変数を使わずに変数を入れ替える方法とかあるけど これはシェルの機能を使った、あぁ、なるほど系の問題
156 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:49:17.75 ID:C6pwZkBD0.net] いきなりレス数増えたと思ったらもう木曜か
157 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 04:55:02.39 ID:/YMF27MO0.net] >>152 よ、お前のなかでは「$#」は変数じゃないのか……。 人様にクイズとやらを出す前にシェルとはなんなのかを学んだらどうだ?
158 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 05:43:44.35 ID:8ua9ZMtc0.net] 出題ぐらいちゃんと読もうぜw > ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること > (ここでいう変数とはsetコマンドで表示されるもののことである)
159 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 08:51:53.43 ID:/YMF27MO0.net] bash 4.2以降はset組み込みコマンドの中に$#が含まれるようになったんだよなぁ… ちゃんと調べて、どうぞ。
160 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 09:17:07.53 ID:8ua9ZMtc0.net] ないですね。ちゃんと調べてどうぞ foo() { set | grep '#='; }; foo $ bash --version GNU bash, バージョン 4.4.19(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2016 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
161 名前:デフォルトの名無しさん [2018/10/04(木) 09:50:29.05 ID:8DudSISka.net] >>160 grap のパターンはそれでいいのか?
162 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 10:01:44.50 ID:8ua9ZMtc0.net] >>161 良いに決まってるだろ 正規表現に自信がないなら自分で調べたら? 質問してるってことは、動かしてないんだろうし。
163 名前:デフォルトの名無しさん [2018/10/04(木) 10:47:30.53 ID:8DudSISka.net] ああ。そうか。最初の$は要らないからそれでいいのか。
164 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 14:55:58.09 ID:7ib5/eAS0.net] grap コマンドか、なんか強うそうなイメージ
165 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 16:22:52.78 ID:/YMF27MO0.net] なんかもう誰かが作ってそうだよね。 まるでyaから始まる4文字のソフトウェアが被りまくってるように。
166 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 16:55:15.20 ID:8ua9ZMtc0.net] 犯人はya
167 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:00:19.77 ID:8ua9ZMtc0.net] 正解者もいないようなのででは解答 このコードがどういうときに有用かは>>153 で書いたとおり set は使わなくても別にもう一つ関数を作れば同じことができるが 関数を作らずとも引数の再設定という方法がある。意外と便利だよ func() { set -- "$@" $(($#+2)) while [ $# -gt 1 ]; do eval "echo \"$1 \$((\$$#-$#))\"" shift done } func apple orange banana
168 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:11:54.69 ID:n5lIiyiD0.net] そんなクソなコードを意気揚々としてあげてるけどさ、なんか変数被るからというもっともらしい言い訳してたけど、なるべく変数使わないように書くわけだ、これから。ほーっw。そんなのクソだな、個人的にw なんでそういうお題をそんな俺偉いじゃなくてできないのかな。よほどそれを出すのに時間かかったとか??
169 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:12:23.41 ID:8ua9ZMtc0.net] はい。想定通りのレスだね。 言い訳だけは一人前w
170 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:13:26.14 ID:n5lIiyiD0.net] いや、ふつうわかるだろう。まあ、かなり頑張って出したんだね、やっぱりw
171 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:14:13.91 ID:8ua9ZMtc0.net] じゃあもう一問。そんなに言うなら次は答えてね
172 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:15:02.61 ID:n5lIiyiD0.net] だから、なんでそんな上から目線なのよ んなのに付き合うと思ってるの?あんた自体が上から目線でモノ言われたらすぐ反発するくせにww
173 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:18:43.51 ID:n5lIiyiD0.net] いや、上から目線じゃなくても反論されたらかwww
174 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:20:37.56 ID:8ua9ZMtc0.net] >>172 お前はこのおっさんと同じ種類の人間だろうな 相手が下だと思って接してるやつ。 まずお前が上から目線を止めたら? https://togetter.com/li/1175445 おっさんがタメ語で聞いてきたからタメ語で返したらショックを受けてた。敬意が返ってくると思ってる日本のおっさんって不思議。
175 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:24:38.91 ID:n5lIiyiD0.net] いや、お前に合わせているだけだな。さすが常時上から目線なんかしらんが常時上に立ちたいの人は言うことが違うなw
176 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:27:29.69 ID:8ua9ZMtc0.net] 上にたってるつもりはないんですが、上に見えちゃうんですかね?w 悪い奴らが「正義の味方のつもりかよwww」って 笑ってるようなシーンがあるけど、あれも悪い奴らに 正義に見えてるからそう言うんでしょうねぇ
177 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:28:28.79 ID:n5lIiyiD0.net] 忘れているのか常時上に立っているつもりで気がつけないwのか知らんが、ID:8ua9ZMtc0 の上から目線なレスに対しての俺のレスでしかないよ なので、その得意げの>>174 はそっくりそのままあんたにお返しいたします
178 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:29:44.58 ID:n5lIiyiD0.net] あーあ、病気なのか社会性がないのか話にならんな。まあ、いつもの無理やりなごまかしモードかな?w
179 名前:デフォルトの名無しさん [2018/10/04(木) 20:33:31.45 ID:vhCji18k0.net] 目くそ鼻くそに上も下もないわwwww
180 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:34:30.94 ID:n5lIiyiD0.net] やかましいわっw
181 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:50:21.03 ID:8ua9ZMtc0.net] これはある意味有名だから簡単だと思う お題 ある関数に対して1以上の整数Nを引数にして呼び出した時、 1からNまでを出力する関数を作成せよ(要するにseqコマンドの簡易版) seq 5 1 2 3 4 5 : ただし、シェルビルトイン関数のみを使い、変数の使用は禁止とする (ここでいう変数とはsetコマンドで表示されるもののことである)
182 名前:デフォルトの名無しさん [2018/10/04(木) 20:52:49.73 ID:vhCji18k0.net] >>181 調子にのるな鼻くそ
183 名前:デフォルトの名無しさん [2018/10/04(木) 21:39:22.36 ID:sVn7z6Qaa.net] >>167 それ最初のposix縛りがあったら解けなくないか? $(( ))で計算させてるし。
184 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:11:17.39 ID:4+O8yrpt0.net] こいつ構わん方がいいゼ、俺スゲーしたいだけだから
185 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:14:04.78 ID:GYhkNq19a.net] レス番飛び過ぎにも程があるだろ まぁいつもの長文だらだら流して悦に浸ってるんだろうが
186 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:32:35.30 ID:n5lIiyiD0.net] >>183 pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html 2004の時点であるらしい。++と--は任意。sizeof()なんてあるのかよっ
187 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:46:42.45 ID:/YMF27MO0.net] >>181 これは興味から訊くんだけど, 「(POSIXの範囲では)変数の局所化ができないので 変数をなるべく使わないべき」 という主張は理解できるし,俺自身もそう思う。 しかしシェルビルトイン関数しか使わず,例えば sed(1)やawk(1)など目的に合った有用なコマンドを用いない理由はなんだ? ただの趣味?
188 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 01:23:25.22 ID:x9IT1j0q0.net] >>181 $(( )) での計算をしていいなら簡単だよ。 #!/bin/bash f() { if [[ $1 -gt 0 ]]; then f $(( $1 - 1 )) echo $1 fi } f $1
189 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 01:24:51.76 ID:x9IT1j0q0.net] >>186 そうだったのか。
190 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 02:53:44.46 ID:bSHFQ9XI0.net] >>187 現実的なポータビリティと速度のため POSIXの範囲でやれば、シェルが異なっても動くことが期待できる だけど現実的にはすべての環境がPOSIXに準拠してるわけではない 特にbusyboxは組み込み向けに必要最小限の機能に減らせるから sedやawkすらない環境というのもあり得るだろう そしてもう一つforkは遅い。WSL上だと目に見えて遅い 以下のコードをWSLで実行すると約25秒かかる。fork一回あたり2.5ミリ秒 Linuxだと約2秒。fork1回あたり2ミリ秒。10倍以上の差がある i=0 while [ $i -lt 10000 ]; do ( :; ) i=$((i+1)) done この()を外すとWSL上で0.05秒にまで減る。コマンド実行のオーバーヘッドに 埋もれてしまってよくわからないので、10,000から1,000,000から増やすと約1.7秒 つまり一回あたり0.0017ミリ秒。この値はLinuxでも変わらない 外部コマンドの実行でもforkが行われるから Linux・・・0.0017ミリ秒 → 2ミリ秒 (約1176倍) WSL・・・0.0017ミリ秒 → 25ミリ秒 (約14706倍) と大幅に速度が落ちる。シェルスクリプトが遅いと言われる原因の一つ
191 名前:デフォルトの名無しさん [2018/10/05(金) 02:58:21.89 ID:elz6X2140.net] なんもわかってない低学歴知恵遅れが はりきってしょうもないwsl使ってキャッキャッいってるわけか なるほどなるほど wsl使ってるのなんかニートぐらいしかいないわ マジで
192 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:00:21.47 ID:bSHFQ9XI0.net] >>188 やっぱり簡単だったかw 再帰を使うやり方で関数型言語ではおなじみの問題 もちろんシェルスクリプトは関数型ではないし 末尾最適化も行われないのでどうしても遅くなる さすがにこれは変数使ったほうが良いかな思ったw 他にも問題を作れそうなネタのはいくつかあるんで 気が向いたらまた問題にしてみるよ
193 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:01:11.86 ID:bSHFQ9XI0.net] >>191 やっぱ内容には全く触れず 叩けそうな所を叩くだけなんだなw 技術者としてつまらないね
194 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:25:46.03 ID:98l9MfY+0.net] 実用的じゃないもの書いてるうちは似非の技術者じゃの
195 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:52:16.47 ID:DwOdckeN0.net] >>190 シェルスクリプトはストリーミング指向だから そもそも制御文を多用することは避けたほうがいいのではってのは違うのかな。
196 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 08:48:03.27 ID:bSHFQ9XI0.net] >>195 ストリーミング指向と制御文はあまり関係ないと思うよ 流れてくるものに対してなにか処理をしたいなら必ず 制御文を使うことになるし ストリーミング指向の話をするなら、関数呼び出しし結果の標準出力を 変数にキャプチャするっていうのはストリーミング指向と反してると思う 例えば result=$(command "$data") みたいな形のことね 俺もこの書き方はなるべく避けるようになった ストリーミング指向的には echo "$data" | command | 別のなにか とするほうが良いだろう ただ気づいたのがこの形だとサブシェルになってしまうから、 commandや別のなにかから、呼び出しの起点にデータを戻すことが 簡単にはできないという所。値を戻すこと自体がストリーミングの流れに反しているし かと言ってそれが必要な場合もある。例えば処理した行数をカウントしたりとかね。 なので最近はイベントハンドラ方式を使うようになった echo "$data" | command "別のなにか(関数名)" (または command "$data" "別のなにか") 例えばだけどこんな感じにして、commandで$dataを1行ずつ処理して その都度、別のなにか(関数)を呼び出す。そうするとサブシェルにはならないので ストリーミングで処理しつつ、グローバル変数経由で呼び出し元に結果を返すことができる この時、別の何かがシェル関数の場合に、commandが外部コマンドだとシェル関数を呼び出せないので 連鎖的にcommandもシェル関数として実装。みたいなこともやってたりする
197 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 17:11:32.63 ID:bSHFQ9XI0.net] 10. 移植性のあるシェルプログラミング web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html
198 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 21:16:49.85 ID:NK5dBb8n0.net] >>196 なるほど。 俺は https://www.ipsj.or.jp/dp/contents/publication/32/S0804-R1601.html ここの3.1.1を読んで、制御文をなるべく使わない方向に開発をシフトしてみたんだよね。 まあどうしても必要な部分はあなたも云ってる通りもちろんあるけど。
199 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 08:20:34.66 ID:Sfai+wMy0.net] >>198 別にその記事に大きく反対したいわけじゃないけど おかしな点は指摘しておかないといけない その手続き型コーディングがステップ数が多く処理効率が低いと書いてある所だが その原因はストリーミング型コーディングのせいじゃない rmコマンドの発行回数が原因だ ■手続き型コーディング(ステップ数が多く処理効率が低い) i=3 while [ $i -le 10000 ]; do file="file${i}.txt" rm -f "$file" # 何度もrmコマンドを実行している i=$((i+3)) done 結果 real 0m3.232s user 0m2.488s sys 0m0.808s ■ストリーミング型コーディング awk 'BEGIN{for(i=3;i<=10000;i+=3){print i;}}' | sed 's/.*/file&.txt/' | xargs rm -f 結果 real 0m0.040s user 0m0.004s sys 0m0.040s
200 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 08:23:22.22 ID:Sfai+wMy0.net] プロセスが分かれており並列で動く可能性があるから 多少ストリーミング型の方が早くはなるとは思うが 以下のように修正すると差は殆ど無くなる。 ■手続き型コーディング修正版 i=3 files() { while [ $i -le 10000 ]; do file="file${i}.txt" echo $file i=$((i+3)) done } rm -f $(files) 結果 real 0m0.052s user 0m0.018s sys 0m0.044s 余談だがこれはLinuxで実行した結果だがforkが遅いWSLだと 起動プロセスが多い分逆転するかもしれない
201 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 08:41:27.69 ID:Sfai+wMy0.net] 訂正 その手続き型コーディングがステップ数が多く処理効率が低いと書いてある所だが その原因は手続き型コーディングのせいじゃない
202 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 10:50:18.29 ID:10V4sLOp0.net] >>200 非本質的だけど rm -f $(files)とかだとARG_MAXに引っ掛かる可能性がない? 尤も手元の機械では $ getconf ARG_MAX 2097152 だったので無問題かも知れないけど。
203 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 11:49:41.89 ID:Sfai+wMy0.net] >>202 > rm -f $(files)とかだとARG_MAXに引っ掛かる可能性がない? あるよ。それならxargsを使えばいいし、 xargsはファイルから読み込む方法もあるからパイプ使わなくても使える。 ともかく速さの理由はストリーミング型コーディングではないと言いたかっただけ だいたいawkの中に書いてあるコードは手続き型だろといいたいし、 ステップ数だってちょっと書き方変えれば、大差ないってのがわかるだろう i=3; while [ $i -le 10000 ]; do rm -f "file${i}.txt" i=$((i+3)); done awk 'BEGIN{for(i=3;i<=10000;i+=3){print i;}}' | sed 's/.*/file&.txt/' | xargs rm -f
204 名前:デフォルトの名無しさん mailto:sage [2018/10/07(日) 07:00:55.51 ID:9DLOHMhB0.net] お題 関数fooに対して3つ以上の引数を渡した時、1番目と2番目の引数を入れ替え以下の例のように出力せよ (引数が3つ未満の場合は考慮する必要はなし) ただし、シェルビルトイン関数のみを使い、変数の使用は禁止とする (ここでいう変数とはsetコマンドで表示されるもののことである) foo 1 2 3 4 5 2 1 3 4 5 レベル1: 引数に使用する文字は英数のみとする レベル2: 引数にダブルクォート、シングルクォート、スペース、タブが含まれていても動作するようにせよ
205 名前:デフォルトの名無しさん mailto:sage [2018/10/07(日) 07:03:41.18 ID:9DLOHMhB0.net] あ、いかん。>>204 は簡単な解答があるわw ちょっと修正する
206 名前:デフォルトの名無しさん mailto:sage [2018/10/07(日) 07:13:43.37 ID:9DLOHMhB0.net] お題(>>204 の訂正版) 次のような関数barがある。 bar() { echo 'begin'; printf '%s\n' "$@"; echo 'end'; } 3つ以上の引数を渡した時、1番目と2番目の引数を入れ替えて関数barを呼び出す関数fooを作成し 以下の例のような出力をせよ(引数が3つ未満の場合は考慮する必要はなし) ただし、シェルビルトイン関数のみを使い、変数の使用は禁止とする (ここでいう変数とはsetコマンドで表示されるもののことである) foo 1 2 3 4 5 [出力] begin 2 1 3 4 5 end レベル1: 引数に使用する文字は英数のみとする レベル2: 引数にダブルクォート、シングルクォート、スペース、タブが含まれていても動作するようにせよ
207 名前:デフォルトの名無しさん mailto:sage [2018/10/07(日) 07:18:54.69 ID:9DLOHMhB0.net] 余談だが、 func() { printf '%s\n' "begin$@end";} という関数の時、 func 1 2 3 4 5 って書いたら begin1 2 3 4 5end func 3 って書いたら begin3end って表示されるんだよな。 理解はできるが、なんか不思議だ
208 名前:デフォルトの名無しさん mailto:sage [2018/10/08(月) 03:36:26.64 ID:tKqgyITq0.net] お題はお題スレに プログラミングのお題スレ Part12 https://mevius.5ch.net/test/read.cgi/tech/1538096947/
209 名前:デフォルトの名無しさん mailto:sage [2018/10/08(月) 18:41:40.22 ID:IMi/szTI0.net] func -a --foo file1 -b file2 -c --bar みたいな、オプションとファイル名が交互に来てるときに オプションを全部解析し終わってから ファイルに対して処理を実行していくのってけっこう大変なんだな forで回すのもwhileで回すのも一筋縄ではいかない もちろんbashなんかの配列を使わないという前提
210 名前:デフォルトの名無しさん mailto:sage [2018/10/08(月) 18:48:20.63 ID:IMi/szTI0.net] func -a --foo foo1 file1 -b file2 -c --bar あ、例えば、foo1は--fooはパラメータ、のようなものが有る場合だった -で始まる or 始まらないだけで見分けるならまだ簡単
211 名前:デフォルトの名無しさん mailto:sage [2018/10/08(月) 18:50:15.77 ID:NcWFD+EU0.net] そもそもそんな指定の仕方ありうる? ありえない状況を想定してヤキモキするのは非生産的だと思うんだけど……。
212 名前:デフォルトの名無しさん mailto:sage [2018/10/08(月) 19:10:00.18 ID:IMi/szTI0.net] >>211 よくやるよ。 前打ったコマンドをヒストリで呼び出して、後ろにオプション追加して実行とか
213 名前:デフォルトの名無しさん mailto:sage [2018/10/08(月) 20:52:36.04 ID:NcWFD+EU0.net] >>212 仮にそうだとして ということは >>210 を正規化≠キると func -a --foo foo1 -b -c --bar -- file1 file2 っていうことかな?
214 名前:デフォルトの名無しさん mailto:sage [2018/10/08(月) 21:02:29.11 ID:IMi/szTI0.net] >>213 そういうこと
215 名前:デフォルトの名無しさん [2018/10/08(月) 23:31:18.49 ID:tKqgyITq0.net] GNUのgetoptのロングのやつ使えればなんとかなるんじゃないか?
216 名前:デフォルトの名無しさん mailto:sage [2018/10/09(火) 02:27:08.37 ID:cJ7fFqob0.net] これでいいな。 $ getopt --options 'a,b,c' --longoptions 'foo:,bar' -- -a --foo foo1 file1 -b file2 -c --bar
217 名前:デフォルトの名無しさん mailto:sage [2018/10/09(火) 02:29:18.52 ID:i1ZCVGtYa.net] 195から207まで丸ごと吹っ飛んでんだがどんだけレスバトルしてたんだ 見る気もないが
218 名前:デフォルトの名無しさん mailto:sage [2018/10/09(火) 07:22:02.82 ID:UgeI4/Dm0.net] >>216 Macでは動きませんでした
219 名前:デフォルトの名無しさん mailto:sage [2018/10/09(火) 07:51:19.69 ID:cJ7fFqob0.net] >>218 たのむから一つ前のレスくらい読んでくれ>>215
220 名前:デフォルトの名無しさん mailto:sage [2018/10/09(火) 07:55:02.13 ID:UgeI4/Dm0.net] >>219 だからMacのgetoptはGNUのgetpotではないから動かないって言ったんだけど?
221 名前:デフォルトの名無しさん mailto:sage [2018/10/09(火) 07:57:18.12 ID:UgeI4/Dm0.net] GNUのgetoptなら動く。そうでないなら動かないと言われても、 どの環境がGNUのgetoptかなんてわからないでしょう? GNUのgetoptがほとんどの環境で使われているなら問題ないが 使われてな環境は多いかもしれない。そしてそれがMacという形で 現実になったということを書いたんだけど
222 名前:デフォルトの名無しさん mailto:sage [2018/10/09(火) 07:58:09.40 ID:cJ7fFqob0.net] >>220 ああそうなの。 Macのgetopt(1)がGNU製じゃないことを知らないような書きぶりだったから てっきり。 すまんな つーか孰れにしても可搬性は皆無w
223 名前:デフォルトの名無しさん mailto:sage [2018/10/09(火) 08:18:38.20 ID:UgeI4/Dm0.net] やはりgetoptは可搬性は皆無か 日本語でgetoptでぐぐるとこれが上の方に出てくるけど 相変わらずの、qiitaクオリティってことでいいのかな? https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb > 一般に 使用される getopt のテンプレートは以下です。 > > getopt.sh > set -- 'getopt ad: "$@"' 初っ端からおかしいし。バッククォート書いたつもりが、シングルクォートに化けた? しかもset --じゃだめだろうと思ってたら、後半では正しい書き方してたが > OPT=`getopt -o ab:c --long long-a, long-b:,long-c -- "$@"` > 略 > eval set -- "$OPT" で、次 > getopt には重大な落とし穴があります。それは、スペースや特殊文字が > 引数に含まれていた場合、正しく処理できないということです。 特殊文字まではやってないが、スペース入れても普通に動いたんだが? デフォルトでクォートされてるよな? man getoptすると「伝統的なgetoptの実装では 〜略〜 空白 〜略〜 使うことができない 〜略〜 この実装ではクォートした出力を生成する」ってことは(この記事で言及できないほど)最近対応したのか? それはそれとしてクォート方法の指定ができて、shとbash(違いあるの?)があるからシェルごとに 使い分けなきゃいけない気がしていやなんだが ま、この記事のBSD系ではロングオプション非対応っていうのはgetoptを候補からすばやく外すのには役に立ったなw GNU版ならもう少し色々できることがわかったが、やはり大変だな。今回は書かなかったがサブコマンド対応とか。 あとgetopt使っても自前処理でもコードの量に大差ないってのはなんなだろう?と前から思っている
224 名前:デフォルトの名無しさん mailto:sage [2018/10/09(火) 13:51:30.72 ID:cJ7fFqob0.net] parsargコマンドみたいなのを再発明したほうが早いかもね GNU getoptと同じ(もしくはもうちょっと拡張)挙動でかつ可搬なのを。
225 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 14:55:49.61 ID:Q15q2Q7Cd.net] 質問しようと思ったけど初心者の俺にはレベル高い話ばかりで恥ずかしいぜ、、
226 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 15:15:36.15 ID:9UZy+Ppr0.net] どうぞどうぞ
227 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 15:50:29.54 ID:Q15q2Q7Cd.net] ありがとう やりたいことは、環境を判定して対象の環境にある複数サーバーに対して一括でコマンド発行したい、です 条件 ・A環境とB環境があり、引数でそれぞれ指定し(test.sh A のようにしたい)、シェルスクリプト側でどちらが入力されたか判定する ・サーバーにssh接続するためのIPアドレス等は外部ファイルに記載されているため、環境判定後にファイルを読み込んでsshアクセスする必要がある ・サーバーは両環境それぞれ25台ずつあるが、5台ずつコマンドを発行し、waitしてからまた5台と、塊毎にやりたい 質問1 外部ファイルの指定方法が分からないです ifで環境を判定してthenの後にファイルを指定すれば良いのか? 質問2 5台ずつ、を実現するためにはwhileで良いのか? そもそも、sshをまとめてやって後からそれらにコマンド発行ってできるのか 初歩的すぎて恥ずかしい限りですがお願いします
228 名前:デフォルトの名無しさん [2018/10/15(月) 15:55:57.71 ID:oz1FOCTra.net] どうぞどうぞ
229 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 16:39:55.24 ID:Q15q2Q7Cd.net] >>227 自己解決 やり方を変えることにしました
230 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 16:43:11.45 ID:9UZy+Ppr0.net] どういたしまして
231 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 18:26:03.30 ID:A4+xGAqjM.net] 僕にも感謝して
232 名前:デフォルトの名無しさん [2018/10/15(月) 18:56:32.85 ID:3C5NcaRXa.net] >>229 どうやることにしたの?
233 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 20:03:34.75 ID:dTacK6h30.net] ssh ... [command] ができるのがわかったとかじゃないのかな
234 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 21:27:00.70 ID:0gVRdy5i0.net] >>232 233の言うとおりです opensshのマニュアル呼んだら、ファイル指定もコマンド発行方法も書いてあったので、それでやることに あとはifとの組み合わせで頑張ります まぁつまずいてるんだけど
235 名前:デフォルトの名無しさん mailto:sage [2018/10/15(月) 21:32:13.05 ID:E6pr56BO0.net] 私たち日本人の、日本国憲法を改正しましょう。 総ム省の、『憲法改正國民投票法』、でググって みてください。拡散も含め、お願い致します。
236 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 12:14:09.96 ID:/ofNkRJS0.net] ksh、関数のオーバーライド、くせっていうかバグあるわ (foo() { echo 1; }; foo; (foo() { echo 2; }; foo;); foo) 何度実行しても1 2 1 と表示される(想定通り) foo() { echo 1; }; foo; (foo() { echo 2; }; foo;); foo 最初の1回は1 2 1 と表示されるが、 2回目以降は1 1 1 としか表示されない(2でオーバーライドできなくなる)
237 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 12:32:51.57 ID:/ofNkRJS0.net] もう一つ。kshで関数の定義の場所でオーバーライドできない 場合があるんだが原因がよくわからない。 多分これ関連なんだろうけど https://github.com/modernish/modernish/blob/master/libexec/modernish/cap/BUG_FNSUBSH.t これはメインシェルの定義がある場合、サブシェルの中での定義が無視されるということだから、 サブシェルの中で定義していれば、その中のサブシェルではオーバーライドできると解釈できる たしかに>>236 はそのとおりの動きはしてる もう一つの問題も同じなんだろうか、定義の順番を変えればうまくいくんだが サブシェルに関しては定義の順番を変えても同じだと思うんだけどなぁ。 .コマンドを使ってるのが関係してるのかなんだこりゃって感じだ
238 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 12:40:28.86 ID:/ofNkRJS0.net] もう一つの問題は、ちょっとコードが入り組んでて調べるのが面倒くさい。 なんでこれで解決したのかわかってない状況だが、今のところ動いているので まあなにかわかったら書くよw
239 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 16:05:20.75 ID:q7k/ngFed.net] 初心者です、while文の質問です このようなスクリプトがあったとします a=0 while [ $a -le 50 ] do a=`expr $a +1` echo "${a}個目 done とやると、50個目まで表示されると思いますが、この数値が5の倍数の時だけ、echoで表示させたあとsleepを入れるようにするには、contiuneを使えばよい? それともifでやる? よくわからず
240 名前:デフォルトの名無しさん [2018/10/18(木) 16:38:15.26 ID:hfM3a7YWa.net] >>239 continue はループ内のその後の処理を飛ばすやつだからできないと思うが。 普通に if 使ってやるしかないのでは? if [ `expr $a % 5` -eq 0 ] ; then sleep 1 ; fi とか、done の直前に入れる。
241 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 17:31:05.73 ID:/ofNkRJS0.net] >>240 > continue はループ内のその後の処理を飛ばすやつだからできないと思うが。 5の倍数以外でsleepを飛ばせばできるYO! >>239 > とやると、50個目まで表示されると思いますが 51個目まで表示される > a=`expr $a +1` は a=$((a+1)) の方が良い シェルによって実行されるから速い 俺だったらif使わないでこう書くかな [ $(($a % 5)) = 0 ] && sleep 1 ただこの書き方は if を使った場合と完全に等価なわけじゃなくて 後続行実行時点でのexit codeが異なることがあるから使い方に注意だけど
242 名前:デフォルトの名無しさん [2018/10/18(木) 17:40:57.72 ID:hfM3a7YWa.net] あ。そうか。なるほど。
243 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 17:41:55.70 ID:/ofNkRJS0.net] ついでだから書いておくと、 a=`expr $a +1` でも大差ないだろ?と思った人 WSLの酷さがわかるぞ たった50回のループ、sleepを行わない状態で a=$((a+1)) だと 約0.025秒なのに、 a=`expr $a +1` だと 約0.5秒にもなるのだ 10000回のループだと a=$((a+1)) だと 約0.1秒のところ、 a=`expr $a +1` だと 約90秒 早くWSLのfokの遅さが解決すると良いな
244 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 17:43:58.54 ID:/ofNkRJS0.net] × [ $(($a % 5)) = 0 ] && sleep 1 ○ [ $((a % 5)) = 0 ] && sleep 1 書き込む前に気づいて直したと思ったんだがコピペミスったか 上でも動かないわけではない。無駄なだけ
245 名前:デフォルトの名無しさん [2018/10/18(木) 17:56:39.61 ID:uRBurQVb0.net] > [ $((a % 5)) = 0 ] 新旧混ぜんなw arithmetic使うなら、そのままevaluation記法にしてしまえばいい。 ((...)) あと、旧testでの数値比較は-eqを使え。
246 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 18:24:07.81 ID:/ofNkRJS0.net] >>245 ん? どういうふうに書くってこと? >>237 の件、ぼや〜っとだけどわかりかけてきた気がする スクリプトのコードが.(ドット)コマンドで評価された時点で、 関数がすでに存在している場合、その関数を使用するコードがあれば 事前にリンクされているような動きをしている その場合サブシェルで関数を再定義しようとしてもできないんじゃないかな だから事前にリンクできないようにeval呼び出しに変更したら 再定義された方の関数を呼び出すようになった
247 名前:デフォルトの名無しさん [2018/10/18(木) 18:35:46.85 ID:uRBurQVb0.net] ((a % 5 == 0))&& ... なんで一々ここまで言わんとわからんような奴が、他人の指摘しているんだろうかね。。。 -eqでの数値比較とか基本中の基本だろうに。
248 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 18:50:03.03 ID:/ofNkRJS0.net] >>247 $ dash -c 'a=0; ((a % 5 == 0)) && echo ok' dash: 1: a: not found $ dash -c 'a=0; (($a % 5 == 0)) && echo ok' dash: 1: 0: Permission denied なぜかって? その書き方はPOSIX準拠じゃないもの https://github.com/koalaman/shellcheck/wiki/SC2039#standalone-
249 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 18:56:56.93 ID:/ofNkRJS0.net] 動かないコード出されて、偉そうにされても やれやれって言うしか無いわなw
250 名前:デフォルトの名無しさん [2018/10/18(木) 19:33:42.29 ID:9i8IzX+1a.net] (( )) ではなく [[ ]] では?
251 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 19:37:12.04 ID:/ofNkRJS0.net] [[ ]] もPOSIX準拠ではない
252 名前:デフォルトの名無しさん mailto:sage [2018/10/18(木) 22:39:25.80 ID:3W2GDYvfa.net] またぽっじくすか
253 名前:デフォルトの名無しさん mailto:sage [2018/10/19(金) 00:21:19.12 ID:0zKHBU8T0.net] >>239 だけど、奥が深いね if使わずにもできたりするのか はぁ、先は長そうだ、ありがとう
254 名前:デフォルトの名無しさん mailto:sage [2018/10/19(金) 01:23:10.99 ID:JmLVta5V0.net] cat file.txt | ( head; tail) は最高
255 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 02:22:05.90 ID:V0y1IBp60.net] >>224 > parsargコマンドみたいなのを再発明したほうが早いかもね 違うもの調べてて、こういうのを見つけた。 見つけたってだけでどんなものかは調べていない zentoo.hatenablog.com/entry/20110708/1310124831 > ちょっとした理由でgit-flow (https://github.com/nvie/gitflow) のソースを > ちょっとちょっと眺めていたんだけど、内部でコマンドライン引数を > パースするためにshflagsというツールが使われていたのでメモ。
256 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 06:26:18.72 ID:EzXK/x1W0.net] >>254 おまえらなんでそんなに猫が好きなん?
257 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 12:30:19.19 ID:o8LOHz9N0.net] それを疑問に思う人間に説明するのは困難だ
258 名前:デフォルトの名無しさん [2018/10/20(土) 12:37:11.93 ID:MzLaXRRvr.net] 猫好きてそんなに言語化しにくい複雑怪奇な感情持っとるんか?
259 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 12:43:08.81 ID:o8LOHz9N0.net] 例えば女をみて欲情しない人間に、なぜ欲情するのかを説明するのは難しいだろう 言葉を並べるだけなら本能だとか体の特徴なんかを言えるが、共感はされまい つまりそれを疑問に感じる人間には、その時点ですでに納得させる言葉がないのだ
260 名前:デフォルトの名無しさん [2018/10/20(土) 12:48:37.62 ID:MzLaXRRvr.net] でもそもそも説明するのが困難なのやろ? おまえが言ったんやで
261 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 12:55:36.75 ID:V0y1IBp60.net] おい、スレと無関係な話をして荒らすな
262 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 12:56:11.89 ID:o8LOHz9N0.net] なぜ説明するのが困難かを説明したつもりだったんだが
263 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 13:01:22.08 ID:V0y1IBp60.net] つまんねーよ。シェルスクリプトに関係ある話をしろ ってか、>>206 お願い
264 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 14:52:07.13 ID:ZWcyeiuM0.net] お前がつまんねーんだよ
265 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 14:54:50.53 ID:2nu5r9gua.net] なんかレス番飛んだけどなんだこれ
266 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 16:25:12.28 ID:EzXK/x1W0.net] >>265 自分でそういう設定してんだろ。 ngしてますアピールうざいよ。
267 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 17:00:11.18 ID:ZWcyeiuM0.net] なんか遠いレスの番号という意味じゃないの。てか、なんで噛み付いているんだか
268 名前:デフォルトの名無しさん mailto:sage [2018/10/20(土) 17:06:13.46 ID:T0X8nuYVa.net] ワッチョイ変わったのになんでNG効いてんだ?と思ったら課題マンだったのか
269 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 03:41:54.16 ID:dQhyPQp/0.net] あるパスがディレクトリで書き込み可能かは、[ -d "$path" ] とか [ -w "$path" ] で調べられるし、 所有者が自分自身であるかは-Gや-Oで調べられますが、 自分以外が読み書き不可能であることをチェックするにはどうしたら良いですかね?
270 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 05:19:47.73 ID:C+Apg5Hi0.net] ls
271 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 05:42:25.02 ID:dQhyPQp/0.net] やっぱlsしかないですかね。 このフォーマットって仕様化されてるんですよね
272 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 06:29:17.52 ID:9NX69mCX0.net] >>271 pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html#tag_20_73_10
273 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 06:34:56.07 ID:dQhyPQp/0.net] ありがとう。だがオプション多すぎて読むのだりぃw なんでだろ?どうもlsって解析する気にならないんだよな 人間向けのフォーマットでコンピュータが解釈するのに向いてない感じがしている どこまでPOSIXで仕様化されてるのか、どこからが拡張なのか、オプション多すぎて(略 関係ないけど、ふと本棚を見たら 「lsを読まずにプログラマを名乗るな!」という本があったw そういや買ったっけ(未読)
274 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 06:42:08.88 ID:xQoMnSHc0.net] pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html STDOUTに記述があるんだからそうじゃね
275 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 06:42:50.73 ID:xQoMnSHc0.net] あら被りすぎた。すまん
276 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 06:45:46.73 ID:xQoMnSHc0.net] >>273 >>272 はPOSIXの仕様。>>269 ,270,271の目的には If the -l option is specified, the following information shall be written for files other than character special and block special files: と If the -l option is specified, the following information shall be written for character special and block special files: で書いてあるフォーマットだけだけどね
277 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 07:33:05.64 ID:dQhyPQp/0.net] そういや、macだとlsで drwxr-xr-x+ や drwxr-xr-x@ みたいに 後ろになにかくっついていることがあるな > Implementations may add other characters to this list to represent other implementation-defined file types. くっつけても良いってことなのか?
278 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 11:22:28.24 ID:C+Apg5Hi0.net] これだからマカーは馬鹿だと言われるんだなあ...
279 名前:デフォルトの名無しさん [2018/10/21(日) 20:00:09.31 ID:0dWokXAIa.net] stat コマンドの出力解析した方が楽ではないか? または find コマンドの -perm 利用してチェックして -exec でやらせたいことをやらせる。
280 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 20:21:13.14 ID:dQhyPQp/0.net] >>279 そこででてくるのが、またPOSIXですよ statはPOSIXで規定されてない SolarisやUP-UXには存在しない 更にLinuxとMacでオプションもフォーマットもぜんぜん違う
281 名前:デフォルトの名無しさん mailto:sage [2018/10/21(日) 22:04:44.47 ID:8BH3p2hm0.net] 標準入力の代わりにfileの内容を入力するのに、リダイレクトで $ <file somecmd とやる方式ってPOSIXで既定されてるっけ。 pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_01 このへんに書いてそうなんだけど、それっぽい記述がない?
282 名前:デフォルトの名無しさん [2018/10/22(月) 02:54:50.03 ID:HyPH6OEy0.net] >>280 じゃ、find で。 ファイルのパーミッションに 066 を and した時に 0 になるやつでいいのなら find $dir -prune ! -perm -40 ! -perm -20 ! -perm -4 ! -perm -2 -exec やらせたいこと \; のようにすればいいのではないかな。 pubs.opengroup.org/onlinepubs/9699919799/ で find コマンド見てみたら -perm はあるようなので。 もし GNU の find コマンド使えるようなら -perm /mode が使えて、これは何れかのビットが立っていれば 真になるので ! -perm /66 の一つで出来ると思う。
283 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 03:01:30.80 ID:1Kkbm3du0.net] GNUのfind使っていいという条件なら、GNUのlsやstatでいいじゃんw
284 名前:名無しさん@そうだ選挙に行こう! Go to vote! [2018/10/22(月) 10:18:21.67 ID:8WYgXfgna.net] その辺はご自由に。POSIX縛りがあってもこの場合にfindも使えるってだけの話なので。ls使いたいならそうすればいい。
285 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 14:51:33.47 ID:JUwIDQm90.net] >>281 これ分かる方います?
286 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 16:55:54.61 ID:9s+yFzz3H.net] >>281 2.1の5で、リダイレクトの処理をしてパラメーターリストから 除去するって書いてあるのと、 6でコマンド名を第0パラメーターとして渡すって書いてるってことは、 先頭もパラメーターリストの一部と解釈できるから、 暗に、先頭にリダイレクトがあってもいいってことを表してるんでは?
287 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 19:08:52.43 ID:WU2zxBnF6.net] >>286 明示はされてないのね。 でもありがとう。多分 大丈夫ということでしょう。
288 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 19:09:38.93 ID:WU2zxBnF6.net] あ、ワッチョイもIDも違うけど>>285 です。
289 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 21:35:03.82 ID:oF7wf0Ce0.net] >>118 それはオブジェクト指向の話じゃない C++の話だ そもそもテンプレートやジェネリックは、型を明確にすることでバグを少なくしたり 速度を速くするためのもので、オブジェクト指向における問題点を解決するための追加機能 テンプレートやジェネリックを使うことでオブジェクト指向が不要になるのではなく オブジェクト指向と組み合わせて使うことで問題点が改善される テンプレートはオブジェクト指向と組み合わせずに使えたと思うが、 テンプレートの殆ど(ジェネリックは全て)はオブジェクト指向なしに使うことはできない
290 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 21:47:50.25 ID:oF7wf0Ce0.net] あ、書き込まれてないと思ったら書き込む場所間違えてたのかw
291 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 23:23:26.53 ID:oF7wf0Ce0.net] ただのメモ 各シェルの比較 hyperpolyglot.org/unix-shells
292 名前:デフォルトの名無しさん [2018/10/23(火) 13:27:19.16 ID:QwHjyvjPa.net] シェルというか tar コマンドの問題なんだけど、tar tvf でアーカイブに入っているファイルのタイムスタンプを秒単位まで出す方法ある? Linux で GNU tar のmanページ見た感じではなさそうなんだけど、やはり自作するしかないなかな。
293 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 14:12:45.60 ID:mYtscksw0.net] >>292 tar --full-time ...
294 名前:デフォルトの名無しさん [2018/10/23(火) 14:38:56.39 ID:QwHjyvjPa.net] >>293 おお!ありがとう。新しい GNU tar にあるね。 最初CentOS6で試しててわからなかった。これは GNU tar 1.23 だ。 CentOS7は GNU tar 1.26 になっててこちらでは出来るしmanページにも書いてあった。
295 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 15:22:22.26 ID:cKF5Z2eR0.net] CentOS 6はそろそろサポート切れるんじゃないかしら 余計なお世話だが移行したほうがいいんでは
296 名前:デフォルトの名無しさん [2018/10/23(火) 15:35:42.08 ID:QwHjyvjPa.net] >>295 するする。仕事でRHEL6のサーバ使っててそれの一部をテストする時に使ってただけなので。
297 名前:デフォルトの名無しさん mailto:sage [2018/10/25(木) 13:45:54.07 ID:7aRL1OkY0.net] すごい低レベルな質問で申し訳ないんだけど、 win用のGit-bashで.shファイルダブルクリックしたときに DOS窓出さないで実行するのってどうすればいい?
298 名前:デフォルトの名無しさん [2018/10/25(木) 14:43:08.46 ID:hw/Q19JUa.net] >>297 それもはやシェルかどうか関係なくてWindows固有の問題だと思うが、エクスプローラでそのファイル右クリックしてプロパティ出したらそんな感じの設定できるようになってない? 最小化した状態で実行するとか、そんなやつ。
299 名前:デフォルトの名無しさん [2018/10/25(木) 14:51:54.06 ID:hw/Q19JUa.net] こうだ。 まずショートカット作り、そのショートカットのプロパティ出すと実行時の大きさを指定できる所があって、そこを最小化にすると実行時にタスクバーにアイコン出ているだけになる。
300 名前:デフォルトの名無しさん mailto:sage [2018/10/25(木) 16:15:39.89 ID:7aRL1OkY0.net] >>298 git-bash.exeだとできませんでしたが、bin/bash.exeでできました! ありがとうございます。
301 名前:デフォルトの名無しさん mailto:sage [2018/10/26(金) 22:15:40.17 ID:ScQN6FWl0.net] ファイルや標準出力の行数がある数値より大きいことをできるだけ高速に確かめるにはどうすればいいだろう 最も単純で最もUNIXっぽいのは $ test $(<file.txt wc -l) -gt $num としてその真偽を見ることだけど $ test $( (yes | head -n 3000000000000000000) | wc -l) -lt 300 こういうのを実行して貰えれば分かると思うがかなり時間が掛かる 俺の使ってる計算機はそこそこ良い性能(Intel Xeon x2/32GiB RAMなのだが) それでも実行に1分強掛かった。 しかしこれは無駄だ。なぜなら結局比較する対象は300なのだから、「300行以上ある」ことが分かればいい。 なにか案ありませんかね。 思ったのはsed -n -e '300p'とかでその失敗判定を見るとかだが,これはsedコマンドの失敗の要因が他にもあるので ちょっと不安定かなと。
302 名前:デフォルトの名無しさん [2018/10/26(金) 23:12:31.32 ID:7cGNdWT70.net] cで指定行読むコマンドを作ればいい 面倒なこといちいち考える必要がそもそもない
303 名前:デフォルトの名無しさん mailto:sage [2018/10/26(金) 23:41:06.71 ID:E+2rE/Ml0.net] >>301 headで300行読み込めば?
304 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 00:04:40.31 ID:GbJLfo150.net] sed -n 300pでもええんか?
305 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 00:13:24.42 ID:BbyQQXdF0.net] >>303 あーなるほど $(<file.txt head -n $num | wc -l) -lt $num とすればいいということですね。
306 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 00:29:51.71 ID:4RrrP6U60.net] >>305 そのことを意図していったんだけど、 2回走査することになるから 300行飛ばして1行読んだほうがいいか たしかheadで1コマンドでできたでしょ?
307 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 00:37:07.31 ID:4RrrP6U60.net] あれ?できなかったか?
308 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 01:15:41.17 ID:BbyQQXdF0.net] GNU headだとどうか知らないが POSIX headだと無理 pubs.opengroup.org/onlinepubs/9699919799/utilities/head.html
309 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 01:23:00.95 ID:4RrrP6U60.net] シェルスクリプトでループで回しながら数えるのと headで300行とってきて、wcで300行数えるのってどっちが速いんだろうかね やればすぐわかるけど、やる気起きないなぁw
310 名前:デフォルトの名無しさん [2018/10/27(土) 04:24:55.28 ID:QwPOuwmq0.net] >>309 シェルスクリプトだとインタープリタの言語みたいな動きになるので遅そうなイメージはあるな。但しうまいこと内部で最適化されれば速くなるかもね。
311 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 08:30:31.93 ID:4RrrP6U60.net] >>310 いうてもループとカウントと条件分岐だけだからなぁ 内部的にはインタプリタ解釈後の状態になってるだろうし そこでCPUは食わない気がする でもheadでとってきてwcでカウントの部分は並列で実行できるわけで マルチコアなら当然のことながら、シングルコアでもファイルから読み取りの方が 遅いからwcで待たされることはなさそう どちらが速いかは微妙な所だなw
312 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 09:05:32.40 ID:94jXB05x0.net] awkでいいんじゃないの
313 名前:デフォルトの名無しさん [2018/10/27(土) 09:08:24.86 ID:S4VvuAVS0.net] ファイルの先頭からLFの数を数えるだけのことを ああでもこうでもないと いちいち考えないといけないオツムのデキを疑うわ。。。
314 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 09:14:33.78 ID:EI3TCK5cr.net] ループってreadのループ? catからパイプしてwhileのreadループってどうなんだっけ 昔作ったシェルでcatしてたファイルを処理中に書き換えたけど 実行されてる処理では書き換える前の内容で処理されてたみたいだから どこかメモリに展開されてるんじゃ catからのパイプでプロセスが終わってるからか? でもリダイレクトやヒアドキュメントでも同じじゃないの?
315 名前:デフォルトの名無しさん [2018/10/27(土) 09:24:18.83 ID:S4VvuAVS0.net] 低学歴知恵遅れの思考形態、世界では すでに用意されているコマンドを組み合わせてシェルスクリプトを書くことが シェルスクリプトを書くことになるという決まりがあるのが このスレみてると分かる
316 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 09:27:18.91 ID:7MihieRw0.net] そういうのは上流でなんとかせい
317 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 09:36:35.55 ID:94jXB05x0.net] >>314 単にバッファに入っていただけとか。カーネルに設定できるバッファサイズなバッファなんぞもしくはcatプログラムのバッファ(の方が小さいだろう、たぶん) もしくは上書きが上書きではなくて削除して新規ファイルに保存とかの場合とか(削除してもどこぞでオープンしていたらクローズされるまでは元のはそのまま残る)、か、OSが他でオープンされていたら上書きでも同じように別に保存してるとか
318 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 10:00:05.77 ID:4RrrP6U60.net] >>313 考えてるのはファイルの先頭からLFの数を数える 「効率がいい方法(コマンド)は何か」だよ LFの数を数えることなんてわかりきったことは考えてない それを実現する方法を考えてる まったくキミは思慮が足りないなw
319 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 10:02:52.71 ID:4RrrP6U60.net] >>314 なんの話をしているのか知らんが、readで普通に一行ずつ処理できる。 catが終わるまで待つなんてことはない なおcatは使わない(標準入力 or ファイルから直接読めばいい)
320 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 10:06:05.12 ID:4RrrP6U60.net] >>312 awkプログラマ、シェルショッカーさんこんちには(笑)
321 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 10:32:12.85 ID:94jXB05x0.net] 何を噛み付いているのだか。よほど気に食わないことがあるらしいなっw
322 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 10:38:33.23 ID:5CI9IsZua.net] このガキのやり取りもシェルスクリプトスレの日常になりつつあるな
323 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 10:42:58.86 ID:4RrrP6U60.net] この殺伐さがいいんだよ
324 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 10:49:54.15 ID:94jXB05x0.net] 雑談すんなとか言ってなかったかなあ、だれかはw
325 名前:デフォルトの名無しさん [2018/10/27(土) 11:01:01.29 ID:S4VvuAVS0.net] 低学歴知恵遅れのしゃべり場
326 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 11:02:18.35 ID:94jXB05x0.net] 自己紹介そのものじゃないのww
327 名前:デフォルトの名無しさん mailto:sage [2018/10/27(土) 15:16:56.95 ID:BbyQQXdF0.net] >>305 まあこれで今のところ上手くいってるのでいいです。
328 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 00:51:41.26 ID:5IpH1DwA0.net] 「シェルスクリプト」を省略するときなんて呼べばいいのかな。 “ss”だと他の用例が多すぎてややこしいし。 “shscp”とか?
329 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 01:46:36.58 ID:0ZKwpNcRa.net] sh
330 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 02:04:05.48 ID:PnJQ4LJT0.net] SHと書くとスーパエッチみたいだな
331 名前:デフォルトの名無しさん [2018/10/28(日) 06:57:04.86 ID:xmv6f/Y+0.net] そもそもシェルでええのにわざわざシェルスクリプトって言いたがる新参者達w
332 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 07:36:49.77 ID:fdB1NucVM.net] そういうくだらないことにしか突っ込めない老害w
333 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 07:49:18.94 ID:JDWqlC9k0.net] >>331 シェルでググれ&テンプレくらい嫁
334 名前:デフォルトの名無しさん [2018/10/28(日) 09:10:44.72 ID:xmv6f/Y+0.net] >>333 おまえがググれよおこちゃまw
335 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 09:26:48.32 ID:PnJQ4LJT0.net] こんな感じに script1.sh が script2.sh を呼び出してる状態でさ、 script1.sh └ script2.sh CTRL+Cを押した時、script2.shは止めて、script1.shは 止めないってできるのかなぁ? シグナルって、伝搬というか、上から下へ もしくは 下から上へ 流れていくものなん?
336 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 10:03:53.12 ID:oCsOt6/L0.net] trapかけろ
337 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 10:12:32.68 ID:PnJQ4LJT0.net] ああ、いやトラップはかけてるんだよ script1.sh でINTを無効にすると script2.sh は止まらなくなる
338 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 11:08:09.88 ID:YiTUMI+KM.net] >>334 老害と思いきや素人か
339 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 11:18:09.59 ID:gJfQRhUl0.net] >>335 ,337 目的がどこまでどゆのなのかわからんけど、script2.shのシグナルハンドラでkill -SIGTERM $PPIDすればそんな動作にはなるな
340 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 11:32:07.64 ID:gJfQRhUl0.net] ああ、script2.shを止めるのか そんなんだったらscript2.shのシグナルハンドラでexitすればいいんじゃないの??また変な縛りとか拘りとかは知らん
341 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 11:40:05.37 ID:uhvIO3T60.net] script1.sh だけ動作を変えたいということなら trap true INT でいいように思うんだが…
342 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 11:47:47.85 ID:gJfQRhUl0.net] script2.shでそのへんの制御とかしたくなく、script1.shだけでならscript1.shで trap SIGINTすればいいだけっぽいな。無効じゃなくなにもしないシグナルハンドラで script2.shの時だけでならその前後でNOPのシグナルハンドラ設定通常のシグナルハンドラに戻すとかか >>341 被ったけど、書いたので被り被りで
343 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 17:27:21.50 ID:XoYPKH7l0.net] 勘違いしてた。違う所が原因だった 単純にscript2.shを起動してるのではなくて script2.sh | filter みたいにパイプ使っていて、 CTRL+C押したときにscript2.shが出力するメッセージを script1.shで受け取れないって問題だった
344 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 17:58:26.84 ID:gJfQRhUl0.net] どのタイミングでの出力が出ない、出したいのかわからんな。CTRL+C押した瞬間ギリのか??としか思えないが。filterがなんなのか知らんけど、script1.shでtrapでもscript2.shでの出力が全くでないことなないだろう、当然 script2.shでtrapしてexitすればギリ近くのまで出るんじゃないの。script2.shで実際に出力しているコマンド(プロセス)にもよるだろうけど
345 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 18:40:23.99 ID:gJfQRhUl0.net] ああ、trapの対象はパイプチェイン(?)の最後のヤツ&それがシェルでなければなのか?script2.shに飛ぶことはないのね。その最後のでexitすればだなすればかな script2.sh | cat script2.sh | sh -c "trap 'exit 0';cat" のような変態なw それもシェル種類依存かな。あとはバッファをflushすればよりなんとかなりそうかなあ(できるのであれば) そもそもCTRL+Cなんだからそんなギリを気にすんなってとこか
346 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 18:42:22.28 ID:gJfQRhUl0.net] SIGINT抜けてた
347 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 19:05:49.36 ID:XoYPKH7l0.net] >>344 最終的にやりたいことは script1.sh ・・・ サブプロセスの標準出力・標準エラー出力を総てキャプチャしたい script2.sh ・・・ 標準出力・標準エラー出力を行い、CTRL+Cを押されたら(trapして) CTRL+Cが押されたと標準エラー出力に出力したい ってことなんだよね > そもそもCTRL+Cなんだからそんなギリを気にすんなってとこか そういうことだし、諦めて一つのスクリプトにしてやりたいことは 解決できたのでもう深追いする気はなくなってる あと関係ないけど、SIGINTってPOSIXじゃないみたいだなw INTを使えってshellcheckに怒られた。みんな SIG SIG 言ってるのに
348 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:03:04.22 ID:gJfQRhUl0.net] なにその勝手にやる気なくすなよw ほんとに身勝手だな、いつも通り SIGINTはPOSIXだからな(なぞ)。そっち寄りのの人は普通に使ってしまうんじゃね。てか、んなの本題に関係ないだろうに、そんなこと言いたいのはわかるけどさ(なぞ)
349 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:07:36.88 ID:XoYPKH7l0.net] >>348 > なにその勝手にやる気なくすなよw $ dash -c 'trap true SIGINT && echo v^_^' trap: SIGINT: bad trap $ dash -c 'trap true INT && echo v^_^' v^_^
350 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:17:52.04 ID:gJfQRhUl0.net] で?通じてるんでしょ?POSIX縛りなんてあったの?そういうのはやる気あるのねw
351 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:20:44.42 ID:gJfQRhUl0.net] ああ、ちなみに、 >SIGINTはPOSIXだからな(なぞ) は、(3)だよ。知らないんだろうけど(>>347 の最後のあたりからも、その>>349 あたりからも)
352 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:30:59.64 ID:XoYPKH7l0.net] >>350 やる気ではなくて、POSIX縛りは必須要件なので サブプロセスの標準エラー出力の件は、別の方法で解決できることなので 数値でも指定できるのは知ってる。trap SIGINTとかSIGINT抜けてたとか かいてあるから、trap INT、INT抜けてただよって言ってるだけ
353 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:36:08.52 ID:gJfQRhUl0.net] また、後出しか。そんなレスしている目的は違うだろうw いきなり「数値でも指定できるのは知ってる」とか??(3)に対して??? pubs.opengroup.org/onlinepubs/007904975/utilities/trap.html (新しいドキュメントはどこだ?) SIG付きもPOSIX仕様のようだけどなwオプションでも言及しているんだからPOSIXの仕様のひとつだろう なんて、アホなやりとりしたいの?
354 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:40:09.47 ID:gJfQRhUl0.net] >いきなり「数値でも指定できるのは知ってる」とか??(3)に対して??? ああ、(3)がSIGINTの数値だと思ったのか。違うぞ2だぞ。(3)は C API という意味
355 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:41:40.70 ID:XoYPKH7l0.net] なるほどSIGをつけた名前はPOSIXだが、ポータビリティではないってことか echoみたいなもんだな
356 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:42:17.74 ID:XoYPKH7l0.net] >>354 ここ、シェルスクリプトのスレだから
357 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:43:25.81 ID:gJfQRhUl0.net] でた、都合が悪くなるとのいつものやつw
358 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:50:49.94 ID:XoYPKH7l0.net] シェルスクリプトのスレでC APIは関係ないですよね? 言ってること間違ってますか?
359 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:56:45.89 ID:gJfQRhUl0.net] だから最初は「(なぞ)」にしてたやん >>347 の最後あたりの応えとしてしかない。お前が変なツッコミするから悪い ちなみに、>>353 のPOSIXドキュメントでも (3) のことに言及しているのはどう思う?UNIX/Linuxはそんな境目はそれほど無いと思うけど。誰かみたいに(1)しか興味ない知らない人もいるだろうけど 単に知らなかっただけでいいのに、いつも偉そうにしているからドツボにはまってるように見えなくもないw
360 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:00:00.71 ID:XoYPKH7l0.net] > ちなみに、>>353 のPOSIXドキュメントでも (3) のことに言及しているのはどう思う? それが、シェルスクリプトだけのドキュメントじゃなくて、POSIXのドキュメントだからでしょう??? なにがいいたいんだか
361 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:01:18.42 ID:gJfQRhUl0.net] コマンドのドキュメントだよ。それもお前が大好きなPOSIXのw いろいろ破綻しているように見えなくもない。落ち着けww
362 名前: mailto:sage [2018/10/28(日) 21:13:17.62 ID:0CAv0Ngu0.net] >>358 その C API って何ですか?定義を教えてください
363 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:26:47.89 ID:XoYPKH7l0.net] >>362 言い出した本人 (>>354 ) に聞いてください > ああ、(3)がSIGINTの数値だと思ったのか。違うぞ2だぞ。(3)は C API という意味
364 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:28:14.13 ID:XoYPKH7l0.net] >>361 (俺は最初から)trapの引数にSIGINTは使えないことがあるって 話をしていること、わかってますか? どうも勘違いして、突っ走ってる気がするな
365 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:37:09.45 ID:gJfQRhUl0.net] >>363 で?その目的がわからんな。単に素直な疑問なだけなら、>>348 で応えているけど。話を振ってねちっこく続けているのは誰なの?>>349 とか以後とか それも>>353 でお前は納得したんだろ? なんか上でC++のことを偉そうにのたまっているのを誤爆したのお前じゃなかったっけ? それがお前じゃなくても、なんでコマンド関連のCなんて簡単なのにそんなに知らないのか不思議だな、なんか異常にシェルスクリプト「だけ」に拘るのもあって UNIX/Linux界隈では自分でCでコマンド書く(簡単なフィルタも)のも普通にいるだろうから、お前のようにシェルスクリプトだけしか言ってはいけないなんてないと思うけどな(それも俺からは単にお前の間違いをごまかすためだけにしか見えんからw) >>362 は俺に振ってもいいが、なにを聞いているのか傍目にもわからないw すまんが、も少し具体的に>>362
366 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:40:16.96 ID:quDgO6NR0.net] またposix先生が宿題出してんの?
367 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:44:47.82 ID:EWkScXjB0.net] ぽっぽっぽー
368 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:49:30.03 ID:XoYPKH7l0.net] >>365 コマンド? もしかして、trapがコマンドだと思ってる? シェルビルトイン関数だよ シェルのプロセスでシグナルを扱わなきゃいけないから 外部コマンドで実装することは不可能 だからシェルスクリプトスレでtrapの話をするならば シェルスクリプト前提になるのは当然だろう?
369 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:53:11.18 ID:gJfQRhUl0.net] >>368 そういう細かいことは言いたいのね。大枠でコマンドでいいじゃん (1) の範疇なんだから その二行目以降はイミフ。なにを言っているの?言いたいの? お前から見てミスを論ってなんとかお前のなにかを保ちたいだけにしか見えない
370 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:53:58.49 ID:XoYPKH7l0.net] >>369 そのレスはなんのためにしたの? なにかを保ちたいだけにしか見えない
371 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:54:56.36 ID:gJfQRhUl0.net] 結局SIGINTの振りも>>368 と同じでなにかをなんとかしたかっただけだろなww SIGINTで失敗したから、別のにか。懲りないなw
372 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:55:59.54 ID:gJfQRhUl0.net] >>370 なんか失点を挽回しようとしているのが透けて見えてるのでwww
373 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 21:59:08.94 ID:XoYPKH7l0.net] >>372 それで、trapの引数のSIGINTの話をしていたところに C APIを持ち出してきたのはなんでですか? 失態隠しのためにそんなレスしてるんですかねw
374 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 22:00:47.39 ID:XoYPKH7l0.net] ID:gJfQRhUl0 がさっきから俺に言ってることって 全部自分の事になってるのわかってないのかな? どうせ次言う言葉も、自分のことを棚に上げて言うんだろうな
375 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 22:07:32.28 ID:gJfQRhUl0.net] >>373 ,374 はあ?無茶苦茶やな その答えはすでに応えているけど。「みんな SIG SIG 言ってるのに」のに対する応えを含めての それも最初に。それも話の流れで、お前も納得勉強wになっただろうにww よほど「お前のなにかを保ちたい」が琴線だったようだねえw
376 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 22:32:38.54 ID:reiOA0Hq0.net] UNIX板へ帰ろう
377 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 22:34:09.63 ID:gJfQRhUl0.net] https://www.freebsd.org/cgi/man.cgi?query=builtin&apropos=0&sektion=1&manpath=FreeBSD+12-current&arch=default&format=html https://linuxjm.osdn.jp/html/GNU_bash/man1/builtins.1.html コマンドでよかったみたいだけどwww
378 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 22:50:09.83 ID:8zpC2JPUa.net] >>376 さすがにその選択肢はない この赤い奴らをNGすれば済む話 それすら嫌ならお前が消えろ、ここに来た経緯忘れんな
379 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 23:07:26.81 ID:JDWqlC9k0.net] 村を出てアイドルになるためだったよな
380 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 23:38:46.03 ID:5IpH1DwA0.net] シグナルを送信するコマンドの名前がsigとかじゃなくkillなのはなぜでしょうか。 例によって歴史的経緯? 元々はSIGKILLシグナルしか送信しなかったのでkillとか。
381 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 00:45:49.98 ID:OX2gPbsu0.net] >>379 某農家「村を出てアイドルになるなんてとんでもねぇ、両立するべ」
382 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 00:48:40.26 ID:gm+ugNlu0.net] ご想像どおり、version6 unix以前はkillしかできなかった模様
383 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 02:55:07.53 ID:OPK1oA4w0.net] d.hatena.ne.jp/oraccha/20110419/1303223401 こことかにありますね。ありがとうございました。
384 名前:デフォルトの名無しさん [2018/10/29(月) 22:10:10.39 ID:JGxixszg0.net] 村に戻って親が死んでたら そいつは手遅れコロスしかない 親はいつまでも待っていない
385 名前:デフォルトの名無しさん mailto:sage [2018/10/30(火) 01:05:53.06 ID:2OC/bUyM0.net] >>304 それを言えるのは、まだ手遅れになってないからなんやで
386 名前:デフォルトの名無しさん mailto:sage [2018/10/30(火) 02:11:38.48 ID:yt1zemAy0.net] すまん、俺がsedなんて持ち出したばかりに…
387 名前:デフォルトの名無しさん mailto:sage [2018/10/30(火) 02:16:29.65 ID:lSvIGV4X0.net] お題:スクリプトのシグナルを扱う外部コマンドを設計せよ
388 名前:デフォルトの名無しさん mailto:sage [2018/10/30(火) 02:24:39.94 ID:2OC/bUyM0.net] こんな感じ?w #!/bin/sh trap "$(extcmd)" INT [extcmd] #!/bin/sh cat <<HERE handler() { : なにかする } handler HERE
389 名前:デフォルトの名無しさん mailto:sage [2018/10/30(火) 08:39:46.28 ID:lJU58Qkm0.net] >>353 pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#trap 組込コマンドは「 Shell Command Language」の一部として定める方針みたいね。
390 名前:デフォルトの名無しさん mailto:sage [2018/10/30(火) 16:02:13.78 ID:7uiQkmXn0.net] >>389 おお、なるほど。長っ探しづらと一瞥では思ったが系統だってのでこっちのがいいか どうもです
391 名前:デフォルトの名無しさん [2018/10/30(火) 23:49:50.18 ID:H/liFP070.net] いや手遅れ 親がしんでたらゾンビスプロセスになる 殺すしかない
392 名前:デフォルトの名無しさん mailto:sage [2018/10/31(水) 05:39:40.82 ID:VU8NOm8y0.net] UTF-8で符号化された文字列に対応してるfmt(1)コマンドってある? GNU coreutilsのfmt(1)は無理だった。
393 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 17:53:36.33 ID:Kkuf6Nxk0.net] 一回のループでファイルや変数を使わずに、偶数行と奇数行にまとめられないかなぁ? 例えば、入力ファイルが以下のような場合 1 2 3 4 5 出力は、以下のようにしたい 2 # ここから偶数行 4 1 # ここから奇数行 3 5 ファイルディスクリプタをうまく使えばできるんじゃないか? と思ってたりするけどうまくいかない
394 名前:デフォルトの名無しさん [2018/11/01(木) 18:26:55.97 ID:OxvwXsOaa.net] 変数も使っちゃダメなのか。うーん。
395 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 18:37:54.39 ID:eWvFwheDM.net] sedじゃあかんのけ?
396 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 18:50:36.53 ID:Kkuf6Nxk0.net] >>395 sedでできるならsedでもいいけど。 やっぱり無理だよなぁ 結局、奇数行のデータを後からだすためには どこかにためておく必要があるわけで メモリかディスクはどうしても使用してしまう 二回のループにするなら、メモリもディスクも消費しないけど 今度は入力データをためておく必要がある
397 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 19:37:55.15 ID:upF+pHX50.net] >>393 もし変数を使っていいなら,どうやって書くの?
398 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 19:42:09.40 ID:Kkuf6Nxk0.net] >>397 こんな感じでは? while 全行ループ; do if 偶数行 then echo 偶数行 奇数行変数 = 奇数行変数 + 奇数行 + 改行 done echo 奇数行変数
399 名前:デフォルトの名無しさん [2018/11/01(木) 19:46:11.92 ID:OxvwXsOaa.net] 元データがファイルに入っていて2回読んで良くて尚且つ変数使って良いなら楽だよ、っていうかそれなら誰でも作れるかw
400 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 19:51:11.07 ID:Kkuf6Nxk0.net] 遅くなるのでディスクに書き込みたくないし、メモリも あまり使用したくなかったんだけど仕方ないか 実際には偶数行、奇数行じゃなくて、データを種類ごとに前後に分けたくて 後ろに分けるデータは基本的に少ないってことがせめてもの救いか
401 名前:デフォルトの名無しさん [2018/11/01(木) 19:58:02.45 ID:zOBF+lvD0.net] なんでバカって実行速度ばかり気にするんや?
402 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 19:59:10.65 ID:Kkuf6Nxk0.net] 何度も実行するものなので、遅いとストレスたまるから
403 名前:デフォルトの名無しさん [2018/11/01(木) 20:00:23.29 ID:zOBF+lvD0.net] バカなのにストレスたまるの?バカやめたら?
404 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 20:03:44.33 ID:Kkuf6Nxk0.net] その理屈だと、 ・バカなのにストレス溜まるの?(不思議) ・バカじゃないならストレス溜まる(普通) ってことになるから、 バカやめたら、それこそストレス溜まるのでは?
405 名前:デフォルトの名無しさん [2018/11/01(木) 20:18:26.34 ID:zOBF+lvD0.net] バカの理屈わろたw バカなんやから考えん方がええで
406 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 20:23:45.26 ID:Kkuf6Nxk0.net] なにか言い返せよw
407 名前:デフォルトの名無しさん [2018/11/01(木) 20:37:24.98 ID:zOBF+lvD0.net] バカに言いかえすとか無理やわ理屈がないからバカなんやでおまえ
408 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 20:38:28.76 ID:Kkuf6Nxk0.net] そりゃね。>>404 が正しいから何も言いえせないわなw
409 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 20:43:56.74 ID:RCcSs0UBM.net] お前ら、哲学者か何かなん?
410 名前:デフォルトの名無しさん [2018/11/01(木) 20:50:42.34 ID:zOBF+lvD0.net] バカとバカを嘲笑う者や
411 名前:デフォルトの名無しさん [2018/11/01(木) 20:51:14.40 ID:5U41yww90.net] 奇数行だけ抽出するスクリプトと 偶数行だけの二つ作って、 奇数行スクリプトの出力に偶数行のを追記させる なんとなくそんなイメージ
412 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 21:54:51.76 ID:zo7FxUKXr.net] 速度言うならCなりJavaで書いてデーモン化して動かさんとな シェルスクリプト特有のコマンド羅列のプロセス起動しまくりってのは すごいコストがかかってる
413 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 21:57:34.95 ID:eWvFwheDM.net] 偶数行抽出 grep "Kkuf6Nxk0" 奇数行抽出 grep "zOBF+lvD0" 楽勝すぎるわ
414 名前:デフォルトの名無しさん [2018/11/01(木) 21:58:38.71 ID:zo7FxUKXr.net] >>404 いや普通なら落としどころ決めるだろ シェルスクリプトだからあきらめるとか ちゃんとした言語で作るとか バカだから漠然と心配ばかりしてストレスが溜まる 今も月が落ちてくる心配でもしてるんじゃないの
415 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 21:59:28.16 ID:JoiMeSvG0.net] >>412 デーモンだって実行プロセスは立ち上げないとダメだろ
416 名前:デフォルトの名無しさん [2018/11/01(木) 21:59:49.59 ID:zOBF+lvD0.net] >>413 シェルが固まったんやがウイルスちゃうやろな?直しかた教えろバカ
417 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 21:59:57.39 ID:zo7FxUKXr.net] >>413 後出しで奇数偶数じゃないって言ってるよ
418 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:00:55.53 ID:45pCF+y00.net] seq 5 | awk '{print ($1%2?"b":"a") $1}' | sort -V | cut -c2-
419 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:06:42.28 ID:Kkuf6Nxk0.net] >>414 普通(?)の言語で作ったって、結局は変数に入れないとだめでしょ ファイルを受け取ってその順番を変えて出すんだから キミは本質をわかってない
420 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:08:20.21 ID:Kkuf6Nxk0.net] >>412 シェルスクリプト(と一部のPOSIXコマンド)で作るっていうのは 必須条件なのでそれはできないのです。
421 名前:デフォルトの名無しさん [2018/11/01(木) 22:09:12.59 ID:zOBF+lvD0.net] バカはいいかげん黙っとけ
422 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:12:35.86 ID:Kkuf6Nxk0.net] >>413 結局はそれ、二回読み込んでるんだよね >>418 それも考えたんだけど、結局はソートの ためにメモリに読み込むから本質的には変わらないかなーと あと>>393 の例が良くなかったけど、入力ファイルは昇順とは限らなくて 偶数グループと奇数グループにわけるだけで、順番は変えたくないんだ
423 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:13:57.69 ID:Kkuf6Nxk0.net] >>421 バカじゃないので黙らないw ってか、俺を黙らせるのは不可能なのでNGにして 俺にくだらないレスしないようにしてください 俺にもくだらない反論(?)が来ないのでWIN♪WIN♪
424 名前:デフォルトの名無しさん [2018/11/01(木) 22:16:53.31 ID:zOBF+lvD0.net] >>423 要するにバカやんけおまえ
425 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:19:28.46 ID:Kkuf6Nxk0.net] まだNGにしてないのか?
426 名前:デフォルトの名無しさん [2018/11/01(木) 22:21:41.75 ID:zOBF+lvD0.net] >>425 バカを嘲笑うのがおもろいのにNGにするわけないやろ ホンマにバカやなおまえ
427 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:22:49.71 ID:45pCF+y00.net] ああもぅめんどくせぇなw 順番変えたくないなら stable sort でええやんけ メモリがどーたらこーたらは知らんw $ cat hogehoge | awk '{print ($1%2?"b":"a") "\t" $1}' | sort -s -k1,1 | cut -f2
428 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:22:56.19 ID:Kkuf6Nxk0.net] じゃあなんで黙れって言ったの? 俺が書き込みしなきゃ、お前出てこれないじゃん 矛盾してるよね。
429 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:23:55.45 ID:Kkuf6Nxk0.net] >>427 いや、頑張らなくていいよw
430 名前:デフォルトの名無しさん [2018/11/01(木) 22:25:19.85 ID:zOBF+lvD0.net] >>428 バカはしゃべるな
431 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:31:12.95 ID:zo7FxUKXr.net] >>419 だから変数使えって言ってるんだよ たいした理由も無いのに速度だリソースだって言ってるだけなんでしょ だったら奇数用途偶数用を1回ずつ合計2回実行すればいいだけ
432 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:35:03.93 ID:Kkuf6Nxk0.net] だから仕方ないかって書いてんのにw ほんと人の話読まないやつだな 400 自分:デフォルトの名無しさん (ワッチョイ ab98-QXT6)[sage] 投稿日:2018/11/01(木) 19:51:11.07 ID:Kkuf6Nxk0 [4/15] 遅くなるのでディスクに書き込みたくないし、メモリも あまり使用したくなかったんだけど仕方ないか
433 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:35:30.89 ID:bLNYdVH2a.net] えっなにこれは…
434 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:36:17.06 ID:upF+pHX50.net] tee(1)コマンド使ったらいけるかなとか考えたが無理かな。
435 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:43:09.27 ID:Kkuf6Nxk0.net] >>434 片方ファイルだもんね。 メインプロセス起動(出力を2つに分岐) ├出力1 偶数行表示プロセス実行 └出力2 奇数行表示プロセス実行(偶数行表示プロセス終了後に処理開始) みたいな事ができるかな?と思ったんだけど まあ、これでも内部的には出力がバッファに 溜め込まれてるんだろうけどね
436 名前:デフォルトの名無しさん [2018/11/01(木) 22:48:35.54 ID:zo7FxUKXr.net] >>432 お前ホントバカだな お前のようなバカのためにプログラム書いてやったぞ eo-sort.exe 第一引数に入力ファイルを渡せば標準出力に まず偶数業出してその後に奇数業出してくれる 必要ならそれをファイルにリダイレクトしなよ
437 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:49:59.34 ID:Kkuf6Nxk0.net] いらねっす
438 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:53:44.24 ID:zo7FxUKXr.net] ああ、あと出し情報で偶数奇数じゃなかったんだよな そりゃいらないわなw
439 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 22:54:34.69 ID:Kkuf6Nxk0.net] え?あぁ、そうだな
440 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:01:11.09 ID:upF+pHX50.net] >>435 というかよく読んだら「ファイルディスクリプタをうまく使う」ってそういうことだよね teeっていうのはファイルと標準出力に書き込む「ファイルディスクリプタをうまく使う」コマンドの一つなんだからさ。 まあ俺には変数使わずに出力を分けるのは無理かな。 ところで変数使わない理由はPOSIXシェルスクリプトは変数のスコープができず 利用者が定義している定数を潰す可能性があるからって理解でいいのかな?
441 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:17:46.65 ID:JoiMeSvG0.net] 印刷して紙でやればメモリもディスクも使わないんじゃね?
442 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:22:18.99 ID:0eDQcpEPa.net] 天才か
443 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:31:18.23 ID:45pCF+y00.net] じゃぁ moreutils の pee コマンドでも使ったら $ cat hogehoge | pee 'awk "!(\$1%2)"' 'awk "\$1%2"'
444 名前:デフォルトの名無しさん [2018/11/01(木) 23:58:02.32 ID:s+SrulDE0.net] >>441 コペルニクス的転回だな。
445 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 00:25:05.23 ID:qf9daF/z0.net] 同じターミナルに出力するのが仕様間違いだろ。スクロールバックがめんどくさい。
446 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 01:50:44.73 ID:RWqagkCBM.net] >>393 出来るぞ もう諦めたのならまあいいか
447 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 03:41:34.10 ID:fhEBIQ700.net] 確かに
448 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 06:24:06.72 ID:tmRne/9W0.net] >>443 これすごいね。 peeコマンドに可搬性を持たせられたらいいんだけど、それが問題だよね
449 名前:デフォルトの名無しさん [2018/11/02(金) 06:38:46.12 ID:BwjETkqh0.net] あのう、プロセス動かすだけでメモリ消費してしまうんですが 変数や作業用ファイル作らなくても内部的な一時ファイルは作られるわけで リソース消費しないで切り分けようとエディタ立ち上げて手作業でやっても、やっぱりリソース消費があるので 誰かが言ったように、ノートかなにかに手書き転記するしかないと思う つうか、そんな人はコンピュータ使っちゃダメだと思う まるで、経団連会長みたいなんだもの 最近会長室にコンピュータが導入されたらしい あれこれ、たかが変数や作業用ファイル如きでリソース消費しないように考える時間など無駄中の無駄 なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから 時間の使い方を間違っている そんな下らない話題で、ここのスレのリソースも無駄遣い
450 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 07:18:03.73 ID:bE/8yEKV0.net] >>446 諦めてないです!まってます!
451 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 07:42:30.53 ID:bE/8yEKV0.net] >>448 > peeコマンドに可搬性を持たせられたらいいんだけど、それが問題だよね こんなんでどう? peeコマンドのシェルスクリプト実装版 シェルスクリプトで実装したから外部コマンドだけじゃなくてシェル関数も呼べるよ #!/bin/sh pee() { ( ( ( while IFS= read -r line; do printf '%s\n' "$line" printf '%s\n' "$line" >&3 done | "$1" >&4) 3>&1 ) | "$2" ) 4>&1 } foo() { printf 'foo %s\n' "$(cat -)"; } bar() { printf 'bar %s\n' "$(cat -)"; } pee foo bar
452 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 07:59:00.48 ID:bE/8yEKV0.net] >>443 >>451 のシェルスクリプト実装版もそうだけど、 俺の予想が正しければ、その2つのawkは並列に動作するんじゃないかな? 1つ目のコマンド実行が完了まで2つ目のコマンドの実行をブロックするとは 思えないので2つの出力は混じって出てくると思う。 プロセス起動のオーバーヘッドがあるから少量のデータだと コマンド順に出力されるように見えるかもだけど
453 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 08:25:40.36 ID:bE/8yEKV0.net] あれ? これでできてね? 最初こんな感じだったからブロックされずに混じって出てくることになったけど foo() { cat -; } bar() { cat -; } こうしたせいで出力がブロックされてる気がする foo() { printf 'foo %s\n' "$(cat -)"; } bar() { printf 'bar %s\n' "$(cat -)"; }
454 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 08:26:07.31 ID:tmRne/9W0.net] >>451 https://www.mankier.com/1/pee これを読む限り引数は2つだけじゃないから,ちょっと機能不足かもね。 もちろん今回のあなたの目的には合うけど(2通りのパイプがあればそれで十分でしょう?) ただ,もっと一般的なpee(1)コマンドを作ろうと思うと, 引数の数に応じてまずは雛形を作りそれをevalする,みたいな方法を採る必要があるかも。
455 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 08:41:23.56 ID:bE/8yEKV0.net] >>454 複数対応だと面倒くさそう・・・ eval使えば可能だろうけど、文字列組み立てるのが そう。今回書いた内容は>>453 でできる。 だけど今回書いてないもう一つの制限があってそれで出来ない・・・ (制限っていうのはパイプで関数に渡すんじゃなくて変数で渡したい) まあいいや、また長くなりそうだから質問閉じるわ とりあえず変数使わずに出力をまとめることはできたし あとは別の問題
456 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 09:19:53.88 ID:Rb6mIS4M0.net] foo() { printf 'foo %s\n' "$(tail -n 1 -)"; } bar() { printf 'bar %s\n' "$(head -n 1 -)"; } ってして seq 1000 | ./pee.sh としたら実行する度に foo の値 が違ってるな…どちからの子プロセスが実行完了したら while も終了するから仕方ないんだろうけど。trap '' PIPE ってすると I/O error になるし
457 名前:デフォルトの名無しさん [2018/11/02(金) 09:45:49.16 ID:0QIYfvOaa.net] >>449 > なにも、惑星探査衛星の限られたリソースでなんとかするって話じゃないんだから いや知らんけどそういう極小環境なのかも知れんよ。そうでなければこんな要求出てこないと思うが。
458 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 09:56:03.14 ID:bE/8yEKV0.net] >>457 正解。組み込みマシンも対象としている
459 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 09:59:54.78 ID:bE/8yEKV0.net] 限定的ながら変数で渡すっていうのが出来てしまったので晒す。多分使わない #!/bin/sh main() { index=0 ( ( ( while IFS= read -r line; do index=$((index+1)) dumpvar_and_call "even" dumpvar_and_call "odd" >&3 done | eval "$(cat -)" >&4) 3>&1 ) | eval "$(cat -)" ) 4>&1 } dumpvar_and_call() { set; echo "$1"; } even() { if [ $((line % 2)) = 0 ]; then echo "index:$index even $line" sleep 1 fi } odd() { if [ $((line % 2)) = 1 ]; then echo "index:$index odd $line" fi } main<<HERE 3 6 7 4 2 8 HERE
460 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 10:03:43.36 ID:bE/8yEKV0.net] なんで使わないかというと、変数をパイプで渡すために setでシェル変数をダンプして、evalしてるんだが、 bashでは読み取り専用変数があってエラーになるから setの出力をあれこれフィルタすればできると思うが、 変数の中に改行が入ってる場合とか対応が面倒 bashなら変数名に特定のプリフィックスがついたものだけ ダンプできたとは思うが他のシェルではそうは行かない また、行ごとに変数すべてをsetしてevalとか パフォーマンス悪そうだし。
461 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 10:11:28.72 ID:GFVwJxnL0.net] >>457 そんな環境でPosix縛りだとしたら、プロジェクト自体が間違ってる。
462 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 10:16:42.75 ID:bE/8yEKV0.net] > そんな環境でPosix縛りだとしたら 実はPOSIXよりも状況が悪いw 使える機能がPOSIX未満なんだよ。 つまり一部の機能しか実装されていない
463 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 11:47:49.42 ID:tmRne/9W0.net] ただの愚痴だけど POSIXユーティリティにネットワーク通信が含まれてないのってマジで致命的欠陥だと思う。 POSIX原理主義とか,たしかに素晴らしい考えだとは思うけど,ネットワーク通信なくして現在のコンピュータを管理・運用するのは不可能っていうか もしできてもすごくつまらないでしょう。
464 名前:デフォルトの名無しさん [2018/11/02(金) 12:35:03.14 ID:e7WVTJJGr.net] なんでバカって大げさに言いたがるんやw 致命的てwww
465 名前:デフォルトの名無しさん [2018/11/02(金) 13:04:44.69 ID:0QIYfvOaa.net] >>464 大袈裟に言うなよ
466 名前:デフォルトの名無しさん [2018/11/02(金) 19:08:56.10 ID:a5BSTCMR0.net] なぜか悔しがって意味不明なバカ>>465 どないなっとんねんおまえらwww
467 名前:デフォルトの名無しさん [2018/11/02(金) 23:14:17.14 ID:KoqyjIsr0.net] アンリカバブルな低学歴知恵遅れだからしょうがない
468 名前:デフォルトの名無しさん [2018/11/03(土) 05:20:12.41 ID:vg8hCxXN0.net] 大げさだなあ
469 名前:デフォルトの名無しさん mailto:sage [2018/11/03(土) 06:43:33.72 ID:9hr0em1cM.net] 日常的に誇大妄想が激しいんだろ
470 名前:デフォルトの名無しさん [2018/11/03(土) 17:50:12.58 ID:GQ9FpTGT0.net] MicroPythonを実装した方が良さそう 組込にも対応してるから
471 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 08:48:54.81 ID:S8h/cDRc0.net] コマンドを作っていてすこし疑問に思ったことなんだけど --helpオプションで出力される文章って太字や着色なんかで装飾してもいいのかな。 「いいのかな」っていうか、そういうことしてるコマンドをほとんどみかけないので もしかしたら「--helpオプションで出力される文章は装飾しないように」っていう規約がどこかにあるのかな と思ってさ。
472 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 10:11:04.15 ID:Nn4ZdlZB0.net] >>471 それはいいアイデアだな。 コマンドの出力とは違ってヘルプを入力するプログラムなんて 無いだろうし、カラー専用でもいいくらいなんじゃないか? そう考えると、manとかinfoもカラーにするべきなんだろうな 今どきカラー使えないとかまず無いし 色ももう16色に拘る必要もないだろう 最低でも256色、24bitカラーも普通に使っていいだろう
473 名前:デフォルトの名無しさん [2018/11/04(日) 10:12:08.50 ID:iTJ8u5Nd0.net] >>471 どこかにあったとしその素性のわからん規約におまえが従う必要ないやんアホなん?
474 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:08:19.99 ID:Ok+6IZd3a.net] 慣習は先人の知恵が詰まってる場合もある 自分勝手に振る舞う自称合理的よりよっぽど賢い質問だと思う AIXはmanが黄色とか太字とかで修飾されてた気がするな
475 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:17:07.51 ID:Nn4ZdlZB0.net] Linuxでmanを少しカラフルで見やすくする https://orebibou.com/2016/12/linux%E3%81%A7man%E3%82%92%E5%B0%91%E3%81%97%E3%82%AB%E3%83%A9%E3%83%95%E3%83%AB%E3%81%A7%E8%A6%8B%E3%82%84%E3%81%99%E3%81%8F%E3%81%99%E3%82%8B/ へー
476 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:18:53.69 ID:Nn4ZdlZB0.net] ↑ふざけとんのか BASH(1) General Commands Manual BASH(1) 名名前前 bash - GNU Bourne-Again SHell 書書式式 bash [options] [file] 著著作作権権 Bash is Copyright (C) 1989-2011 by the Free Software Foundation, Inc. 説説明明 bash は、標準入力やファイルから読み込んだコマンドを実行する、 sh 互換のコマンド言語インタプリタです。 bash に は、Korn シェルや C シェル ksh や csh) の便利な機能も採り入れられています。 bash は IEEE POSIX specification (IEEE Standard 1003.1) の Shell and Utilities に準拠する実装を目指していま す。 bash はデフォルトで POSIX 準拠に設定することもできます。 オオププシショョンン
477 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:25:16.76 ID:Nn4ZdlZB0.net] これでまともになった raimon49.github.io/2017/03/31/man-with-colored-pager.html
478 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 11:56:45.43 ID:S8h/cDRc0.net] >>472 24bitカラーはまだマズいと思う。 多くのXデスクトップ環境で利用されてる端末エミュレータ (GNOME TerminalとかLXTerminalとか)は LibVTEベースなのよ。 そしてLibVTEの安定板は24bitカラーには対応してない。
479 名前:デフォルトの名無しさん [2018/11/04(日) 12:58:38.32 ID:MKH8Qowh0.net] そういうのを根本的に対応できるようにするなら roffが対応する部分になるからな このスレでやってることは 池沼の塗り絵
480 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 13:16:39.02 ID:Nn4ZdlZB0.net] >>478 WSLは対応したのに? WSL その41 - Windowsのコンソールが24bitカラーをサポート・Bashからカラフルな出力が可能に https://kledgeb.blogspot.com/2016/09/wsl-41-windows24bitbash.html
481 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 16:48:40.44 ID:V6s3/sLe0.net] >>480 ま,まぁ? 24bitカラーなんて端末エミュレータの本来の機能じゃないし? (震え声)
482 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 20:50:30.36 ID:eEexL0w40.net] >>480 じゃあそこからsshでログインすればいいじゃん。 これにて一件落着。
483 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 20:58:33.34 ID:Nn4ZdlZB0.net] >>482 俺に言うなってw 24bitカラーも普通に使っていいだろうって 最初から言ってるだろ
484 名前:デフォルトの名無しさん mailto:sage [2018/11/04(日) 23:47:16.17 ID:EATzJZ5p0.net] そして寒い寒いマシン室に押し込められる可哀想な おじさん達のことは誰も考えてくれないんだよな。
485 名前:デフォルトの名無しさん mailto:sage [2018/11/05(月) 00:50:02.70 ID:8mReqxsGa.net] かわいそう
486 名前:デフォルトの名無しさん mailto:sage [2018/11/05(月) 01:09:40.53 ID:LRv++2Wv0.net] マシン室が
487 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 16:17:47.15 ID:Vcs848wz0.net] ... | sort -k 2.2 や ... | uniq -c のような、パイプ挟んでもオプション使えるシェルスクリプトが書けません これはどうやればいいのでしょうか?
488 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 16:19:39.11 ID:cucsRggBM.net] 理解不能
489 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 16:27:38.20 ID:Vcs848wz0.net] ... | perl -0777 -ne 'print grep(m{ココ1}i, split("(?=ココ2)", $_));' 例えばこのような文脈で動作させていたものを パイプ移行をシェルスクリプトに書いておき 変数ココ1 ココ2 に渡して処理したいのです | split_grep.sh ココ1 ココ2 このように動作させたいのですが $1 $2 ... などを見ても 参照できてなくて困っています
490 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 16:53:48.26 ID:7Ll1zO1lM.net] ' だからじゃねえか?適切に " を使え。
491 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 18:09:54.51 ID:dlj8br7m0.net] --helpオプションで出力される手引きの装飾についてだが less(1)ユーティリティは太字とにしてるね。
492 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 23:18:09.57 ID:9jHKU1L00.net] シェルスクリプトは20年動くとか言ってるやつがいるけど、 あれ嘘だなぁ。 各シェルの実装は互換性がない部分があるし、 同じシェルでもバージョンが変わると微妙に動きが変わる POSIXという仕様があってもそれを完全に実装しているとは 限らないしバグもある。 20年前のJavaScriptと同じようなレベルだ。 そのJavaScriptも20年前のものが今でも動いているからねw 今のJavaScriptは本当にどれもで同じように動くようになったけど20年前は大変だった。 どのシェルでも同じように動くシェルスクリプトを書くのは今でも大変だよ 一度互換性テストでもやって準拠度100%を達成を競わせたほうが良いだろう
493 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 03:53:59.64 ID:XzpCa+6s0.net] 「POSIXという一つの規格」がなぜそんなに強力だと思うのか分からない。 Pythonの公式文書やECMAが規格するJavaScriptと同等の立場でしょう。 もちろん,俺がシェルスクリプトを書くときは,俺がPythonやJavaScriptを書くときと同じく POSIXという共通規格に従うようにしているが,それは今後20年動かす為じゃない。
494 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:26:49.70 ID:66xysPr5r.net] cronから実行しているシェル(スクリプト)があるんだけど 2重実行されると問題があるので そのシェルをくるむ親シェルを作って そこで事前にpkillで実行されているシェルおよびコマンドを無条件にkillしてる でも最近もともと実行してるシェルを複数回ループで実行したい要件が出てきた 単純に親シェルでループさせることを考えたけど pkillしてもループで再実行されてkill出来ずに2重実行される問題が出てくる シェルを親子孫の3階層にして新しく間に挟む子シェルでループさせ 親シェルのpkillではこの子と孫とコマンドをkillするといいと思うんだけど 階層が深くなって嫌だなと思うんだけど何かいい案ない? ちなみに孫シェルでループってのも考えたけど cron以外ではループさせたくない場合が多いので そこには手を加えずシンプルなままとしたいため考慮から外しました
495 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:42:23.92 ID:+ld6QnEyM.net] pkillとか野蛮な方法じゃなくて、ちゃんとロックして、ロック取れなければ死ねばいいのでは?
496 名前:デフォルトの名無しさん [2018/11/07(水) 09:48:09.44 ID:bimd4khFa.net] もしflockコマンドがあればそれで可能な筈。
497 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:48:23.84 ID:v2POOMdv0.net] どこまでの子プロセスとか残る可能性がとか条件が全然わからんが、シェルスクリプトを2重実行しないようにだけなら、その冒頭で、 [ -f /var/run/hogehogeshellscript.pid ] && kill -0 $(cat /var/run/hogehogeshellscript.pid) && exit 0 printf "%d" $$ > /var/run/hogehogeshellscript.pid 後始末で rm -f /var/run/hogehogeshellscript.pid が常套手段だな、俺は。「事前にpkillで実行されているシェルおよびコマンドを無条件にkillしてる」なんて、バグって残る場合しか考えられない(そんな動いているの殺していいの??)
498 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:55:36.16 ID:zUpUn5UV0.net] そもそも考え方自体が理解しがたい こんなクソなことやり出すやつとは仕事したくない
499 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 09:56:12.27 ID:+ld6QnEyM.net] >>497 cronで「しか」起動しないなら実用上問題ないかもしれんが、 まともなロックじゃないので2重起動されうる。
500 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 10:01:20.98 ID:v2POOMdv0.net] >>499 まさか、タイミング的な話? >>494 で十分なもんだし、そんなシェスクリプト書きませんよ。そんな超短時間で多重起動されうるもんなんて、シェルスクリプトなんて書かない
501 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:16:33.73 ID:UCphLCxy0.net] バグの言い訳をシェルスクリプトのせいにするなよ シェルスクリプト以外でもやり方は一緒だろ それともシェルスクリプトでは不可能で 他の言語なら可能な方法があるとでも言うのか? > そんな超短時間で多重起動されうるもんなんて、シェルスクリプトなんて書かない シェルスクリプト以外でいいんで、どうやるのか答えてみて
502 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:40:25.66 ID:v2POOMdv0.net] バグの言い訳?? そんなタイミングにシビアなのは普通にCなりで書くけど?なんか知らんがシェルスクリプトで処理スピードに必死なヤツもいるけど、そんなに時間にシビアなら普通にCでするだろう(一部でも) てか、デーモンだろな。別にシェルスクリプトでデーモン書いてもいいけど、小回りが利くのはやっぱCなりの方だな
503 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:41:10.13 ID:UCphLCxy0.net] いや、だから、C言語でいいんで、多重起動しない方法書いてみてって、 どうせそれがシェルスクリプトでも使えるだろ
504 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:48:02.80 ID:v2POOMdv0.net] 何に絡んでいるのかわからん 粒度が全然違うことなぞCで何か書いたことがあるのならわかるだろう。>>499 がその粒度の話だからな
505 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:50:35.19 ID:UCphLCxy0.net] 絡んでいない。C言語で多重起動しない方法は シェルスクリプトでも使えると言ってる だからシェルスクリプトで書かない理由にはならない
506 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:52:41.86 ID:v2POOMdv0.net] だから、粒度って言ってるじゃん。わからんのだな。話にならんな
507 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:55:02.47 ID:oFuFuwyAa.net] 結論の出ない子供同士の戦い ファイッ
508 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:55:08.02 ID:UCphLCxy0.net] > 粒度って言ってるじゃん なんの説明にも反論にもなってない 粒度が違っても関係ない話だろ(他の人には「粒度」といい方で伝わってるはずw)
509 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:56:38.86 ID:v2POOMdv0.net] うるせっw どうもシェルスクリプト大好き(後は私怨かなあとw)な絡みで、それ視点でしかなのでうやむやにしてんだけどね。言ったってたぶん聞かない人だから
510 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 11:59:05.62 ID:v2POOMdv0.net] >>506 タイミング的な話なら、余計なことがない方が粒度が細かい=そっちにに決まっているだろう だがしかし、いくら粒度が細かくたってだから、デーモンでだろなだけどな
511 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:06:12.02 ID:UCphLCxy0.net] > 余計なことがない方が粒度が細かい 粒度の使い方を待ちってるだけじゃないか で、デーモンにしないと多重起動は防げないって話をしてんのか? デーモンにすれば多重起動を防げる理由は? ほらな、突っ込まれるとこの程度、答えられないんだよw
512 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:07:51.60 ID:8DqZdVO16.net] すまん 口を挟むけど 「 1. シェルスクリプトは各コマンドの起動時間やカーネルがファイルをどのように扱うということを 可搬な方法ではほとんど制御できない。 一方でCはそもそもOSがそれで書かれているように、上記の事柄を比較的簡単に実現できる。 2. ロックファイルを用いた多重起動防止アルゴリズムにはコマンドの制御時間やファイルの扱いを考える必要がある。 3. よってCと同じアルゴリズムをシェルスクリプトで記述しても それは運用に耐えるものでなくなってしまう。 だから無意味 」 ↑こういう理解でいいか?
513 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:09:17.82 ID:v2POOMdv0.net] >>511 >粒度の使い方を待ちってる(間違ってる)だけじゃないか はあ? >デーモンにすれば多重起動を防げる理由は はあ?デーモンは一つ動けば十分だからな。ま・さ・か、デーモンにしても多重起動を防げないとか言い出してるわけ?だとしたらアホだな
514 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:16:34.30 ID:v2POOMdv0.net] >>512 別に無意味とは言わないよ。俺は書かないというだけで。なんでシェルスクリプトでタイミング的な諸々をシェルスクリプトというある意味隠蔽された条件制約で悩まなくちゃならんねんってとこから。それならCでのほうがスッキリ小回りが利くしという 後は、超短時間で多重起動されうるもんなんてよりCで書くなという、そんな起動頻度のあるのは、スクリプトではしない
515 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:21:30.58 ID:UCphLCxy0.net] >>512 > シェルスクリプトは各コマンドの起動時間やカーネルがファイルをどのように扱うということを > 可搬な方法ではほとんど制御できない。 それはプロセスの多重起動を防ぐ方法と関係ない > ロックファイルを用いた多重起動防止アルゴリズムにはコマンドの制御時間やファイルの扱いを考える必要がある。 コマンドの制御時間やファイルの扱いとかなんの話をしてるのか >>497 はアルゴリズムの間違いなのでロックファイルがどうとか関係ない (どうせC言語で作っても同じ間違いをするだろう) > よってCと同じアルゴリズムをシェルスクリプトで記述しても それは運用に耐えるものでなくなってしまう。 今はプロセスの多重起動の話でしか無いので、多重起動が出来ないならば運用に耐えられる それがシェルスクリプトできないわけがない。
516 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:24:39.53 ID:UCphLCxy0.net] >>513 > はあ?デーモンは一つ動けば十分だからな。ま・さ・か、デーモンにしても多重起動を防げないとか言い出してるわけ?だとしたらアホだな デーモンが一つ動けば十分だとかそういう話をしてるんじゃない。 プロセスの多重起動を防ぐにはどうするかの話で、、 それはデーモンにしないと出来ないことではないだろ >>514 > なんでシェルスクリプトでタイミング的な諸々をシェルスクリプトというある意味隠蔽された条件制約で悩まなくちゃならんねんってとこから。 だから、なんでシェルスクリプトにこだわってるのか? こっちはお前が、プロセスの多重起動を防ぐ正しい方法を知らないんだろうなって思ってるんだよ。 だからC言語でいいから書いてみろと。 同じアルゴリズムはシェルスクリプトでも使えるから、シェルスクリプトかどうかの話じゃないって言ってんの で、C言語でプロセスの多重起動を防ぐ正しい方法を書けないんだろう? 出てないってことそういうことだ。シェルスクリプトだからと嘘をつくな
517 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:24:57.98 ID:v2POOMdv0.net] >>513 >>497 はアルゴリズムの間違いなのでロックファイルがどうとか関係ない ただのイチャモンか。またか?コマンドのようにw
518 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:26:20.56 ID:v2POOMdv0.net] >>516 ただのイチャモンやん。また、無茶苦茶やな。なにを問題にしているのかイミフ。いちゃもんのためのいちゃもんやなあ
519 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:29:45.81 ID:UCphLCxy0.net] >>518 何を問題にしているかもわかってないのか? >>517 も指摘しているが、>>497 は多重起動チェックのアルゴリズムに問題がある シェルスクリプトだからこれしか出来ないという話ではない
520 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:31:32.56 ID:UCphLCxy0.net] あ、>>517 って俺の書き込みか わかるように書けよw
521 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:33:40.01 ID:v2POOMdv0.net] >>519 うーむ、だから粒度の問題と言っているんだけど。なにがアルゴリズムに問題があるの?cronで起動する大きな粒度では問題ないと思うけど あるとしたら、起動終了間近とか??それは別の話だろうしな???
522 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:35:54.84 ID:v2POOMdv0.net] >>520 ああ、すまん。>>516 はあんたか。なんで絡んでるねんっ、何を問題にしてるねん??
523 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:39:53.83 ID:v2POOMdv0.net] >>522 ああ、いいのかww 何を絡んでるのかイミフすぎ。場合によってって考えられないのかな? そもそも>>499 で十分で(十分だろう)というのに対して、その条件以外のツッコミに対して、その漠然として条件なら突き詰めると&俺にとって普通にシェルスクリプトで書かないってことなんだけどなあ 何が気に食わない、何が間違いなのかさっぱりだな
524 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:40:36.54 ID:8DqZdVO16.net] >>515 俺は「プロセスの多重起動を防ぐ」というのを 「プロセスを一つ立ち上がっていることを感知する」 という仕組みを作ることだと思っていて、その方法の一つに 「プロセスが起動するときに特定のファイルを生成し そして終了するときそのファイルを削除する (そして そのファイルの有無によって多重起動を判断する)」 というものがある という認識。 「特定のファイル」はロックファイルと呼ばれる。 で ロックファイルアルゴリズムの問題点は非常に素早く二つのプロセスを立ち上げた時に 最初に起動したプロセスがロックファイルを生成し終える前に 二番目のプロセスがロックファイルが存在しないのを理由に立ち上がってしまう (結果として二重起動する) ということだと思っている。 このときに関わってくるのはファイルIOとかその辺のカーネル領域に片足突っ込んだ話なので Cではできるがシェルスクリプトでは難しいということだと考えたんだけど 違いますかね。
525 名前:デフォルトの名無しさん [2018/11/07(水) 12:43:18.47 ID:bimd4khFa.net] flockコマンド使えって。シェル単体ではそこまでやってくれるやつは多分ないだろうし。
526 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:47:11.27 ID:v2POOMdv0.net] >>524 ロックファイル以外でも所詮OSで何らかの起動時のサポートが無ければCでも防げないと思うんだけど、どうだろう? なので、デーモンとして一つ起動して、それを活性化するのがなんだけどな
527 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:56:45.06 ID:sVRrLKNr0.net] >>515 >>>497 はアルゴリズムの間違いなのでロックファイルがどうとか関係ない どこが間違ってるの? 最初にロック取って最後に解放する、これを間違ってると言うなら 正解を教えてよ。多分逃げるんだろうけど。
528 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 12:58:34.71 ID:sVRrLKNr0.net] >>525 POSIXにないんでしょ、多分
529 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:04:03.69 ID:jS/U4UFDM.net] flockがあればそれでいいけど、なくてもmkdirとかln -sで正しいロックが書けるよ
530 名前:デフォルトの名無しさん [2018/11/07(水) 13:04:59.10 ID:bimd4khFa.net] ロックファイルの有無だけでやる場合は open() で O_EXCL 指定してファイル作ろうとしないと駄目で、シェルスクリプトからこれがやれるかどうかはシェル次第になる。 そういう外部コマンド作って呼び出せば確実だが、それがありなら fcntl() や flock() 等を使ったもう少し信頼性の高そうなロックをした方が良いように思う。 ロックファイルだけでロックする場合はもう一つ強制終了させられた時にファイルが消せずに残る問題がある。 これはファイルのタイムスタンプを見て古ければ動いていないとみなす方法である程度回避可能だが、その場合は動いているプロセスが定期的にファイルを touch する等して更新する必要がある。 しかしそれでも SIGSTOP により停止していただけだったら役に立たない。
531 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:05:12.80 ID:8DqZdVO16.net] https://qiita.com/richmikan@github/items/6ca1ec3b354ae2f5505d 「シェルスクリプト 排他制御」でググったらこんな記事があったよ。
532 名前:デフォルトの名無しさん [2018/11/07(水) 13:06:37.34 ID:bimd4khFa.net] >>529 ああ。それでもできるか。
533 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:22:04.61 ID:v2POOMdv0.net] なるほど、OS内でキッチリ一元管理しているナニカに頼ればいいのか&あるのか
534 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:40:10.94 ID:UCphLCxy0.net] >>524 > で ロックファイルアルゴリズムの問題点は非常に素早く二つのプロセスを立ち上げた時に > 最初に起動したプロセスがロックファイルを生成し終える前に > 二番目のプロセスがロックファイルが存在しないのを理由に立ち上がってしまう > (結果として二重起動する) 正しくない 正しいロックファイルアルゴリズムであれば、素早く二つのプロセスを立ち上げても問題ない あんたが書いたそれはは典型的な間違ったロックファイルアルゴリズム(そして>>497 も同様) アルゴリズム自体の問題なのでシェルスクリプトかどうかは関係ない 直接的な解答ではなくて関連した話題になるが、多重起動防止以外でも重要だから読んどけ https://www.ibm.com/developerworks/jp/linux/library/l-sprace/index.html > 単純な解決方法は、open()をフラグO_WRONLY | O_CREAT | O_EXCLで使うことです https://www.ipa.go.jp/security/fy20/reports/tech1-tg/2_05.html > これを避けるためには先に述べたとおり、テンポラリファイルを生成するときに O_EXCL を指定すればよい。
535 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:43:12.68 ID:UCphLCxy0.net] もう少し引用する範囲を広げる > これを避けるためには先に述べたとおり、テンポラリファイルを生成するときに O_EXCL を指定すればよい。 > これを POSIX シェルで行うには、set -C を使う。set -C は noclobber オプションを有効にする。 > noclobber が有効な場合、> によるリダイレクトでの open には O_EXCL が指定される。 > これを使ってテンポラリファイルの生成に挑戦し、失敗したときは終了するには以下のようにする。 > また、ここでは TMPDIR が指定された場合には使うようにしている。
536 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:44:46.92 ID:UCphLCxy0.net] こっちはおまけ、どうせググるんだろう?w pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#set
537 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:45:31.17 ID:v2POOMdv0.net] ほんと場合によってってって無いやつだな。原理主義者か?
538 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:49:03.61 ID:8DqZdVO16.net] >>534 そうなんだ。知らなかった。 教えてくれてありがとうございます。
539 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 13:57:13.33 ID:UCphLCxy0.net] ロックの確認とロックかけるのをアトミックにやらないとか まともにロック処理やったことがない証拠だよ これは初心者は誰でもやる典型的な間違いだからな 基本を知らずに独自の思いつきで実装するからそうなる 言われれ初めて気づく。だが一回言われればこうやれば 解決できるのかと深く記憶する話だから、単純に知識が欠けてるということ だから他の言語でもどうせ同じなんだろということ。
540 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 15:22:16.58 ID:8DqZdVO16.net] ksh --helpは出力される手引きが装飾されてるね
541 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 15:56:27.81 ID:A+xcJusCM.net] 最初っから主張の根拠を提示すれば良かったのに 何だかんだで下らないレスが続くの止めて欲しい
542 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 17:41:34.46 ID:P+AQGnBFa.net] echo "echo \"Hello, world\!\"" これ実行したら echo "Hello, world!" にならない echo "Hello, world\!" なぜか!だけ手前についてしまう
543 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 18:45:58.27 ID:XzpCa+6s0.net] >>542 それスクリプトにしてやってみ。 多分期待どおりの出力になる。
544 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 18:49:27.43 ID:XzpCa+6s0.net] 間違えてた。 「echo "echo \"Hello, world!\""」にして。 スクリプトの中ではPOSIX互換のインタラクティブシェルは 履歴展開をしないので上手くいく。
545 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 19:24:02.67 ID:UCphLCxy0.net] そういやkshで思い出したけど、 ksh88ってもしかして比較的最近(今も?)使われてたりする? ksh88っていうぐらいだから1988年だろ?ksh93っていうぐらいだから1993年だろ? 流石にksh88はなんて30年前の化石使われてないだろ?と思ったけど Solaris 11 でこんなこと書かれてたんだよね。意外と最近まで使われていたのかなぁ?と https://docs.oracle.com/cd/E26924_01/html/E25934/userenv-1.html > シェルの変更 - デフォルトのシェル /bin/sh が ksh93 にリンクされるようになりました。 > レガシー Bourne シェルは /usr/sunos/bin/sh として使用可能です。 > 旧バージョンの ksh88 は、shell/ksh88 パッケージの /usr/sunos/bin/ksh として使用可能になっています。 Solaris 11が最新版って言っても2011年11月9日リリースなので2日後に7年前のOSになるけど (でもサポートはSolaris 10が2021年までなのか・・・) そしてksh93の機能でこんな事書いてたんで、$(( )) が使えないシェルはksh88だったんだなって思ったところ https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_72/com.ibm.aix.osdevice/korn_shell_enhanced.htm
546 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 20:49:34.06 ID:nHlOtVrla.net] >>544 できたd (でも都合上コンソール開いてコピペで使いたかったんや)
547 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 20:55:26.75 ID:XzpCa+6s0.net] >>545 Solaris 10のがPOSIXに準拠してることになってるせいで "$@"じゃなくて${1+"$@"}と書かないといけなかったりして面倒だよねw
548 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 21:01:40.12 ID:XzpCa+6s0.net] >>546 「echo "echo \"Hello, world"'!'"\""」とかどうだろう。 参考: https://www.gnu.org/software/bash/manual/html_node/History-Interaction.html#History-Interaction History expansions are introduced by the appearance of the history expansion character, which is ‘!’ by default. Only ‘\’ and ‘'’ may be used to escape the history expansion character, but the history expansion character is also treated as quoted if it immediately precedes the closing double quote in a double-quoted string.
549 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 21:21:50.95 ID:UCphLCxy0.net] >>547 ksh・・・お前が諸悪の根源だったか https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=861743 > % posh -u -c 'echo "$@"' > posh: @: parameter not set poshはpdkshからフォークしている > posh (0.0.1) unstable; urgency=low > * Initial release. (copied from pdksh 5.2.14-6). closes: bug#150431. そしてシンプルな(笑)解決方法をありがとう (if書くのはもっと面倒だった) もっとバッドノウハウあったら教えてくれ!
550 名前:デフォルトの名無しさん mailto:sage [2018/11/07(水) 22:18:01.95 ID:XzpCa+6s0.net] >>549 あー。分かってると思うがこれは俺が考えた方法じゃない。 古いGNU grepでegrepコマンドを https://git.savannah.gnu.org/cgit/grep.git/tree/src/Makefile.am?h=v2.5.1#n23 ↑こうやって作ってたのを見掛けてさ。 これはすごい方法だと思って自分のシェルスクリプトに取り入れた。 でもPOSIX 2013でset -uが有効のときでも空の変数$@および変数$*がエラーにならない っていうことが決定されたのでもう不必要。 pubs.opengroup.org/onlinepubs/9699919799.2013edition/utilities/V3_chap02.html#tag_18_25_18
551 名前:デフォルトの名無しさん mailto:sage [2018/11/08(木) 00:40:04.66 ID:rJTiWJ810.net] >>550 modernishでも言及されてた。時代遅れのワークアラウンドだってw でも現存するシェルに蘇っておるのじゃよ 昔の人には有名な回避策なのかな? https://github.com/modernish/modernish/blob/master/README.md > BUG_PARONEARG: When IFS is empty on bash 3.x and 4.x (i.e. field splitting is off), > ${1+"$@"} is counted as a single argument instead of each positional parameter as > separate arguments. To avoid this bug, simply use "$@" instead. (${1+"$@"} > is an obsolete workaround for a fatal shell bug, FTL_UPP.)
552 名前:デフォルトの名無しさん mailto:sage [2018/11/08(木) 06:54:13.32 ID:RnVV1kHy0.net] modernishおもしろいね。 modernishプロジェクトはcase文の条件の先頭に開き丸括弧を付けてるのか。 pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_05 ここには確かに開き丸括弧を前置してもいいとあるけど一般的には省略されるでしょ。 なにかこれも旧時代のシェルの不具合への回避策なのかな。 それこそGNU Bash 3.xで動かない,とか。
553 名前:デフォルトの名無しさん mailto:sage [2018/11/08(木) 21:39:50.16 ID:rJTiWJ810.net] >>552 やっとmodernishに興味を持ってくれた人がw まあ俺もバグ情報とか参考になるなって程度にしか見てないんだけど > modernishプロジェクトはcase文の条件の先頭に開き丸括弧を付けてるのか。 それ見た時、何この文法?modernishでそこまで拡張できるの?って驚いたw 単なる普通の文法だったわけだけど > それこそGNU Bash 3.xで動かない,とか。 少なくともbash 2.03では開き括弧なくて動くよ
554 名前:デフォルトの名無しさん mailto:sage [2018/11/08(木) 21:43:11.48 ID:rJTiWJ810.net] 話変わるけど、 foo | bar みたいなコマンドで fooからたくさん出力されるけど、barの処理が遅いってとき fooからの出力ってブロックされるのかな? なんか20〜30行ぐらいでブロックされるような 出力の停止、遅延が起きてる気がする メモリにバッファリングするだろうから、それが溢れないような処置として そういう仕様は理解できるけど、どこかに書いてあるのかな? シェルの仕様っぽい気がするけど、OSも絡んでいそうな気もする
555 名前:デフォルトの名無しさん mailto:sage [2018/11/08(木) 21:57:11.56 ID:M53t5TPP0.net] >>554 タネンバウム先生の本は読んでるんだよね?
556 名前:デフォルトの名無しさん mailto:sage [2018/11/08(木) 21:59:18.34 ID:rJTiWJ810.net] >>555 読んでないよ。どれ読めばいい?
557 名前:デフォルトの名無しさん mailto:sage [2018/11/08(木) 22:12:14.64 ID:RnVV1kHy0.net] 全然かわいくないアライグマの表紙の本じゃない?
558 名前:デフォルトの名無しさん mailto:sage [2018/11/08(木) 22:21:06.03 ID:rJTiWJ810.net] お、再現した i=0 while :; do i=$((i+1)) echo test$i echo log$i>&2 done | while read line; do echo $line sleep 3 done パイプの前で無限ループで標準出力と標準エラー出力に高速に出力してるとき パイプの後ろの遅い標準入力から入力の処理によって パイプの前の標準エラー出力への出力がブロックされてる 7400行(64KB程度?)ぐらいまでは、パイプの後ろの処理を待つことなく高速に 標準エラー出力に出力するが、それ移行は1行ずつ出力するようになった。
559 名前:デフォルトの名無しさん mailto:sage [2018/11/08(木) 22:23:20.00 ID:rJTiWJ810.net] >>557 ¥ 15,449 円+350円 もするのかー 高いなー
560 名前:デフォルトの名無しさん [2018/11/09(金) 04:14:42.04 ID:hZOut+vv0.net] >>558 それ普通のマルチタスクOSでの動作なのでは? 昔々のMS-DOSとかのシングルタスクOSでは一回ファイルに書き出してから次のコマンドに読ませるので無限に出力するやつはだめだけどな。
561 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 04:37:21.46 ID:WTWdJdbs0.net] パイプは、入力が来るまで、ブロックされる
562 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 05:22:03.56 ID:3ZHBVzZ50.net] いわゆる普通のプログラミング言語(PythonやCやJavaScript)に対して,シェルスクリプトを作る上で気をつけてることってある? 例えば「局所変数や局所関数が宣言できないのでなるべく使わない」とかさ。
563 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 08:16:02.70 ID:UVRb8J0Z0.net] >>560 並列で動作するのは当然だが、今話しをしてるのは、 一つのプロセスが、もう一つのプロセスの動作を止めるっていうところだよ >>561 逆ね。パイプは(パイプ先が)入力を受け取るまでブロックされる こっちはどばどばーっと出し続けようとしてるのに、相手が受け取ってくれないから 出せなくなるんだよ。って話
564 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 08:22:51.21 ID:PBD+wepW0.net] パイプはカットすればいい
565 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 08:36:27.28 ID:UVRb8J0Z0.net] >>562 個人的な特殊な状況下で気をつけてることならたくさんあるんだけどな パイプを(なるべく)使わないとかwww そうさなぁ、例えば意図せぬエラーで落ちるように、set -eを使う場合は 挙動をよく理解して使うこととかかな set -eは戻り値がエラーになった時点で中断される set -e foo() { echo foo begin; bar; echo foo end; } bar() { echo bar begin; baz; echo bar end; } baz() { echo baz; false; } foo これを実行すると、foo -> bar -> baz の呼び出しの流れが、bazのfalseで中断されて foo begin bar begin baz と表示されるんだが foo の代わりに if foo; then :; fi と実行すると なんと、foo end も bar end も表示されるんだよ つまり foo を if や && や || と組み合わせて使うと、エラー中断機能が無効化される だから、比較関数みたいに if foo; then という使い方を想定している関数は 中でしっかりエラーチェックをしておくこと 他の言語の例外みたいに考えてはいけない
566 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 08:39:06.36 ID:UVRb8J0Z0.net] ↑ これが理由で、set -eは使うな派もいるらしいねw >>562 > 例えば「局所変数や局所関数が宣言できないのでなるべく使わない」とかさ。 俺は訳あってそうしてるけど、特定のシェルに限って良いのなら localもしくはtypesetで局所変数使えるよ ただし、他の言語と違ってレキシカルスコープじゃなくて ダイナミックスコープなので注意が必要 これも気をつけていることかな
567 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 08:44:20.66 ID:UVRb8J0Z0.net] あと他の言語でも同じだけどshellcheckは基本やね ダブルクォートでくくるとか、shellcheckで警告出るものは ここでグダグダ書かないよ。
568 名前:デフォルトの名無しさん [2018/11/09(金) 09:08:37.30 ID:JsSTi+Gxa.net] >>563 パイプが詰まってんだから停止させるしか方法ないと思うが? バッファ大きくしても出力側が速いなら何れ突っ掛かる事になるよね。
569 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 09:16:09.65 ID:UVRb8J0Z0.net] >>568 そりゃそうだよねって話ではあるんだけどさ、 パイプで何かに繋いだがために処理が遅くなることもあるよなって思ってね
570 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 09:18:07.88 ID:FKBIIb3sa.net] 明らかにそんなレベルの回答求めてないよねっていう語りたがり
571 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 09:24:33.15 ID:UVRb8J0Z0.net] ん? あぁ、質問はコレね > メモリにバッファリングするだろうから、それが溢れないような処置として > そういう仕様は理解できるけど、どこかに書いてあるのかな? > > シェルの仕様っぽい気がするけど、OSも絡んでいそうな気もする
572 名前:デフォルトの名無しさん [2018/11/09(金) 09:31:46.72 ID:JsSTi+Gxa.net] どう考えてもOSの仕様だろう。
573 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 09:40:49.31 ID:3ZHBVzZ50.net] >>565 ありがとう。set -eは鬼門だね。前に棘かなにかでも纏められてた。 ところで パイプ使わないのはどうしてだ? シェルスクリプトは入出力指向なんだから積極的にパイプを活用すべきでは。
574 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 09:55:47.54 ID:UVRb8J0Z0.net] >>573 パイプ使わないのはシェルスクリプト内部で完結する場合の話ね 外部コマンドとのインターフェースでは使う (内部で)使わない理由は変数の共有がやりづらいから ま、これは特殊な事例なのでw
575 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 10:07:47.85 ID:3ZHBVzZ50.net] ああ。たしかにパイプ越しに変数を参照させようと思ったらexportして環境変数にしなくちゃらんもんな。
576 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 10:31:29.63 ID:UVRb8J0Z0.net] > ああ。たしかにパイプ越しに変数を参照させようと思ったらexportして環境変数にしなくちゃらんもんな。 もうちょっと説明すると foo() { output | bar | baz } fooで見えてる変数を、bar, bazに見せるのは簡単なんだよ。 exportしなくても見せられる。 outputが出力する1行をbarが解析して変数に入れたとして、その変数を bazで見ることはできない(barでexportしても無理) bazが複数行の入力を集計した結果の変数をfooで見ることが出来ない。とかね 1データを1行に詰め込めればパイプ経由でのデータ受け渡しは可能だが それができないデータだと難しい 他の言語でやれって? それをシェルスクリプトでやらなきゃいけないというのが個人的な特殊な状況下というわけ
577 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 17:10:16.74 ID:3ZHBVzZ50.net] シェルスクリプトでそのコマンドが実行された行数を取得する方法ってあるかな。 #!/usr/bin/env bashにすれば${LINENO}変数にその位置が格納されてるので簡単なんだけど やっぱりもうすこし汎用的な方法で実現したい。
578 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 19:41:43.60 ID:UVRb8J0Z0.net] >>577 LINENOしかないよ。ただしご存知の通りLINENOは使えないシェルがある。 dashなんか機能的には搭載されてるがdebianなどでは無効にされてるというw 更にシェルによっては関数呼び出しを行った時にソースコードの行数ではなく 関数の頭からの行数になっていて、それも0から始まるものと1から始まるものがある まともに使えるのはbashだけかな
579 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 20:27:42.80 ID:3ZHBVzZ50.net] >>578 だよね〜。ファイルの中での自分の位置を調べるのはシェルスクリプトでは無理っぽいね。 Cのassert()関数みたいなのを自作したかったんだけど 機能が落ちるのは嫌だな(もういいけど) ああ ちなみに > 関数呼び出しを行った時にソースコードの行数ではなく > 関数の頭からの行数になっていて これGNU Bashのことを言ってるのなら関数じゃなくて別名にすればO.K.だよ
580 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 21:02:47.30 ID:UVRb8J0Z0.net] >>579 シェルスクリプトの世界にJavaScriptのトランスパイラ技術が導入されて ソースコードの一行一行にLINENOを設定するコードを埋め込めば 解決できると思うんだが、流石にそれをやろうとする人はいないかなw > これGNU Bashのことを言ってるのなら関数じゃなくて別名にすればO.K.だよ alias?うーん、なんか別の問題がでそう。 でもbashじゃなかったと思う。 前に調べたときのコードを見てみたが、 関数の頭からの行数になるのはzsh, dash, busybox ashで zshは0から始まる。他は1から始まる。bashとkshはソースコードの行数で取れる。 バージョンは詳しく調べてないから多分古いやつは使えなかったりすると思う なので他のシェルでエラーが起きたら、bashで実行してエラーの行番号を調べたりしているw
581 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 09:07:56.28 ID:lBOHSSIo0.net] たとえばシェルアーカイブってPOSIXシェルでも可能だよね。 ああいう感じで自分が含まれるファイルを自分で走査できるんなら 行位置も取得できないかなぁと思ったんだよね……。 しつこいけどシェルスクリプト版のassert()関数が欲しい っていうか作りたいんだよねぇ
582 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 09:34:29.76 ID:8OkJCHKT0.net] >>581 assertだけなら簡単かもしれないな。 assert関数の中で全てを処理するのは難しいと思う。自分のスクリプト名でさえ取得できない場合があるから 仮に取得できたとしても、何かしらのマーカーがないとどのassertかが区別できない。 (全ててのassertに区別できるマーカーを入れるっていうのなら可能だけどw) 前提としてLINENOが取得できないのはどうしようもないのでコード変換を行なう foo() { asesrt [ i -gt 0 ] } みたいなコードがあったら以下みたいに、行番号を埋め込むプログラムを作る (ファイル名もあったほうが良いかもしれない) foo() { asesrt 2 [ i -gt 0 ] } これはPOSIXシェルスクリプトの範囲でもできる。一行づつ読んでパターンにマッチしたら変換するだけ (複数行文字列やヒアドキュメントがあったら面倒だけど、対応してませんでもいいと思う) あとは以上の変換処理を行って実行するラッパースクリプトを作って実行する 変換したコードはevalもしくはシェルにパイプで流し込むことで実行できる。
583 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 09:39:54.31 ID:8OkJCHKT0.net] あー、そうか、assertか、ならデバッグ時のみしか有効じゃなくていいな。 なら、普通にスクリプトを実行したときは、 何もしないassert関数になって、 debug.sh script.sh みたいにしたら、 コード変換を行ってから実行すれば良いのか 意外と自然な感じで作れそうw
584 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 09:49:06.14 ID:8OkJCHKT0.net] assert失敗時に強制的に停止させるのはkill $$で行けるかな? サブシェル内でも一応停止できるようだけど
585 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 16:43:37.38 ID:lBOHSSIo0.net] 色々考えてくれてマジでありがたい 確かにassert()関数はデバッグの時だけ有効になればいいから外部からスクリプトファイルを操作するという方法も なんら不自然ではないな。 C言語のようにNDEBUG変数の有無によって処理を分けようとしてたけど そっちのほうが柔軟な処理ができるのでいいね。 ていうかC言語と違ってシェルスクリプトのなかで安全・確実に変数を取り扱うのは厄介だから 寧ろNDEBUG変数は害悪ですらあるなw
586 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 19:36:31.81 ID:8OkJCHKT0.net] >>585 何もしないassert関数と書いたが、コメントの形でassertを入れるのはどうだろう? これなら関数呼び出しすらないので、(わずかな)パフォーマンス低下も発生しないし 仮にスクリプト内でassert関数を使っていても問題ない assert有効時は、長い名前に変換すれば良い
587 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 19:38:01.66 ID:8OkJCHKT0.net] あと、デバッグモード、assert関数有効時だけど、終了ステータスを変えてしまうことに注意な foo() { false # assert [ なんちゃら ] echo $? } という場合、本来はechoで1と表示されるけど、単純にこのように変換してしまうと、 assert有効時に$?がassertの結果になってしまう だから変換後はこんな感じかな? ||:を使うことでset -e状態でも落ちなくできる foo() { false assertooooo 3 [ なんちゃら ] ||: echo $? } assertooooo() { EXIT_STATUS_BACKUP=$? LINE_NUMBER=$1 shift if "$@"; then return $EXIT_STATUS_BACKUP else echo "エラー $LINE_NUMBER" >&2 exit 1 fi }
588 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 19:42:53.17 ID:8OkJCHKT0.net] > 仮にスクリプト内でassert関数を使っていても問題ない ちょっとわかりづらかったな スクリプトでassertという名前の関数を別の用途で使っていた場合ってことね
589 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 19:44:37.42 ID:8OkJCHKT0.net] うぬ、ここはkillにするんだった else echo "エラー $LINE_NUMBER" >&2 kill $$ fi
590 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 19:49:50.91 ID:8OkJCHKT0.net] (ま、あとは . ドットコマンド で読み込んだ外部スクリプトはどうするか問題があるんだがなw)
591 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 20:03:55.71 ID:8OkJCHKT0.net] あー、バカだ assertooooo 3 [ なんちゃら ] ||: じゃなくて assertooooo 3 [ なんちゃら ] &&: だった 上はset -eでも落ちなくし、かつ終了ステータスを問答無用で0にする方法(エラーの時 : を実行する) 下がset -eでも落ちなくし、かつ終了ステータスはそのまま保つ方法
592 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 20:17:00.01 ID:lBOHSSIo0.net] >>590 例えば ファイルの名前がwhizprog.shだったとして test "$( ps -p $$ -o 'comm=')" = 'whizprog.sh' ↑これが失敗・失敗しないで判定できるんじゃね? 尤もこれはシバン#!/bin/shというPOSIX未定義の構文を使ったばあいで シバンを書いてないと使えない手だけど。
593 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 20:22:22.65 ID:8OkJCHKT0.net] >>592 ん? assert実行するためのソースコード書き換えの話だよ debug.sh script.sh で読み込んだ、script.shの書き換えは簡単だけど、 その script.sh から . コマンドで読み込まれるコードまでは書き換えられない だから . コマンドを検出して再帰的に・・・面倒なんだよなw 余談だが、 > test "$( ps -p $$ -o 'comm=')" = 'whizprog.sh' これはPOSIX準拠なのだろうが、busyboxではpsはwしか使えないw ps w
594 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 20:50:01.93 ID:lBOHSSIo0.net] >>593 ああなるほど そんなことまでは考えてなかった。 正直,あなたに教えてもらった方法で大満足です。ありがとう。(欲を言えば行番号を自分で……しつこいねw) とりあえずこんな感じに落ち着きました↓ #!/bin/sh assert() { exec >&2 eval "test ${2}" || { printf '%s: %d: %s\n' "${0}" ${1} "${3-"Assertion ${2} failed."}" exit 1 } } main() { set -eu umask 0022 export PATH="$( command -p getconf PATH ):${PATH}" assert 18 '"a" = "b"' && : exit $? } main "$@"
595 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 21:06:21.14 ID:8OkJCHKT0.net] update.sh script.sh でassert行の行番号を更新して上書き保存するってのもありかもw それなら.コマンドの先も対応できる。いちいち更新しないといけないのが面倒だけど
596 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 21:44:08.29 ID:lBOHSSIo0.net] 更新するコマンドを別に作るんじゃなくてデバッグ時に更新も行うようにすれば(結局 手間は同じだけど) だってデバッグする時ってその直前に必ず行番号やらを更新したいでしょう。
597 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 21:51:38.21 ID:wKJLu9V5a.net] だんだんそもそもやりたかったことから離れてる雰囲気だけは感じた
598 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 22:33:00.25 ID:8OkJCHKT0.net] >>596 まあ、そうなるよねw まあ、方針次第だな >>597 ようするに、シェルスクリプトの世界にもトランスパイラが欲しいって話さ ちなみにどれだったか忘れたがシェルスクリプトの文法を 解析するやつ(ASTを作る)はすでにある それを使えばそんなに難しくはないと思う(とは言えやったことはない)
599 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 23:15:08.44 ID:hLxIIZfE0.net] もうシェル自体に手を入れてデバッグモードみたいなのを実装した方がいいんじゃね?
600 名前:デフォルトの名無しさん [2018/11/10(土) 23:18:28.98 ID:7gTt1pZ+0.net] もうシェルでなにしたいんやおまえ
601 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 23:41:45.94 ID:wKJLu9V5a.net] シェルブリットバーストを撃ちたい
602 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 23:58:52.52 ID:lBOHSSIo0.net] >>599 一応POSIXでsh -xは定められてる
603 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 00:03:09.99 ID:Tyd11AGx0.net] sh -xまじ使えねぇ なぜ行番号を出すようにしなかったのか
604 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 00:16:53.30 ID:Tyd11AGx0.net] >>600 assertじゃないの?
605 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 00:30:20.21 ID:PRctJ18Z0.net] >>603 ほ ん と そ れ そして今調べて気が付いたがsh -xじゃねーなw set -xだわ。 > The -a, -b, -C, -e, -f, -m, -n, -o option, -u, -v, and -x options > are described as part of the set utility in Special Built-In Utilities. > The option letters derived from the set special built-in > shall also be accepted with a leading <plus-sign> ( '+' ) instead of a leading <hyphen-minus> > (meaning the reverse case of the option as described in this volume of POSIX.1-2017). pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html#tag_20_117_04
606 名前:デフォルトの名無しさん [2018/11/11(日) 00:55:22.01 ID:TQKm/8h90.net] >>604 なんでワイに聞くねんwバカなんかおまえ?
607 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 00:56:50.21 ID:AsOVz6G5M.net] それを質問の意味で受け取るとか日本語大丈夫?
608 名前:デフォルトの名無しさん [2018/11/11(日) 01:00:58.12 ID:TQKm/8h90.net] 日本語が大丈夫ってどおゆう意味や?
609 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 01:05:43.58 ID:Tyd11AGx0.net] おちつけ、今はまだ慌れるときじゃない。
610 名前:デフォルトの名無しさん [2018/11/11(日) 01:09:59.72 ID:TQKm/8h90.net] 慌れるて日本語あるんか?ちょっと落ち着けやw
611 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 02:43:07.51 ID:Tyd11AGx0.net] りっしんべんが余計だった
612 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 12:28:16.92 ID:PRctJ18Z0.net] C言語ではなくシェルスクリプトでシグナルって活用してる? kill(1)ユーティリティの-s KILLオプションくらいしか使ったことがないので いまいち便利さが分からない。 利用者定義シグナルSIGUSER1とか 使いこなせたらシェルスクリプトでできることの幅が広がりそう
613 名前:デフォルトの名無しさん mailto:sage [2018/11/11(日) 12:33:00.83 ID:Tyd11AGx0.net] CTRL-Cされたときとかプログラム終了時に 作業ファイルを削除することぐらいかなぁ あとはシグナルじゃないけど、bashの疑似シグナル ERRとかDEBUGとかで遊んだことある サービスなんかだとシグナル送ったら設定ファイル再読込したり ddだったら進捗状況表示したりするね
614 名前:デフォルトの名無しさん [2018/11/11(日) 22:34:54.73 ID:0F8Q4Ddx0.net] >>612 終了処理をちゃんとやらないといけないような処理の場合に trap 使ってシグナルに対して 特定の変数を 1 にするだけとか、そういうやり方で終了処理後にその変数見て 1 になって いたら exit みたいな感じでシグナル利用するな。 後は普通に kill で他のプロセス終了させたい場合。pkill 使う事もある。
615 名前:デフォルトの名無しさん mailto:sage [2018/11/12(月) 12:58:25.45 ID:JkRQG90v0.net] 実行してるシェルスクリプトに行番号を付けるのさ, PS4変数にn=$((n+1))みたいなのを入れてset -xとやればうまくいくかな と思ったんだが無理っぽいな。 どっかで無限ループして何も出力されないw
616 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 19:40:03.28 ID:0Ele5WZ80.net] 算術式のなかにコマンド展開を突っ込むのってPOSIX違反かしら echo $(($(< ./file.txt wc -l)-1))←こういうの。
617 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 20:47:22.69 ID:tvSD0Nan0.net] >>616 pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_04 これを読む限りは特に規定されてるようには見えない
618 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 15:25:56.02 ID:P8pvRdrO0.net] >>617 なるほど。今手元にあるGNU/Linuxでは普通に動くけど やめたほうがいいかもね。 Solaris 10とかで失敗しそう(使うことないだろうがw
619 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 15:29:13.15 ID:Da4Ohzbn0.net] えぇ・・・ 俺普通にこんなの使ってんだけど? value=$(( ${value:-0} + 1 )) 普通に展開されるんじゃないの?
620 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 16:18:09.15 ID:P8pvRdrO0.net] >>619 まあ俺も使い捨てのスクリプトでは使うけど ただPOSIX 2017では x=3; x=$((x+1)) ↑これすら正常に動くとは定義されてないんだよね ただ単に x=3のとき$((x))は$(($x))と「同じ値になる」とだけ。 だから例示されるスクリプトでも x=$(($x + 1)) みたいに書かれてる。
621 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 16:40:42.71 ID:Da4Ohzbn0.net] >>620 > x=$(($x + 1)) shellcheckではそれ不要だから外せって言われるよ? shellcheckが完璧だとは思わないけど、 あえてそうしてるんだからPOSIXだと思うんだけどなぁ
622 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 16:46:17.02 ID:P8pvRdrO0.net] >>621 shellcheckはそれに関しては間違ってると言えるな なぜなら もう言ったが pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01 ↑ここで x=$(($x-1))とはっきり書かれてるんだよ。
623 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 17:07:17.10 ID:Da4Ohzbn0.net] >>616 あ、大丈夫みたいだよ。 コマンドも展開されるって書いてある $((expression)) The shell shall expand all tokens in the expression for parameter expansion, command substitution, and quote removal.
624 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 17:18:05.78 ID:Da4Ohzbn0.net] あ、なるほど。わかった。 ${a} って書いたときの、aの部分が式なんだ。$は含まれない。それと同じで $((a)) もaの部分が式で>>623 に書いてあるように、先に展開される仕様だから $(($a))だと先に$aの部分が文字列として展開されて$((123))のように解釈される だから https://github.com/koalaman/shellcheck/wiki/SC2004 に書いてあるように > $ a='1+1' > $ echo $(($a * 5)) # becomes 1+1*5 > 6 これだと、式が評価される前に文字列として展開されちゃうから変な計算になるが > $ echo $((a * 5)) # evaluates as (1+1)*5 > 10 ${a}と同じように$((a))と書くと、ちゃんと算術演算が行われるんだ ということで、やっぱり$(($a))は間違いで$((a))が正しいようだね
625 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 18:02:30.17 ID:Da4Ohzbn0.net] 間違いっていうのは仕様違反って意味じゃなくて 算術演算をするなら$をつけないのが正しいって意味ね。 算術演算の前に$とかコマンドが展開されるっていうのも 仕様なのでそれも書いたとおりに動作する
626 名前:デフォルトの名無しさん [2018/11/14(水) 19:06:25.03 ID:vF6ts/2/r.net] 大きなファイルがいくつも入ったディレクトリのmvして分かったけど ファイルがいくつあっても全部のcpが終わったあとにrmされるんだね てっきり1ファイル毎かと思ってた
627 名前:デフォルトの名無しさん [2018/11/14(水) 19:23:07.48 ID:bryEJhFFa.net] >>626 途中で中止した時に移動先を削除するだけで済むからじゃないかな。
628 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 19:34:11.25 ID:P8pvRdrO0.net] >>625 んー。でも俺には > If the shell variable x contains a value that forms a valid integer constant, > optionally including a leading or , > then the arithmetic expansions "$((x))" and "$(($x))" shall return the same value. は$((x))の「時だけ」$(($x))と等しいと読めるがな。 いずれにしても算術展開で算術計算をする際に変数を使いたいときは $(( ($x) + 1 )) にしてるわ。どっかで$(( x + 1 ))がエラーになるのが怖いので。
629 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 21:35:28.76 ID:tEjpeAN9a.net] >>626 renameはアトミック操作にすべきって思想が強いから 違うファイルシステムにmvするときはそうだな
630 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 21:50:05.93 ID:D6nmDs23M.net] $(())が展開できるものは限定されていて、$((x+1))が意図通りに展開される根拠は$((x))と$(($x))が等しいって書いてある一文しかない。 これは$(())の中だけはx=$xであると解釈できなくもないけど、算術演算をするなら$をつけないのが正しいとは読めないな。
631 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 22:59:44.88 ID:Da4Ohzbn0.net] > $((x+1))が意図通りに展開される根拠は$((x))と$(($x))が等しいって書いてある一文しかない。 一つあれば十分じゃん。逆に展開されない根拠はないんだし そもそも ${expression} と $((expression)) という記述があるんだから expressionの中は同じ意味のはずだろう
632 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 23:06:12.49 ID:Da4Ohzbn0.net] > どっかで$(( x + 1 ))がエラーになるのが怖いので。 それがエラーになるなら、とっくに検出してるだろうな。 複数のシェルで確認してるからさ それ関連で注意が必要なのは $(($#-1)) zshだと81になる。
633 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 07:34:42.91 ID:CPG8nmHa0.net] >>631 いや算術演算するときは$をつけないのが正しいとは何処にも書いてないけど
634 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 08:48:01.92 ID:sJsqi8La0.net] というか,shellcheckでの検査結果うんぬんよりも本家POSIXの記述のほうが優先して考慮されるべきだと思うのだが。
635 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 10:49:23.03 ID:gWaB1LhD0.net] 本家POSIXに$((x))が動くと書いてあるだろ
636 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 11:23:09.13 ID:gWaB1LhD0.net] pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01 に書いてあるだろ > Arithmetic expansion provides a mechanism for evaluating an arithmetic expression and substituting its value. > The format for arithmetic expansion shall be as follows: > > $((expression)) > > The expression shall be treated as if it were in double-quotes, except that a double-quote inside > the expression is not treated specially. The shell shall expand all tokens in the expression for > parameter expansion, command substitution, and quote removal. まず、$(( )) の中にある。これがexpressionだ。 expand all tokens in the expression 式の中にある以下のトークンの展開、 for parameter expansion, command substitution, and quote removal. パラメータ展開、コマンド置換、クォートの削除 > Next, the shell shall treat this as an arithmetic expression and substitute the value of the expression. その次(Next)に この式を arithmetic expression (算術式)として扱う つまりだ。パラメータ展開( $(($x))の$xの展開 )が行われるまでは、まだ算術式として扱う前なんだよ そもそもだな。 x=123を見て分かる通り。変数名はxだぞ。$xじゃない。 他の言語では変数名が$で始まるものがあるが、シェルスクリプトにおいて、 $は、パラメータ展開、コマンド置換、算術展開等を行うための記号だって書いてあるだろ? 特殊変数の説明だって、$@じゃなくて@、$*じゃなくて*、$#じゃなくて#、$$じゃなくて$ と書いており 変数名とは最初の$は含まれない部分だってことが読み取れるだろ
637 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 11:44:50.73 ID:sJsqi8La0.net] >>636 そのすぐあとに x=$(($x - 1)) という記述があるんですが。 pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01
638 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:00:52.72 ID:gWaB1LhD0.net] >>637 あるからなんだよ? パラメータ展開が行われるから x=$(($x - 1)) は x=$((100 - 1)) となって動くだろうさ それは x=$((x - 1)) がだめな理由になってない
639 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:27:06.72 ID:sJsqi8La0.net] >>638 発端は>>620 の > > x=$(($x + 1)) > > shellcheckではそれ不要だから外せって言われるよ? > shellcheckが完璧だとは思わないけど、 > あえてそうしてるんだからPOSIXだと思うんだけどなぁ これなんだが。 つまりx=$(($x + 1))の「$x」が不要という主張は完全に間違いってことだ。 x = $(($x - 1))とx = $((x - 1))のどっちが正しいかなんて言ってねえよ。 ただ,POSIXには前者の記載はあって後者はないから, shellcheckの「後者にしろ」っていう判定は絶対におかしい。
640 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:34:01.42 ID:gWaB1LhD0.net] shellcheckは間違いだから不要と言ってるんじゃなくて、 意味がないから不要って言ってるんだよ。 お前コードチェックツールで変数が使われていませんって 指摘されたら、文法上は間違ってねーよって文句言うのかよ?
641 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:36:27.53 ID:zXViJGdda.net] ファイッ
642 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:36:35.34 ID:gWaB1LhD0.net] > shellcheckの「後者にしろ」っていう判定は絶対におかしい。 後者にしろって言う判定は、前者が間違ってるって話じゃなくて、 後者もOK、だから後者はPOSIX違反ではない(POSIX違反を提案するわけがない)って話だよ もうちょっと落ち着けよ。お前否定されたらすぐカッとなるだろw
643 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 12:41:58.45 ID:gWaB1LhD0.net] > つまりx=$(($x + 1))の「$x」が不要という主張は完全に間違いってことだ。 > x = $(($x - 1))とx = $((x - 1))のどっちが正しいかなんて言ってねえよ。 後者が動くのであれば >「$x」が不要という主張は完全に間違い という主張の方が間違ってる。 そして後者は実際に動く
644 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 13:09:09.63 ID:sJsqi8La0.net] 前者も実際に動くんですがそれは
645 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 13:35:59.93 ID:gWaB1LhD0.net] だから前者が動かないなんていてないだろ 前者に$(($x -1))の$xの$が意味がないから (POSIX準拠で問題がない)後者の方が良いって話であって たまにいるんだよな。誰かにより良いコードの提案をされたら 俺の書いたコードが間違っているっていうんか、仕様どおりだ!って怒るやつ 仕様違反だとか間違ってるかどうかの話なんかしてない (正しいコードの範囲で)より良いコードにしましょうってことなのに
646 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 14:51:03.70 ID:sJsqi8La0.net] すまん。怒らせるつもりは毛頭なかったんだわ。 ただ,「標準でははこうなってますよ」と示しただけ。 まあちょっと俺の言い方もキツかったな。 言い訳させてもらうと,今までPOSIXの仕様書も読まずに $(())算術展開は``に書き改めるべきとか,その割に[[文を使ってたりだとか そういう人間と多く議論してきて,こっちもかなり厳密さを求めるようになってしまっていた。 正直なところ仕様違反でもほとんどの環境で動くなら,別にそっちを使ってもいいかもね。
647 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 14:58:36.45 ID:gWaB1LhD0.net] だから仕様違反じゃないつってるだろうが なんでこいつ理解能力無いんだろう? 冷静なふりして、冷静じゃないだろ
648 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 15:08:37.91 ID:gWaB1LhD0.net] $(($x - 1)) と $((x - 1)) のどちらも仕様違反じゃないのに $(($x - 1)) が動くってことは、 $((x - 1)) は仕様違反に違いニダ!って どういう思考回路なんだろ? $(($x - 1)) と $((x - 1)) は前者が先に$xのパラメータ展開が行われるため動作に違いがある https://github.com/koalaman/shellcheck/wiki/SC2004 に書いてあるとおり。 それはおそらく意図しないものだろうから警告される。 お前がPOSIXの仕様を読んでいない相手と議論してきたとか知らんが、 お前なんかよりも shellcheck の作者の方がよっぽどPOSIXの仕様に詳しいだろうよ なにせシェルスクリプトの構文解析機を作ってるし、 世界中から間違いがあったら指摘される立場にあるんだから
649 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 20:59:56.50 ID:8sDmawlrM.net] またvoid君かよ
650 名前:デフォルトの名無しさん [2018/11/16(金) 18:15:57.23 ID:4Z/2Zn+la.net] Windows用の busybox.exe なんてものがあることをたった今知った。 こんなのあったんだな。 まあしかしよくよく考えてみればWindows用のgccとかのコンパイラでコンパイルすれば良いだけだからさほど凄いことではないか。
651 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 20:52:55.20 ID:0Fk/0vf10.net] case "$(<なにかの処理>)" in 'A'|'aaa') echo 'B' ;; *) echo "$(<なにかの処理>)" ;; esac みたいな文でさ,<なにかの処理>を(できれば変数とか使わずに)一つにまとめたいんだけど できるかな。 "$(<なにかの処理>)"の結果が'A'か'aaa'の時のみ'B'を出力して,それ以外の場合はその処理のまんまを出力したい。 RESULT="$(<なにかの処理>)" case "$RESULT" in 'A'|'aaa') echo 'B' ;; *) echo "$RESULT" ;; esac でもいいんだけどな〜んか無駄がある気がするんだよね……近い場所で二回同じ変数使ってるっていうのが。
652 名前:デフォルトの名無しさん [2018/11/16(金) 21:08:59.95 ID:4Z/2Zn+la.net] 気のせい
653 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 23:08:25.02 ID:pv33BTTMM.net] 算術展開で$付けるのはナンセンスだからやめたほうがいい
654 名前:デフォルトの名無しさん [2018/11/16(金) 23:43:45.38 ID:HodhQ/sE0.net] いい感じのバカっぽさw
655 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 00:11:39.03 ID:dLBGWOhBM.net] >>654 お前の書き込みがな
656 名前:デフォルトの名無しさん [2018/11/17(土) 00:41:14.93 ID:eQWBxdMf0.net] なんか悔しかったんかなw
657 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 01:07:52.12 ID:LhPQgZnG0.net] >>651 変数を使わないの書き方の基本の一つは引数(パラメータ)を使うことだよ 引数を変数の代わりとして使う。そのやり方に2パターンある ・パターン1 関数を作る(呼び出し先の関数の引数にする) foo() { case "$1" in 'A'|'aaa') echo 'B' ;; *) echo "$1" ;; esac } foo "$(<なにかの処理>)" ・パターン2 引数を再設定する(自分自身の引数にする) set -- "$(<なにかの処理>)" case "$1" in 'A'|'aaa') echo 'B' ;; *) echo "$1" ;; esac パターン2はこのままだと自分自身の引数がなくなってしまうが、 set -- "$(<なにかの処理>)" "$@" とすることで、残しておくことが可能。以降は引数の番号をずらして 扱うかshiftで元に戻すなりするか、引数の個数が固定なら、 set -- "$@" "$(<なにかの処理>)" と逆にしてもよい 余談だが、そんなコードを書くぐらいなら素直に変数を使えばいいと思うかもしれないが、 シェルスクリプトの変数がグローバル変数なのに対して、 引数は(レキシカルスコープ的な)ローカル変数になってるという重要な違いがある localやtypesetを使った変数のローカル化はダイナミックスコープなのでそれとも違う
658 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 01:38:27.92 ID:dLBGWOhBM.net] >>656 お前が?w
659 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 09:28:35.93 ID:XLrbbNN30.net] >>657 setって便利だよね 関数の最初に set -- $? "$@" として最後に return $1 とすれば終了コードも保存できるし。
660 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 18:51:09.82 ID:ikDL4PRg0.net] ちょっと力を貸してほしい https://paste.ubuntu.com/p/hx6cFRKJKm/ 今、↑こういう引数処理を書いている。 動作としては $ ./argprs.sh -abc VAR -pqr FILE --long-opt --opt-req-par="foo bar" -- --not-opt 短いオプション1: a; 'VAR' 短いオプション2: b 短いオプション3: c 短いオプション4: p 短いオプション5: q 短いオプション6: r 被演算子1: FILE 長いオプション1: long-opt 長いオプション2: opt-req-par; 'foo bar' 被演算子2: --not-opt こういう出力ができるはず。つまり-aと--opt-req-parはパラメータを取って、--以降はオプションとして解釈されないっていうやつ。 ところが俺の知識量では短いオプションを解析する部分をすごく冗長にしか書けない。いちいちループを回すせいで遅いし。 動作自体はこれでいいので、短いオプションをもうちょっとうまく解析する方法とかないかな。
661 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 19:14:04.69 ID:DG9kgnl30.net] なんで、aのあとにVARくるんだ? 仕様がおかしくないか? VARが単体の値もしくは、-cの値っていうのならまだわかるんだが
662 名前:デフォルトの名無しさん [2018/11/17(土) 19:19:32.18 ID:eQWBxdMf0.net] エクセルマクラーと同じ病気やね
663 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 19:49:25.15 ID:DG9kgnl30.net] tarで試したが、これで動くのかよ・・・ tar czvf a.tar.gz a tar fczv a.tar.gz a パラメータ取る短いオプションが複数あったとき どう解釈するのが普通なんだろ
664 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 20:09:39.20 ID:DG9kgnl30.net] getoptやgetoptsは短いオプションがパラメータを取るとき、 短いオプション以降がパラメータとみなされるようだ -abcde で cがパラメータを取るとき、 -a -b -c de と解釈される 実装によってバラバラなのは当然だろうが こっちのほうが楽だろうな >>660 の仕様だと、aとcがパラメータを取るとき -abcde VAR をどう解釈して良いのかわからない -abcde VAR1 VAR2 とすりゃいいのかもしれんが、 これは人間にとってわかりやすいんだろうか?
665 名前:デフォルトの名無しさん [2018/11/17(土) 20:18:41.59 ID:eQWBxdMf0.net] バカは考えるだけムダやぞw
666 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 20:23:56.08 ID:UtANxJrV0.net] >>663 tarはハイフン無しでオプションを書くといい感じに並べ替えてくれる
667 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 20:45:00.33 ID:ikDL4PRg0.net] つまり -aVAR -xyza VAR みたいなのは許容して -axyz VAR は許容しないようにすればいいのかな。 まあ結局一文字オプションを扱う方法はくっそ遅いルーチンなのだがw
668 名前:660 mailto:sage [2018/11/17(土) 21:16:27.44 ID:ikDL4PRg0.net] こうしてみました。 短いオプションの解析ルーチンの遅さは改善してませんが 値を取るオプションの解釈を皆さんから提示された方式に変えました。 https://paste.ubuntu.com/p/n7m8qZHwMb/
669 名前:デフォルトの名無しさん [2018/11/17(土) 21:33:05.69 ID:eQWBxdMf0.net] >>668 提示てwバカにされとんのやぞおまえw
670 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 22:38:36.24 ID:ikDL4PRg0.net] こういういったシェルスクリプトを書くの大変なので自動的に生成してくれるのがあればいいですけどね。 Pythonのdocoptみたいな。
671 名前:デフォルトの名無しさん [2018/11/17(土) 22:57:50.85 ID:eQWBxdMf0.net] >>670 そういったシェルはそもそも必要とされとらんのやぞ 出来るからといってやりすぎになるのはバカの悪癖やw 改めた方がええでおまえw
672 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 23:25:40.65 ID:4Do7jDVB0.net] ふつーに、getopts でええやん! 入力補完を使ったら、別にコマンドが長くてもわかりやすさ優先でかまへんわ。
673 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 23:58:26.07 ID:2WlUsnTW0.net] Ruby にも、OptionParser, ARGV.getopts などのモジュールがあるので、自作などしない
674 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 00:47:33.69 ID:tOYW/MHy0.net] >>667 遅い原因はcutを使うからなんだけどねw >>668 __cnt_opd__のせいでごちゃごちゃしてる。 なんに使ってるかと思ったら、番号出してるだけだよな? オプションは普通順番には依存しないので最終的には不要なはずだ。 逆に分かりづらくなるから、こういうのは書かないほうが良いぞ もしくはその部分を関数に分離してそっちでカウントするとか あと並べ替えてもいいんだな >>670 よし、作るんだ! >>673 作者「なかったから自作したんやで」
675 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:05:23.45 ID:tOYW/MHy0.net] >>668 とりあえず邪魔なんで、本質的なコードと、どうでも良いコードは分けた https://paste.ubuntu.com/p/DRf6Nzz8kM/
676 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:17:46.87 ID:tOYW/MHy0.net] 余計な変数を消したり、被演算子の部分を外出ししたりした https://paste.ubuntu.com/p/p7VwzJZ8Hv/ あとオレがリファクタリングするときによくやるんだが、 (他人の)リファクタリングする前のコードは長いことが多い 全体を把握しやすくするためにあえて一行にしたりして短くしている。 最終的にこのような書き方をするというわけではなくて一時的な処置
677 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:19:40.72 ID:tOYW/MHy0.net] あと、これもしたな。こんな部分、あとでどうとでもなるんだからここでやることじゃない 長いオプション1: long-opt 長いオプション2: opt-req-par; 'foo bar' ↓ 長いオプション1: --long-opt 長いオプション2: --opt-req-par; 'foo bar'
678 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:21:35.58 ID:dx8aUZPH0.net] caseの後の変数はダブルコーテーションで括らなくていいって知ってた?
679 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:26:08.97 ID:tOYW/MHy0.net] 長いオプションの部分をフラットにした。 https://paste.ubuntu.com/p/Y4nTQBnTFw/ あとはクソめんどくさい一文字の部分だな。 どうするか考えとらんのだがw 仕様は変えるかもしれん。
680 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:27:00.28 ID:tOYW/MHy0.net] >>678 うん。だから徐々に消してるよw
681 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 01:28:24.11 ID:tOYW/MHy0.net] あ、いくつかパっと見でわかるミスがw まあ途中のコードは参考だから 俺がどうやってリファクタリングしているか
682 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 02:04:33.63 ID:tOYW/MHy0.net] とりあえずは大まかな仕様は変えてない https://paste.ubuntu.com/p/SQFnqmCJs2/ 変数をなくそうか、でもそうすると再帰ありの関数を追加するか setを使わないといけなくてごちゃごちゃする。 いろいろ悩んだがとりあえずそのままにしている。 cutの呼び出しはなくしたので速くなってるはず。 といっても、この程度だとLinuxなら体感できないはずなんだがWSLでやってる? 1文字オプションの分解の所がやはり面倒だな。 知らないオプションはエラーにするようにすれば、 1文字を抜き出す必要はなくなるかもしれないが
683 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 02:13:58.54 ID:tOYW/MHy0.net] >>670 > Pythonのdocoptみたいな。 あと一応あるで https://github.com/docopt/docopts goバイナリでオプション解析して、シェルスクリプトで evalできるコードを出力して、そのコードで環境変数を 設定するという仕組みで、純粋なシェルスクリプト実装ではないけど
684 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 02:21:13.13 ID:tOYW/MHy0.net] ちなみにオプション解析の部分は一般的に最初に一回だけ行う部分なので 被らないようにしたり、無理して変数をなくす必要はないんだけどね
685 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:17:51.79 ID:Fz4U8sel0.net] >>674 オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。 rm -i -f としたときに「確認する」のではなく「強制的に消し」たいので。 alias rm='\rm -i' の状態でrm -fとしたときは確認オプションが有効になるんじゃなくて強制的に消去したいよね?
686 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:19:37.66 ID:Fz4U8sel0.net] >>682 エスパーかな? その通り。WSLでやってる。なるほどLinuxネイティブではcutを一文字ごとに呼び出しても十分早いのかな?
687 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:23:02.81 ID:Fz4U8sel0.net] 連投すまん。 ちなみにどうやら汎用性のあるシェルスクリプトではローカル変数というのはsetを使わない限り実現できないようで, そしてsetは今まさに解析すべき引数郡がが格納されているので安易に書き換えられない。 だからPythonの慣例を参考にして前後にアンダースコアを二つ続けて(無意味だけど)ローカル変数であることを示してるつもり。
688 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:35:21.66 ID:Fz4U8sel0.net] ${numbar:-0}←これすごいアイデアですね。 シェルスクリプトの冒頭でnumber=0とかで初期化しなくても、 「カウンターを初期化するのは値が設定されてないときである」ことを利用して変数展開を行なうのか。
689 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 17:59:50.57 ID:tOYW/MHy0.net] >>685 > オプションの番号は,競合するオプションが指定された時に後者を優先する目的です。 それなら変数に入れておけば良いんだよ。 競合するオプションなら、変数を同じにしておけば良い 基本的に「オプションの解析」では変数に値を入れるのみ その場で処理はしない。変数に入れた値が後者で上書きされるから 必然的に後者が優先される > その通り。WSLでやってる。なるほどLinuxネイティブではcutを一文字ごとに呼び出しても十分早いのかな? time dash -c 'i=0; while [ $i -lt 1000 ]; do echo a | cut -c 1 > /dev/null; i=$((i+1)); done' Linuxでこれを実行すると約1秒。WSLでこれを実行すると15秒。fork(サブプロセス生成)が行われるとこれだけの差がでる 元々forkは遅いのだが、WSL上だと更に輪をかけて遅くなるのがわかる これをforkなしのシェルだけで実行できる同等のコードに置き換えるとWSLで50ミリ秒に減る。Linuxだと20ミリ秒にへる time dash -c 'i=0; while [ $i -lt 1000 ]; do v=abc; v=${v%"${v#?}"}; echo $v >/dev/null ; i=$((i+1)); done' もっともforkなしのコードは万能ではなく、文字列の最初の一文字を取るために「文字列の最初の一文字を取り除いた残り」を 求めてから、全体から抜き取っているために、文字列が長くなると極端に遅くなる。 文字列を1文字ずつ処理するコードを書いたとして、1000文字〜1万文字程度が限界。(数秒〜数十秒かかる) それ以上の長さの文字列を1文字ずつ処理するコードを書くならsedあたりで1文字ずつに分解して処理したほうが良いだろう POSIX準拠しなくていいなら${v:0:1} を使ったほうが速いと思う(計測はしてない) だけど一般的なオプション程度の長さであれば十分速い。少なくともcutを使うよりも遅くなることはないだろう
690 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 18:05:11.85 ID:tOYW/MHy0.net] >>668 今回は長いコードが邪魔だったので使ったけど、 例えばnumberが環境変数としてexportされていたりしたら おかしいことになるので最初に初期化するほうが良いけどね 毎回パラメータ展開してるからわずかとはいえ遅くなるだろうし それよりも、所見では使い道がわからない ${var:+value}の方が凄いアイデア シェルを作った人はよくもまあこんな応用例が 高いものを作ったもんだと思うよ
691 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 23:06:30.15 ID:Fz4U8sel0.net] test <string>は<string>が非空に限り成功するのね。これも知らんかったわ……。
692 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 17:53:42.80 ID:OLor19Fe0.net] しつこくてすまん。 シェルスクリプトの引数解析の話なんだが (-cが引数を取るオプションとして) 「$ somecmd -c -- --not-a-opt」 っていうコマンドラインにおいて, ・「--」を-cオプションの引数として見るか ・「--」はいかなる場所(オプションの引数の位置だとしても)においても 以降が被演算子であることを示すものであると見るか どっちが自然だろう。GNU getoptは前者の解析結果を出すけど恐らく内部的には後者の解釈で エラーになる。
693 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 18:33:47.11 ID:UM5ff+tU0.net] 引数取るなら何であれ引数に決まってるだろ どうでもいいけどさ、その被演算子ってのやめてくんない? 演算子なんて登場してないんだから
694 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 18:55:25.78 ID:OLor19Fe0.net] operandって被演算子のことだと思うんだけど。 まあ「--」を引数と見るってことね。ありがとう。
695 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 19:16:12.30 ID:UM5ff+tU0.net] だからそのoperandが出てこないって話
696 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 20:33:17.21 ID:cLxfY5McM.net] operand https://wa3.i-3-i.info/word13306.html
697 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 21:01:13.07 ID:UM5ff+tU0.net] >>696 はい。どうも。 exprとか引数が何かしらの式であるものは 演算子以外の部分が被演算子(オペランド)になることはありえるけど なんでもかんでもオペランドなわけではないよね
698 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 21:31:00.38 ID:OLor19Fe0.net] ああ。ほんとだ。The Open Groupの文書を参考にする限り somecmd -c XXX FILE とあった場合被演算子はFILEでXXXはオプション引数だね。勘違いしてた。
699 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 12:14:20.49 ID:I8hvszb00.net] Qiitaで知ったけどこの構文便利だね。 ${VAL+:} false ↑これで$VAL変数が空文字だろうが定義されてさえいれば真,そうでなけば偽。 今まで[ -n ]と[ "x$VAL" = "$VAL:-x" ]とか組み合わせてたけどこれでスッキリ解決。 コマンド呼び出しも少なくなるから微妙に処理速度も上がるだろうし。 ただ難点は,test構文を用いた方法より遥かに難読になること。${VAL+:} false←これで何をやってるかなんて注釈がないと分からん。
700 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 12:41:53.30 ID:emfrr2Lm0.net] >>699 なんだそりゃ? 相変わらずのQiitaクオリティなのか? 変数が定義されているかの一般的なチェック方法はこれだろ? [ "${VAR+1}" ]
701 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 14:04:21.10 ID:jPqivsUqa.net] 定義されてるかどうかってどういう時に用いるんだ C言語やってた頃は二重インポート防ぐためとかやってたけど同じような感じ?
702 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 14:31:59.62 ID:I8hvszb00.net] >>700 「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな? いずれにしてもコロンコマンド(と変数展開)がシェルのビルトインとしてPOSIXで定められているのに対して testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。 外部コマンドを呼び出すのとシェルの内部でコマンドを展開するとでは後者のほうが早いよ。 君にとっては「Qittaクオリティ」でも,速度が優秀なのは君が提示したほうじゃなく「Qittaクオリティ」の方。
703 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 14:49:43.89 ID:I8hvszb00.net] dashでも[はシェル組込だね。実際testユーティリティを外部コマンドに頼ってるシェルって今現在存在しているのだろうか。 Heirloom shellあたりだとありえそう(試してないけど)
704 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 15:54:11.31 ID:emfrr2Lm0.net] > 「一般的」かどうかは知らない。それともその形式がより多く使われているという根拠があるのかな? ぐぐればコレばっかり見つかるはずだが? > testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。 全てのシェルで [ はビルトインだ シェルに組み込まれていないというものがあれば教えてくれ
705 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 16:18:05.53 ID:emfrr2Lm0.net] falseコマンドはPOSIXでシェルのビルトインではない もっともどのシェルでもビルトインになっているが
706 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:26:54.56 ID:I8hvszb00.net] >>704 > ググればこればっかり ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。 > 全てのシェルで[はビルトイン test(1)ユーティリティは,あくまでPOSIXにおいて組込ユーティリティじゃないという話。 根拠はこれ: pubs.opengroup.org/onlinepubs/9699919799/idx/sbi.html > シェルに組み込まれていないというものがあれば教えてくれ ご査収ください→https://www.unix.com/man-page/v7/1/sh/#neo-man-page-output
707 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:36:50.26 ID:b7tmfxF40.net] >>706 falseがビルトインって話じゃなかったの?w
708 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:38:22.47 ID:b7tmfxF40.net] > ほう,それは知らなかった。pws=0にしたGoogle検索英語版では${VAR+:}が多いように見受けられるな。 "${VAR+:}"で検索したけど5件しかなかったよ? "${VAR+x}"だと約 3,410,000 件
709 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:41:59.00 ID:I8hvszb00.net] ちなみに「すべてのシェル」と言うくらいなのだから, 主要でありPOSIX互換を謳うGNU Bash, Zsh, Debian Almquist shell(dash), yash, MirOS ksh(mksh)くらいについては知らべてるとは思うものの, POSIXの記述を知らないようなので, 一応,これら5つのシェルがtest(1)ユーティリティを組込コマンドにしているという根拠を以下に挙げておこう。 GNU Bash: https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins Zsh: zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html#Shell-Builtin-Commands dash: man7.org/linux/man-pages/man1/dash.1.html yash: https://yash.osdn.jp/doc/ja/#alpha-order mksh: https://www.mirbsd.org/htman/i386/man1/mksh.htm
710 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:44:33.96 ID:I8hvszb00.net] >>707 以下>>704 の書き込みを引用 > > testコマンドはPOSIXにおいては外部コマンド。尤もBashやZshではシェルに組み込まれてるけど。 > 全てのシェルで [ はビルトインだ > シェルに組み込まれていないというものがあれば教えてくれ ということでfalse(1)ユーティリティの話ではなく test(1)ユーティリティがシェル組込みかどうかという話でした。
711 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:47:23.27 ID:I8hvszb00.net] ちなみにfalse(1)ユーティリティもPOSIXにおいてシェル組込みとして定められている訳ではない。
712 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:49:01.92 ID:362BcdsM0.net] となると処理速度的にはどっちが良いの?
713 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:50:38.66 ID:b7tmfxF40.net] いや、俺が言ったことを復唱されてもこまるんだがw ちなみにビルトインかどうかはPATHを空にして実行できるかどうかでわかるよ builtinやtypeがないシェルもあるからね
714 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 17:51:02.76 ID:b7tmfxF40.net] >>712 大差なし
715 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 18:05:17.83 ID:I8hvszb00.net] >>712 大差ないけど,ただ,もしもPOSIXで定めらていないのを理由にしてtest(1)ユーティリティを組み込んでいないシェルがあったとして そのシェルにおいては変数展開(これは確実にシェルが仕事する)のほうがtest(1)ユーティリティをforkしてexecするより若干早いので 速度は${VAR+:}のほうが上。
716 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 18:06:48.53 ID:I8hvszb00.net] >>713 typeはPOSIXで定められているので,もしないシェルがあればPOSIX互換ではない。 つまり「ビルトインコマンド」なんていう概念はないかもしれないので,そんなことを調べるのは無駄に思えるな。
717 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 19:13:13.38 ID:b7tmfxF40.net] へー、poshはPOSIX互換じゃなかったのか >Debian Policy に準拠した普通のシェル >posh は、pdksh の軽装版であり、Debian ポリシーの準拠を目指し、 いくつかの特別な機能を付け加えたものです。 > >警告: Debian の /bin/sh スクリプトの多くは、実際はポリシーに準拠していると は限りませんので、 >posh を /bin/sh として使うと破損箇所が判明するかもしれま せん。 って書いてある割に大したことないな
718 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 20:44:49.31 ID:I8hvszb00.net] まあ ここまでPOSIX POSIX連呼しときながらアレだけども, 別にシェルってPOSIX shに準拠してる必要性なんてまったくないよなw poshも「POSIX互換じゃないシェル」として,便利に使えるようになればそれでいい。 実際,俺は使っていないものの,同級生にはfishを勧めてる。
719 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 20:55:10.29 ID:32uSmIhta.net] ポジクッス警察がいるから多少はね?
720 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 20:57:06.31 ID:b7tmfxF40.net] それじゃ俺も言っておかなきゃいかんのか? まあ ここまでPOSIX POSIX連呼しときながらアレだけども, 別にシェルってPOSIX shに準拠してる必要性なんてまったくなくて POSIXに準拠していなくても、現実にPOSIX互換の標準シェルとして デフォルトシェルで採用されているのであればそれに対応すべきだと思っている だから、dash、(busybox)ash、bash、ksh あたりは対応必須で zsh、posh、yash、あたりは優先度が低い。mksh、pdkshは デフォルトシェルとして採用されている事例があるのかわからんが
721 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 20:58:50.94 ID:b7tmfxF40.net] 俺は現実主義なんでね。標準とか仕様がどうこうよりも 現実としてそれは選択肢にならないのであれば、選択肢にならないし 非標準でも選択肢としてなり得るのならそれを使う
722 名前:デフォルトの名無しさん mailto:sage [2018/11/24(土) 23:48:23.42 ID:u7Q7GReoM.net] ポジコレ棒で葬ってやんよ
723 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 07:40:30.00 ID:rsPEFWOD0.net] もっと面白い書き込みして、どうぞ。
724 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 12:05:00.87 ID:Yow09MRJ0.net] >>715 その前提条件で言えば false も組み込みじゃないかもしれないのだから同じじゃないの? 変数が定義されていれば false は実行されないけど、未定義かどうかを確認したいから 実行するわけで。 ただ、fork and exec に関して言えば test コマンドが 1.1ms, false コマンド は 0.8ms 程度 (コマンドバイナリのテキストセクションがメモリキャッシュされている場合で、実行環境は Intel Xeon E3-1220 3.1GHz/Linux kernel 4.15.0/glibc 2.27)。何千回も実行する様なケース なら違いが分かるかも。
725 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 12:16:11.88 ID:wMoGqmE60.net] POSIXでビルトインの方が速いって決まってるんだっけ?
726 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 12:29:43.54 ID:nRWf72Y30.net] >>725 外部コマンドはforkが発生するから結果的にビルトインの方が速い
727 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 12:32:22.92 ID:wMoGqmE60.net] いやPOSIXでどうなっているかの話だよ
728 名前:デフォルトの名無しさん [2018/11/25(日) 13:54:00.21 ID:eaHucPl10.net] なんやこのバカwwww
729 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 14:01:17.29 ID:nRWf72Y30.net] >>727 下のページをざっと見る限り規定されてないように思う オーバヘッドがある分遅いのは自明だからPOSIXが云々は関係ない話だとは思う pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
730 名前:デフォルトの名無しさん mailto:sage [2018/11/25(日) 18:36:53.00 ID:74eaLfxV0.net] 多分,なんでもPOSIX POSIXと言うので,からかってやろうとしたんだろう。 「お前の主張は全部POSIXに起源があるのか?」ってな。 まあ結果としてはネタにマジレスの嵐だった訳だがw
731 名前:デフォルトの名無しさん [2018/11/26(月) 12:25:16.95 ID:RdZe26lCr.net] 必死すぎる言い訳のせいで逆にひかれてしまったパターンw
732 名前:デフォルトの名無しさん [2018/11/26(月) 12:32:05.28 ID:mqDjQZG/M.net] とっても惹かれます
733 名前:デフォルトの名無しさん mailto:sage [2018/11/26(月) 12:44:40.04 ID:sgq1LDCF0.net] スプラッターやめろ
734 名前:デフォルトの名無しさん mailto:sage [2018/11/26(月) 17:46:57.26 ID:M+tccdiG0.net] echoでログを残そうとしています。 echo "メッセージ" > ログファイル で、ログファイルはNASに保存しようと考えているのですが NASがなんらかの原因で見えない場合、bashだと無視して処理を続けるのに cshだと、echoのとこで止まってしまいます。 止まらないようにする方法とかないですか?
735 名前:デフォルトの名無しさん mailto:sage [2018/11/26(月) 20:45:32.63 ID:dIk0IZ2NM.net] >>734 その「何らかの原因」を解決するのが先決じゃねーの? 素知らぬ顔でログ残ってないならそこで止まってもらった方が良くね?
736 名前:デフォルトの名無しさん [2018/11/27(火) 00:51:26.43 ID:IxTjeZ9T0.net] >>734 NFSならマウントオプションである程度はなんとかなるのでは? Windowsの共有(cifs)の場合は知らない。しかし何かオプションあると思うけどね。
737 名前:デフォルトの名無しさん mailto:sage [2018/11/27(火) 02:59:30.28 ID:vfcz+SK40.net] なぜかアホの子ってnfsをローカルファイルシステムと同様に信用しちゃうよね
738 名前:デフォルトの名無しさん mailto:sage [2018/11/27(火) 07:15:38.13 ID:EYppSGpIM.net] 唐突にお前の仲間の話しされても困る
739 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 08:43:07.23 ID:lgqPOMnJr.net] >>737 信用ってのは常につながると思っちゃうってこと? それはいかんね
740 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 09:03:44.81 ID:6Gc6vrWs0.net] NFS特有のエラーがあるとは思いもしなかったりするんだよな。 挙げ句の果てにファイルロックがうまく動かないとか言い出す。
741 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 12:41:41.17 ID:V/2Czdkr0.net] 所詮、ネットワークを介したファイル共有だからね ディスクはアクセスできない = 故障 と考えていいけど ネットワークは一時的な切断やエラー、大きな遅延が想定される だからリトライやタイムアウトといった処理を行う 通常のディスクアクセスを行うコードは、こういった ネットワーク特有の事象について考慮されてない場合が多い だから(NFSの設定により)ネットワーク通信が正常に完了 できるまで待ち続ける(プログラムはタイムアウトしないのでフリーズした状態) もしくは一時的な接続不良でエラー終了したりする
742 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 20:10:37.32 ID:N04UITTm0.net] シェルスクリプトの関数の名前の直後の括弧って あれはshに 「これは関数の名前ですよ」って教えるためのものっていう認識でOK? foo() { echo foo } ↑こういうのの「()」。なんかCやらと同じように引数の指定とかができたらいいのにと 初心者ながら思ったんだけど そういう訳でもなさそうだし。
743 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 20:12:50.29 ID:aLWNsKMba.net] えっ
744 名前:デフォルトの名無しさん [2018/11/28(水) 20:22:26.38 ID:wHjpMIAFa.net] 引数は $1, $2 とかで受け取る。 呼び出す側は普通のコマンド実行のように書く。
745 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 20:31:09.87 ID:Vqd4vFOqM.net] >>742 ともかく ( とか、普通使わない文字を挟んでおかないと、 foo { だとただの引数になっちゃうから。
746 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 13:01:23.15 ID:Msn7clch0.net] >>745 なるほど。 「(」はサブシェルの開始だと思ってたけど そうでもないんだね……。 シェルの構文ってちょっと難しいことすると途端に複雑怪奇になるな(俺の頭の問題かも知れんがw) 対話的な利用を前提にした設計だから仕方無いとは言え、Pythonみたいに対話状態でもバッチ状態でも扱いやすくできなかったのかな。
747 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 13:04:56.47 ID:lCOis1qI0.net] 小学生が政治語ってるのを聞いてる気分だ
748 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 14:34:26.85 ID:Msn7clch0.net] 「どうして解散するですか?」
749 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 15:57:37.21 ID:QFUJhwUI0.net] Python を使えばいいんじゃないかな
750 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 16:07:41.49 ID:lCOis1qI0.net] Pythonは構文が複雑怪奇すぎる かっこは関数呼び出しの引数の開始だと思っていたのに 関数を定義するときにも使うらしい とかいうだろうな
751 名前:デフォルトの名無しさん [2018/11/29(木) 16:11:55.77 ID:qd4rCcG0M.net] wwwww
752 名前:デフォルトの名無しさん [2018/11/29(木) 19:19:50.88 ID:8tueZiBHa.net] そしてあらゆる言語が気に入らず、新たな言語がまた一つ作られるのであった。
753 名前:デフォルトの名無しさん [2018/11/29(木) 19:39:24.56 ID:qd4rCcG0M.net] − 世界には1,400もの競合するプログラミング言語があった − 「1,400だって!? バカげてる! み全ての用途をうまくこなす統一言語の開発が必要だ!」 「そのとおりだわ!」 やがて… − 世界には1,401もの競合するプログラミング言語があった − https://imgs.xkcd.com/comics/standards.png
754 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 20:23:55.28 ID:DaeVxseX0.net] >>753 男女の仲違いでもう2個増えるんだろ?
755 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 20:25:46.41 ID:dRsmoy+za.net] 新しいのを作るんじゃなくて既存のを潰さないとな
756 名前:デフォルトの名無しさん [2018/11/29(木) 20:45:38.03 ID:C+POVdju0.net] (中二なんかな・・・)
757 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 21:43:22.71 ID:Msn7clch0.net] 中二だろうがなんだろうが良いソフトウェアを作ってくれればそれでいい。
758 名前:デフォルトの名無しさん [2018/11/29(木) 22:17:13.73 ID:C+POVdju0.net] >>757 そおやってすぐ他人に頼ろうとするからいつまでたってもクズなんやおまえ
759 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 01:40:39.33 ID:ZZJKHSVT0.net] ワロタ
760 名前:デフォルトの名無しさん [2018/11/30(金) 08:21:31.28 ID:ShAjvwZw0.net] 目的を見失ってるよね 道具であるはずの言語そのものを作り出すってのは だからって、なんでもアセンブラってわけにもいかないが
761 名前:デフォルトの名無しさん [2018/11/30(金) 09:15:03.33 ID:vx8Iixcxa.net] タイヤは永遠に発明され続ける。
762 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 09:32:04.72 ID:n+1J2GMZa.net] (車輪じゃね?)
763 名前:デフォルトの名無しさん [2018/11/30(金) 09:38:04.79 ID:vx8Iixcxa.net] あ、そうか。まあどっちでもいいが。
764 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 09:40:18.92 ID:5+dLrTA80.net] 現代だって刀鍛冶とかいるじゃん
765 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 09:53:55.88 ID:pEng5xY00.net] 発明、改良と生産は違う タイヤ、車輪で行われてるのは、発明ではなくて生産 発明こそ行われなくとも、小規模な改良は続いている 刀鍛冶も生産だろう。改良している人がいるのかは知らんが。 様々なデザインの洋服など、改良しているわけじゃないが 新しいものを作るっていうのはなんというべきだろうね 生産なんだが古い、新しいという概念はある。 だけど好みの違いでしか無いので改良とも違う 多くのものは改良されて続けているが、改良するためには まず生産能力が必要。同じものを作れなければ改良はできないだろう
766 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 10:02:51.33 ID:pEng5xY00.net] 今の言語は最高とまでは言えない。 いつしか高級言語への進化が止まって、 単なる改良しか行われなくなってしまった 高級言語を超える、超高級言語が必要 俺にはそのアイデアがあるが、なにぶん能力がないw 目的は、超高級言語の開発だが、そのためには まず言語が作れるようにならないといけないだろうな ちなみに超高級言語のアイデアとは、現在設計書として 自然文で書いてあるものをプログラム言語として 記述可能にしようというもの。今の言語はモジュールやクラス構造までは プログラム言語で記述できるが、プロジェクト全体の構造までは記述できない 例えば、Railsなどのフレームワークのmodelsやcontrollersといったディレクトリ構造は プロジェクトで決まっているにもかからわず、ドキュメントで書くしかない。 だからmodelsに置くべきものをcontrollersにおいたり、modelsではやっては いけないような処理をやることが出来てしまう。コンパイルエラーにも実行時エラーにもならない
767 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 11:38:14.68 ID:n+1J2GMZa.net] 3行で
768 名前:デフォルトの名無しさん [2018/11/30(金) 12:29:51.33 ID:vx8Iixcxa.net] 超 高級言語が 必要
769 名前:デフォルトの名無しさん [2018/11/30(金) 12:30:21.78 ID:+/lt4tPpr.net] タイヤと 車輪は 同じもの
770 名前:デフォルトの名無しさん [2018/11/30(金) 12:47:31.33 ID:vx8Iixcxa.net] も う 止めよう
771 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 13:04:32.40 ID:iEacaeBh0.net] 実は CASEツール です
772 名前:デフォルトの名無しさん mailto:sage [2018/11/30(金) 15:46:57.55 ID:ZZJKHSVT0.net] それずっと前にKnuthが実践してた文芸作譜と同じじゃね? そしてアレは超絶面倒な作業。
773 名前: mailto:sage [2018/11/30(金) 23:23:00.81 ID:MkfLpznc0.net] >>766 >高級言語を超える、超高級言語が必要 ちょっとワクワクしてしまいましたことを、ここに告白いたします
774 名前:デフォルトの名無しさん mailto:sage [2018/12/01(土) 01:32:04.95 ID:3WCvWAVjM.net] 言語に縛られてるから駄目なんだよ とか言ってみる
775 名前:デフォルトの名無しさん mailto:sage [2018/12/01(土) 02:53:09.42 ID:7CoKqMj50.net] 「縛られるのが好き」ってプログラマ、結構多いんですよ とか言ってみる
776 名前:デフォルトの名無しさん [2018/12/01(土) 07:47:52.11 ID:U3mK8vlPr.net] 下ネタはもっと堂々と言わな逆にいやらしく感じるで
777 名前:デフォルトの名無しさん mailto:sage [2018/12/01(土) 10:18:14.73 ID:Ly5JuDld0.net] 全部縛ってヤってなんぼだと思うんです。 とか言ってみる。
778 名前:デフォルトの名無しさん mailto:sage [2018/12/01(土) 10:47:37.07 ID:Km1sjdO20.net] お前らくだらない話ばっかり盛り上がるな
779 名前:デフォルトの名無しさん [2018/12/01(土) 12:34:48.97 ID:U3mK8vlPr.net] さほど盛り上がっとらんやろw 人と関われよw
780 名前:デフォルトの名無しさん mailto:sage [2018/12/02(日) 02:44:47.66 ID:+c90NOTB0.net] まあ 使える言語は多いほうが手広いわな
781 名前:デフォルトの名無しさん mailto:sage [2018/12/02(日) 17:31:01.53 ID:OYZHkh2Or.net] >>776 知ってる一つの言語でなんでもしようとしちゃう っていう意味かとおもてた
782 名前:デフォルトの名無しさん mailto:sage [2018/12/02(日) 18:30:06.74 ID:RWr+AACs0.net] 自由に安くやってが最も困る。
783 名前:デフォルトの名無しさん mailto:sage [2018/12/04(火) 18:22:49.34 ID:VVlGsdy50.net] find(1)ユーティリティの速度に関しての疑問なんだけど https://linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html#lbAO ここに 「検査 -name を -type の前に置いているのは、すべてのファイルに対して stat(2) システムコールを行う無駄を省くためである。」 とある。これは「find(1)は-nameのほうが-typeより処理速度が速い」ということを言っているよね。 実のところ手元ではfindが優秀すぎるのか知らんが-nameを-typeより前に書いても後に書いても速度に変化はなかった。 が 基本的にはfindで複数の条件を指定するときは-nameを先頭あたりに置いたほうがいいのかな。 findのソースコードを見てないので推測になるが-permや-newerもstat(2)を実行してるぽいので-nameより遅い筈。
784 名前:デフォルトの名無しさん mailto:sage [2018/12/04(火) 18:56:51.46 ID:bTQB60BC0.net] statが遅いと言うのも幻想
785 名前:デフォルトの名無しさん mailto:sage [2018/12/04(火) 19:07:42.58 ID:HBlgjyZNM.net] 最近のファイルシステムはreaddirでタイプが取得できるよ
786 名前:デフォルトの名無しさん [2018/12/06(木) 00:12:43.36 ID:pQ33EIUW0.net] >>783 linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html#lbAE -Olevel 1 これはデフォルトの最適化レベルであり、伝統的な動作に当たる。 式を並べ替えるとき、ファイル名にのみ基づいた検査 (たとえば、 -name や -regex) が先に実行されるようにする。
787 名前:デフォルトの名無しさん mailto:sage [2018/12/06(木) 09:10:09.33 ID:cC0kDT7D0.net] >>786 へえ!そうなんだ。 ってことはGNU/Linux使ってる限りは順番はどうでもいいんだな ありがとう。
788 名前:デフォルトの名無しさん mailto:sage [2018/12/06(木) 15:10:37.27 ID:cC0kDT7D0.net] 引数に一律にコマンドで操作を施したあと、それらをもう一度引数として扱うにはどうすればいいかな $ a.sh arg1 arg2 arg3 みたいに起動されたとして$1,2,3にはarg1,2,3が入ってる。 これを$(echo $1 | tr '[:lower:]' '[:upper:]')みたいなコマンド置換を使ってARG1,2,3みたいに変形させる。 問題はこの後にa.shの中の別のコマンドに somecmd "$@" のような形でARG1,2,3を与えたいってこと。 while [ $# -eq 0 ]とshiftを使う普通のやりかたではループを抜けた後に$@が空になってしまう。 どうにかして引数の構造を維持したいんだけども……。
789 名前:デフォルトの名無しさん [2018/12/06(木) 16:06:47.11 ID:59uVculK0.net] >>788 eval set -- $(printf ' "$(printf "%%s" "$%d" | tr "[:lower:]" "[:upper:]")"' $(seq $#))
790 名前:デフォルトの名無しさん mailto:sage [2018/12/06(木) 16:38:57.36 ID:cC0kDT7D0.net] >>789 ありがとう。
791 名前:デフォルトの名無しさん mailto:sage [2018/12/12(水) 21:07:46.42 ID:7+bnD1C/0.net] ここかどうかわからんのだけど、メールの添付ファイルのテキストCSV部分を切り出してDB格納しようと思ったら、 シェルスクリプトでヘッダから切り出すしかない?
792 名前:デフォルトの名無しさん mailto:sage [2018/12/12(水) 21:36:28.16 ID:xr4it+i10.net] そういう専用ツールがないんだったらそうだろうな
793 名前:デフォルトの名無しさん mailto:sage [2018/12/13(木) 19:34:10.52 ID:Nc8J2Ufn0.net] >>550 別件でググっていたら、言及しているドキュメント見つけた ${1+"$@"} で動かないシェルもあるようだ web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html > 最も有名なシェルの移植性の問題の一つは,`"$@"'との関連です.位置に 依存する引数が無いとき, > POSIXでは`"$@"'を何もないことと 等価になっていますが,オリジナルのUnixバージョン7の > Bourneシェルはその代 わりに`""'として扱い,この動作はDigital Unix 5.0のようにそれ以降の 実装でも提供されています. > > この移植性の問題を回避する伝統的な方法は,`${1+"$@"}'を使用する ことです. > 残念ながら,この手法はMac OS Xでも使用されている,Zsh (3.x と 4.x)では動作しません. > Bourneシェルをエミュレートしているとき,Zshは `${1+"$@"}'で単語の分離を実行します.
794 名前:デフォルトの名無しさん mailto:sage [2018/12/16(日) 07:48:44.86 ID:AoQUSXZn0.net] Bashってシングルクォートの内部でない限りバックスラッシュでシングルクオートを直接エスケープできるんだな。 マニュアルにも書いてないけど他人のスクリプト見て発見した。 $ squo=\' $ echo $squo ' ↑こうできる。Bashは楽でいいなぁ
795 名前:デフォルトの名無しさん mailto:sage [2018/12/16(日) 09:07:44.57 ID:rkLF3tWt0.net] >>794 水を差すようで悪いがposixで規定されているから他のシェルでも同じになる
796 名前:デフォルトの名無しさん mailto:sage [2018/12/16(日) 09:55:51.26 ID:0jv0YmXXa.net] なぜそれを特別に思ったのかわからんけど他は出来なかったりするの?
797 名前:デフォルトの名無しさん [2018/12/17(月) 19:35:33.43 ID:41bJ0tdVa.net] \ はエスケープだし使う事はあるので特に目新しい感じはしない。 sambaでファイルサーバ作ってWindowsからもファイルが書かれるような状況だとファイル名にスペースだの括弧だの普通に入れられてLinuxでログインしている端末からだとエスケープせざるを得なかったりする。 俺の場合はそれで一文字だけエスケープはよく使う。
798 名前:デフォルトの名無しさん mailto:sage [2018/12/17(月) 21:17:48.10 ID:lO+98ZHR0.net] Linuxで普通にファイル名にスペース入れられるんだから sambaとかwindowsは全く関係ないけどね
799 名前:デフォルトの名無しさん mailto:sage [2018/12/17(月) 23:45:58.91 ID:LS1nUj7m0.net] CUI使いとGUI使いの違いだな CUIでわざわざくそめんどくさいスペースなんぞを好き好んでは使わない。GUIではふつーにわかりやすくもなるから使う、普通に入れるのはあたりまえ
800 名前:デフォルトの名無しさん [2018/12/17(月) 23:52:42.27 ID:oCmK2PVR0.net] めんどくさくないけど?エアプなんキミ?
801 名前:デフォルトの名無しさん mailto:sage [2018/12/17(月) 23:54:51.53 ID:faSovs330.net] 有志のコードに ファイル名が空白入りだと事故るものがあったような? 自分は 安全とって全部アンダーバー変換しておく
802 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 00:10:28.35 ID:DLVg/wUV0.net] >>800 めんどくさいめんどくさくないはまあ人次第だけどな CUIでなんやかんやキーボード打ってる時に、エスケープしたり"や'囲ったり、そもそもスペースはもろもろコマンドでデリミッターだったりで、めんどくさいと思うけどな 人次第ではあるが、そゆのが想像できなずにエアプと言えるのがエアプっぽいと思わなくもない
803 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 01:24:02.71 ID:2j/3pVMu0.net] >>801 有志って言ってもタダの素人だっただけの話じゃん
804 名前:デフォルトの名無しさん [2018/12/18(火) 03:02:35.05 ID:HuP+yDtL0.net] >>798 もちろんファイル名には / 以外は何でもありだが Linux だけ使ってると普通はあまりそういうファイル作らないじゃない。一々エスケープしなきゃならないしシェルスクリプトで扱いづらいし。 まあ趣味の問題ではあるけどな。
805 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 03:52:25.12 ID:aYYQx5Ta0.net] libreofficeから「報告書 2018-12-18」という名前で保存することの何が面倒なのか?
806 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 05:00:11.76 ID:CtnsxEVc0.net] うわあ
807 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 05:48:13.89 ID:aYYQx5Ta0.net] ファイル名にスペースが使えるOSが悪いんだって言いたいのかな?w
808 名前:デフォルトの名無しさん [2018/12/18(火) 06:17:30.36 ID:mQMHvFDr0.net] >>802 アルファベットや数字打つのとなんら変わらんけど? そもそもシェルには補完ゆうもんがあるんやでエアプさんw
809 名前:デフォルトの名無しさん [2018/12/18(火) 09:37:03.21 ID:92SsvGE7a.net] >>805 ああ。WindowsみたいにGUIメインで使ってるの?それだけだったら面倒じゃないかもね。
810 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 10:24:35.01 ID:H+ovSSRq0.net] >>808 なにをいいたいのかイミフすぎだな、プロフェッショナルwすぎて 補完時にもバックスラッシュ打たなきゃならんだろ?打たなくていい環境なの?そういう環境もあるんだよ なんかただ馬鹿にしたいだけのお人か?しょうもない
811 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 12:13:46.40 ID:bhmdNwABa.net] なんで自分以外みんな非効率って思ってるのここの人たち 最強は俺だから落ち着けよ
812 名前:デフォルトの名無しさん [2018/12/18(火) 12:15:53.17 ID:92SsvGE7a.net] Tabキー押すと自動で保管したり変換したりしてくれる場合は楽かも。 楽ってだけで見た目エスケープだらけの見辛い状態にはなるが。
813 名前:デフォルトの名無しさん [2018/12/18(火) 12:25:17.53 ID:Lulkb9OFr.net] >>810 はいはいエアプさんはそろそろお昼寝の時間でちゅよ〜w
814 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 15:34:29.41 ID:kLOm0zeN0.net] アホすぎなレスで笑うww
815 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 15:42:44.01 ID:DOEC5j1K0.net] こいつらプログラム言語はシェルスクリプトしか使ったこと無いんか? シェルスクリプトは珍しく引数の文字列をクォート(もしくはダブルクォート)で くくるのが必須じゃない言語だが他の言語は殆どクォートでくくるんだぞ "foobar" も "foo bar" も入力のしやすさに大差ないだろ エスケープが必要なのは \ 等であってスペースはエスケープ不要なごく普通の文字なんだが いつものことだが(シェルスクリプト以外の)経験の差を感じるよな
816 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:01:13.36 ID:kLOm0zeN0.net] 何をお怒りか存じませんが、括らなくてもいいから括らないのが普通になるんでございますよ。当然括るのが必須なら括るのが普通。シェルスクリプトでもスクリプトファイル書くときは変数展開では普通に括るし コマンド叩くときにはいつも括ってるの??
817 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:03:24.94 ID:kLOm0zeN0.net] >スクリプトファイル書くときは ああ、ワンライナーなんぞでもだな。ここんとこ間違い/不要
818 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:21:43.27 ID:DOEC5j1K0.net] >>816 > 何をお怒りか存じませんが、 わかってないのか? スペースが含まれてるファイル名に対応するのは プログラマとして当然の話だということだよ
819 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:24:38.45 ID:kLOm0zeN0.net] >>818 別にそれは普通だな。>>816 でそう書いているんだけど? そんな話じゃないぞ。自分の範疇でが主な話だよ?俺はな
820 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:28:29.69 ID:DOEC5j1K0.net] >>819 わかってないのに、途中から割り込んでくるなよ 最初からLinuxでもファイル名にスペースを入れるのは普通だって言ってるだろ sambaとかwindowsは全く関係ない
821 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:33:56.90 ID:kLOm0zeN0.net] >>820 >>815 で具体的に誰かになんて言ってないやん ああ、それに対しても>>799 だっただけどなあw また、>>818 と同じ意味で>>797 に対しても わかんねえかなあw経験を生かしてご理解ください
822 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 16:56:33.71 ID:DOEC5j1K0.net] アホすぎなレスで笑うww
823 名前:デフォルトの名無しさん [2018/12/18(火) 17:14:23.03 ID:92SsvGE7a.net] WindowsだとC言語とかでパスの区切りが \ になってて毎回 \\ と入れなきゃいけないのも面倒だな。 実は / でも大丈夫だったりはするが。
824 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:18:15.10 ID:1JLRyxNd0.net] 今はパスにスペース入れるのも普通だし、対応もできるけど トラブルのもとは根絶したいから、自分は使わない、それだけ
825 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:24:06.70 ID:kLOm0zeN0.net] >>822 ww ざんねんなこって。いろいろとw
826 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:31:06.24 ID:1JLRyxNd0.net] パスをコマンドの引数にする必要がある場合、 例えば、hogecommand --foo_option="filepath=[パス],otheroption=bar" なんていうのがある時、 パスにスペースが入っていると、コマンド自体がパースするときに一工夫がいる。 シングルクォートが使えるシェルならいいが、Windowsのように使えないものもあるから、 バックスラッシュなどでエスケープしたり、コマンドが以下の様な別の区切り文字を用意していたりする。 --foo_option=[filepath="/path/with space/",otheroption=bar] 対処方法がなかなか見つからないこともあり、面倒くさいので、 自分からすすんでスペースを入れようとは思わない。
827 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:46:09.05 ID:DOEC5j1K0.net] × パスにスペースが入っていると、コマンド自体がパースするときに一工夫がいる。 ○ コマンドの引数の形式を適当に決めると、パースするときに一工夫がいるようになってしまう。
828 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 17:50:36.86 ID:DOEC5j1K0.net] ちなみに気づいていないようだから言うと >>826 はパスにスペースが入っていると困る問題ではない hogecommand --foo_option="filepath=/path/with space/,otheroption=bar" ,でsplitして、○○=を消せばいいだけだから何も困らない この例で困るのは、パスにカンマが含まれている場合であって スペースではない
829 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 18:16:22.51 ID:1JLRyxNd0.net] >>828 ああ、わるい、オプションの階層が一段階足らなかった。 hogeコマンドが、別のライブラリ(foo)のオプションを呼ぶような場合に、 hogecommand --hoge_option=foo_option="filepath=[パス],otheroption=bar" hogecommand --hoge_option "--foo_option filepath=[パス],otheroption=bar" こんなパターンがあって、そのままではやはりパースに一工夫が必要で面倒くさい。 ちなみに、上はmpv、下はyoutube-dlで使われている。
830 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 18:19:12.99 ID:DOEC5j1K0.net] 別のコマンドを呼び出すなら、別のコマンドにそのまま渡せばよかろう? hogecommand --foo_option="どんな内容でも" betsucommand どんな内容でも はい。おしまい
831 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 18:24:29.26 ID:n1+CJQ+h0.net] ちなみにファイル名により柔軟なのはWindowsよりも寧ろLinux(というかUnix系)だぞ。 Windowsは「con」とか「aux」とかも駄目だしバックスラッシュやコロンが含まれても駄目。 Unix系のOSは「\0(空文字)」と「/(スラッシュ)」だけが不適合で,あとは全ての文字をファイル名として 使用できる。
832 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 18:35:11.65 ID:/rMHixhE0.net] 開業コードもつかえるのはまれにネタになる
833 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 22:33:16.76 ID:2j/3pVMu0.net] >>810 今時はWindowsのコマンドプロンプトだって必要に応じてエスケープしてくれるぞ?
834 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 22:34:34.10 ID:2j/3pVMu0.net] >>831 \0も使えたと思うが... 消せなくなったりするけどさ
835 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 22:57:59.19 ID:uKKjGArEH.net] >>834 消す前に作れねーだろ
836 名前:デフォルトの名無しさん [2018/12/18(火) 22:59:29.33 ID:mQMHvFDr0.net] 消せるわこのエアプw
837 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 23:44:21.87 ID:n1+CJQ+h0.net] 名前に\0を含むファイルは作れないと思うけど。 少なくともPOSIXでは禁止されているし,pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_170 ext4でも作成できない。 ……「エアプ」はどっちだろう。
838 名前:デフォルトの名無しさん mailto:sage [2018/12/18(火) 23:56:48.31 ID:DOEC5j1K0.net] 正直ファイル名に\0が使えようが使えまいが シェルスクリプトで\0が扱えないのでどうでもいい
839 名前:デフォルトの名無しさん [2018/12/19(水) 04:45:08.43 ID:gf1Tua9E0.net] エアプってなんなん?
840 名前:デフォルトの名無しさん mailto:sage [2018/12/19(水) 07:27:20.06 ID:+7lasSiAM.net] ¥x00
841 名前:デフォルトの名無しさん [2018/12/19(水) 12:42:42.59 ID:guVdMf63r.net] >>839 おまえらの事やんw
842 名前:デフォルトの名無しさん mailto:sage [2018/12/20(木) 00:17:43.13 ID:6pIAvd2J0.net] Airぷ
843 名前:デフォルトの名無しさん mailto:sage [2018/12/20(木) 00:39:10.52 ID:0M5ZFUn5M.net] for i in {0..255}; do touch "./hoge$(printf "\x$(printf "%02x" $i)")foo"; done
844 名前:デフォルトの名無しさん mailto:sage [2018/12/22(土) 13:28:39.38 ID:t1Sp89dZ0.net] エロ動画サーフィンで広告サイトが開いてしまったら、 デスクトップのシェルスクリプトにドラッグアンドドロップすることで そのサイトのIPアドレスをHOSTSファイルに追加する
845 名前:デフォルトの名無しさん mailto:sage [2018/12/22(土) 13:59:19.13 ID:aa5NQG9N0.net] なんていうことをしていたら、hostsファイルの行数が 数千行になってしまった
846 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 08:08:03.20 ID:W0WvAA710.net] sedだと簡単に動く一文字以上の半角スペースを一文字スペースに置換するコレ echo "$strings" | sed -E 's/ {1,}/ /g' bashだとどーしてもうまく動かず次のように[]で囲ってやるとなんとか全連続スペースじゃなく一部 だけが置換できた。 ${strings// [ \{1,\}]/ } それ以上どうしようもなかったので、次のような関数を作った function Rep2One(){ local str=$1 local chr=$2 while : do str="${str//$chr$chr/$chr}" if [[ ! $str =~ $chr$chr ]]; then break fi done echo "$str" } srings=`Rep2One "$strings" " "` これで任意の2文字以上の連続を1文字に置換できたが、 sedみたいに一発でかっこよく記述できない? 至る所でbashからsedやgrep起動してたんだが、 bashのなかでできることはbashだけでやった方が大分速いことがわかったんで なんとかbashの正規表現だけでやりたい
847 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 08:14:34.77 ID:yUjQiXy10.net] なんでそんなに正規表現に拘るのかわからん #!/bin/sh while IFS= read -r line; do echo $line done
848 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 12:09:04.04 ID:W0WvAA710.net] >>847 おお、早速 thx 単に知らなかっただけです。 任意文字の繰り返しを1文字に置換したいときはどーするんですか?
849 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 12:13:13.41 ID:W0WvAA710.net] 結局、bashの正規表現は2文字以上全置換を記述できないんですかね? bashの正規表現でわからないことがいろいろあるんですよ。 文頭置換したいとき'^'に相当するのはどう書くかとか?
850 名前:デフォルトの名無しさん [2018/12/23(日) 13:58:44.05 ID:nNQ759QC0.net] ま、とりあえずこれでも見ろ。 bashの変数内文字列置換まとめ https://qiita.com/aosho235/items/c36568830a8d47288284
851 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 14:09:56.35 ID:yUjQiXy10.net] >>848 IFSで指定しろ
852 名前:デフォルトの名無しさん [2018/12/23(日) 14:18:28.55 ID:nNQ759QC0.net] でもってこれ。bash のパス名展開。 https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBG この中に +(pattern-list) というのがある。 なので例えばこんなことも出来る。 a="a b c d" # ← 複数のスペースを適当に入れた文字列を a にセット b="${a//+( )/ }" # ← 全ての1文字以上のスペースを1文字のスペースに変換して b にセット
853 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 15:08:28.31 ID:eEMSqKaq0.net] >>848 ちょっと目的と違うかもしれんが trコマンドの-sオプションもお勧めだよ。 POSIXで定められているので汎用性高いし、あとawkやsedを使う方法より若干高速
854 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 15:10:20.98 ID:yUjQiXy10.net] 外部コマンドを呼び出している以上 遅くなることに変わりはない
855 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 16:10:20.07 ID:eEMSqKaq0.net] 「awkやsedを使う方法より」
856 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 16:20:58.12 ID:yUjQiXy10.net] 「awkやsedを使う方法より若干高速 と言ったって外部コマンドを呼び出している以上 遅くなることに変わりはない」
857 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 16:57:53.53 ID:snCJQSVKM.net] awkやsedより遅いの?違うでしょ?日本語勉強しなよ。
858 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:02:15.89 ID:yUjQiXy10.net] bashだけでやるより遅いって話をしてる所に awkやsedよりも早いって言うことに意味がないと言ってる
859 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:12:57.88 ID:jos3UrGDa.net] まーた始まったよ(パリポリ
860 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:15:39.87 ID:YhyQsVDP0.net] )ソ) ッλ ノ(.,ノ) (゙- ..::.::. . ( (ソ. .彡⌒ミ. )ソ) ).::'; (´・ω・`) ス ( ソ .::;';'(つ ⊂)::;';'`〜、. ( :;';' |__∧_| ::;';' ヽ) `'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~ さ あ 禿 げ 上 が っ て ま い り ま し た
861 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:15:41.10 ID:yUjQiXy10.net] しーかたないねー(パリポリ
862 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:46:37.96 ID:eD9rxy9Z0.net] あ?やんのかこら
863 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 17:47:26.96 ID:GvU/LsqE0.net] >>857 質問者の意図を汲み取りましょうw
864 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 20:07:54.91 ID:0+7qAFFh0.net] 今時汲み取り式なんて・・・
865 名前:デフォルトの名無しさん mailto:sage [2018/12/23(日) 20:36:12.95 ID:W0WvAA710.net] >>852 ほんと感謝します ようやくすっきりしました。 そのサイトにも行き着いていたのですが、ちゃんと読めていませんでした ありがとうございました。 >>853 trコマンドは知ってますし、今回も使いました。 今回の処理は結局、全処理c++で書き直したりもしてるんで、 他のツール使えばできるとかの情報は全く必要なく あくまでもbash単体で処理するにはどうするかということでここで質問しました bashでの正規表現に関する情報があまりなくて、 20年ほど前に買ったオライリーのbash本にも正規表現の記載が一切なく bashの正規表現に制限があるならそれを教えてもらうことも目的でここで聞きました。
866 名前:デフォルトの名無しさん mailto:sage [2018/12/26(水) 09:38:30.84 ID:GigxKnwz0.net] watchで表示更新時間ごとに変数の加算は出来ませんか?
867 名前:デフォルトの名無しさん mailto:sage [2018/12/26(水) 11:17:37.79 ID:SKc2oSlY0.net] 無理。自分でwatchを実装しろ
868 名前:デフォルトの名無しさん mailto:sage [2018/12/26(水) 11:19:29.41 ID:SKc2oSlY0.net] 訂正 自分でシェルスクリプト版watchを実装しろ
869 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 08:42:00.02 ID:btIksil/0.net] 区切り文字を指定して文字列を分割するときに 区切り文字が一種類の場合はcut(1)とかを使うし 区切り文字がBREで表わされるような場合はAWKを使うけど 各フィールド毎に特定の区切り文字があるような時はどうすればいいかな。 今やろうとしていることはISO 8601形式の日付を空白区切りに分解することで 2018-12-30T08:36:50+09:00 ↑こういう文字列を 2018 12 30 08 36 50 + 09 00 ↑こういう空白区切りに分解したい。 その為には「第1,2,3フィールドはハイフン,第4フィールドは文字T,第5,6,7フィールドはコロンで分割する」 っていう具合の処理を考えないといけない。 正直,sedを使えばいいんだけど,もうちょっとスマートな方法があれば教えてほしい……。 sedだと↓ sed -n -e 's/\([[:digit:]]\{4\}\)-\([[:digit:]]\{2\}\)-\([[:digit:]]\{2\}\)T\([[:digit:]]\{2\}\):\([[:digit:]]\{2\}\):\([[:digit:]]\{2\}\)\([+-]\)\([[:digit:]]\{2\}\):\([[:digit:]]\{2\}\)/D:\1\2\3\4\5\6\7\8'"'"'\9/1p' ↑こんなことになるw
870 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 10:20:55.12 ID:Ob5186rT0.net] >>869 入力形式が確定しているから単純化して sed 's/[-+:T]/ /g' とかはどう?
871 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 10:23:20.84 ID:Ob5186rT0.net] >>870 書き込んでから気づいたがこれだと+の周りが処理できないな
872 名前:デフォルトの名無しさん [2018/12/30(日) 10:40:37.85 ID:btIksil/0.net] >>871 そうなんだよね…… もし+に特殊な処理をしないならば tr '-+:T' ' ' で一発なんだけど、できないんだよ。
873 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 10:53:56.67 ID:MMB+AHvh0.net] sed 's/+/ + /;s/[-:T]/ /g' では??
874 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:01:57.94 ID:/wKH6dhf0.net] >>869 #!/bin/sh t="2018-12-30T08:36:50+09:00" IFS="-T:+" set -- $t echo $1 $2 $3 $4 $5 $6 + $7 $8
875 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:08:31.89 ID:MMB+AHvh0.net] タイムゾーンはマイナスありか
876 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:25:42.74 ID:MMB+AHvh0.net] sed 's/-/ /;s/-/ /;s/\([+-]\)/ \1 /;s/[:T]/ /g' なんか泥臭いけど
877 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:28:51.37 ID:/wKH6dhf0.net] #!/bin/sh t="2018-12-30T08:36:50+09:00" IFS="-T:+" set -- $t case ${t%?????} in *+) echo $1 $2 $3 $4 $5 $6 + $7 $8 ;; *-) echo $1 $2 $3 $4 $5 $6 - $7 $8 ;; esac
878 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:32:49.36 ID:/wKH6dhf0.net] date -d "2018-12-30T08:36:50-09:00" "+%Y 略" (飽きた)
879 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 11:48:16.88 ID:btIksil/0.net] >>874 それだとアメリカとかのタイムゾーン-03:00に対応できなくね?
880 名前:879 mailto:sage [2018/12/30(日) 11:49:02.96 ID:btIksil/0.net] >>877 すまん。ちゃんと対応してくれてた。
881 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 16:00:37.71 ID:yEx+bcWd0.net] GNU grep の場合 $ echo '2018-12-30T08:36:50+09:00' | grep -Po '([0-9]{2,4}|(?<=:[0-9]{2})(\+|-))' | xargs
882 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 16:49:11.50 ID:btIksil/0.net] >>881 すげー。 でも後から自分でデバッグできなさそうなのでやめておくw
883 名前:デフォルトの名無しさん mailto:sage [2018/12/30(日) 18:51:33.10 ID:iF2NHAVN0.net] t="2018-12-30T08:36:50+09:00" echo "${t:0:4} ${t:5:2} ${t:8:2} ${t:11:2} ${t:14:2} ${t:17:2} ${t:19:1} ${t:20:2} ${t:23:2}"
884 名前:デフォルトの名無しさん mailto:sage [2019/01/01(火) 13:16:40.82 ID:0CXB5czV0.net] :digit:より0-9のほうが打件数少ないのはなんなんだ
885 名前:デフォルトの名無しさん mailto:sage [2019/01/01(火) 13:57:25.01 ID:WRhsD0vEa.net] 単に意味を優先した表現方法があるだけやろ
886 名前:デフォルトの名無しさん mailto:sage [2019/01/05(土) 11:12:13.83 ID:dE0KuiGH0.net] 本当に一部のシステムでの話だけど [:digit:]がロケールの数値表現にも合致する場合がある 「1」とか。
887 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 14:59:50.50 ID:01rSRjtda.net] test.txtの内容が hoge fuga puge で、 sed -i -e s/hoge\n// test.txt とやったのに『hoge(改行コード)』が消えてくれないたすけて test.txtの一行目を削除 → 2行目が一行目に、 みたいにトコロテンしたい
888 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 15:08:57.37 ID:01rSRjtda.net] 自己解決・・・ sed -i -e ':a;N;$!ba;s/hoge\n//' test.txt ってやったらできました・・何この呪文。。
889 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 15:30:19.88 ID:RynyI9pj0.net] sed -i -e '/hoge/d' test.txt じゃダメなん?
890 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 15:36:38.32 ID:01rSRjtda.net] >>889 で、できました それ使っていきます ありがとうございました
891 名前:デフォルトの名無しさん [2019/01/07(月) 19:03:53.04 ID:fnTlHl64a.net] grep -v もよろしく
892 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 19:52:44.45 ID:fRqqYmWxa.net] 一行目を消したいのかhogeを消したいのか
893 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 19:54:56.69 ID:52D4hsE60.net] 全部消したい。何もかも
894 名前:デフォルトの名無しさん mailto:sage [2019/01/07(月) 20:31:04.88 ID:Opohu4pM0.net] 要らない 何も 消してしまおう
895 名前:デフォルトの名無しさん [2019/01/08(火) 09:33:22.38 ID:LJT6VvGba.net] そんなあなたに rm
896 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 04:57:31.17 ID:yVo/NDAD0.net] ネットワーク通信(特にhttpクライアント)に関するコマンドって 大きくwgetとcurlとfetchなんかがあるけどもみんなはなに使ってます? 大抵のLinuxにはwgetが、MacとWindowsにはcurlが初期搭載されてるので そのどっちかだとは思う。
897 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 09:31:04.31 ID:d7ZwxpvN0.net] スクリプトの場合はオプションが面倒くさくいのは関係ないから 個人的には自由度の高いcurl一択かな 直接コマンド打ってダウンロードするときはaria2cを使ったりする
898 名前:デフォルトの名無しさん [2019/01/10(木) 10:00:22.11 ID:jQehovm3a.net] 昔から使ったていたというだけの理由で wget
899 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 11:40:29.86 ID:DS8wsvUQ0.net] wgetが入っていればwget、curlが入っていればcurl 両方入っているなら、ファイルにしたいときはwget、出力結果を見たいときはcurl
900 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 16:56:41.32 ID:jhx89QXs0.net] PowerShell では、Invoke-WebRequest のalias が、curl, wget get-alias (gal) で表示できる
901 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 18:31:34.76 ID:yVo/NDAD0.net] >>900 え、それつまり $ curl ... としたときのオプションは実はcurlのじゃなくて Invoke-WebRequestに向けたオプションってこと? そんなに互換性があるオプション体系だとは思わないのだけど なぜエイリアスにしてあるんだろう……。
902 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 20:31:11.75 ID:UUY7OixDM.net] 呼ばれたときの名前によって処理を切り替えてるんじゃないの?知らんけど
903 名前:デフォルトの名無しさん mailto:sage [2019/01/10(木) 22:34:40.34 ID:qJAnpZ0RM.net] cURL以外使わん
904 名前:デフォルトの名無しさん mailto:sage [2019/01/11(金) 03:35:07.12 ID:tAdCcMWb0.net] bashで「=」という文字をコマンドにすることってできますかね。 「=」を「bc -l <<<」に割り当てて $ = '4 / 5.1' みたいな簡易電卓として使いたいなと思ったんだけど alias =='bc -l <<<'やfunction = { bc -l <<< "$1" }はダメ……。 一応GNU Bashの「コマンドに使っていい文字」ではあるんだけど、使えない
905 名前:デフォルトの名無しさん mailto:sage [2019/01/11(金) 05:36:31.36 ID:YPYEBq870.net] =というファイル名のシェルスクリプト書いたら? bashもいらんし #!/bin/sh echo "$@" | bc -l
906 名前:デフォルトの名無しさん mailto:sage [2019/01/11(金) 08:51:55.60 ID:EZ88NWNa0.net] function = { bc -l <<< "$1"; } ってすればできる(セミコロンが必要)