シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
探検
シェルスクリプト総合 その32
■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
140デフォルトの名無しさん
2019/12/05(木) 15:22:44.42ID:WdOnkWYr141デフォルトの名無しさん
2019/12/05(木) 15:55:06.05ID:Gb1I+/8K142デフォルトの名無しさん
2019/12/05(木) 15:58:33.95ID:TzSLtKO4 >>140-141
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。
ありがとうございました!
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。
ありがとうございました!
143デフォルトの名無しさん
2019/12/06(金) 20:34:56.63ID:08yg4gJX 宇宙刑事シェバン
144デフォルトの名無しさん
2019/12/10(火) 22:30:09.16ID:zD6aLrgM x-y
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。
思い付いたのは
[ ${var%-*} -lt ${var#*-} ]
か
$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。
思い付いたのは
[ ${var%-*} -lt ${var#*-} ]
か
$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。
145デフォルトの名無しさん
2019/12/10(火) 23:18:51.56ID:kdXCWOtW $((var < 0))はPOSIX準拠じゃなくね?
やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
146デフォルトの名無しさん
2019/12/10(火) 23:24:09.60ID:kdXCWOtW ちなみにうちのマシンだとこんな感じ
$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.722s
user 0m2.718s
sys 0m0.004s
100万やって3秒、1万回だと0.03秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.722s
user 0m2.718s
sys 0m0.004s
100万やって3秒、1万回だと0.03秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
147デフォルトの名無しさん
2019/12/10(火) 23:25:16.53ID:SL+fGedD echo "$var<0"|bc
148デフォルトの名無しさん
2019/12/10(火) 23:28:35.11ID:kdXCWOtW bcプロセス起動してるから遅い
それは実行しなくてもわかる
それは実行しなくてもわかる
149デフォルトの名無しさん
2019/12/10(火) 23:50:31.02ID:kdXCWOtW あとオマケ、速いとは思えないけど
IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2
これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2
これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
150デフォルトの名無しさん
2019/12/10(火) 23:51:59.49ID:LOypIkS3151デフォルトの名無しさん
2019/12/10(火) 23:59:28.15ID:kdXCWOtW152デフォルトの名無しさん
2019/12/11(水) 00:00:32.26ID:ivhCTlPt i7 3.4Ghzって今どき低スペックなのか?
ハイスペックかと思ってた
ハイスペックかと思ってた
153デフォルトの名無しさん
2019/12/11(水) 00:00:55.23ID:5YQOA1oq154デフォルトの名無しさん
2019/12/11(水) 00:03:27.10ID:5YQOA1oq >>152
スペックは低くはないと思うけどさ、もう古いし
中古だと2〜3万円台で搭載パソコンを買えちゃうよ
https://used.dospara.co.jp/sale/search.php?view=1&kw=Core%20i7%203770&page=1
スペックは低くはないと思うけどさ、もう古いし
中古だと2〜3万円台で搭載パソコンを買えちゃうよ
https://used.dospara.co.jp/sale/search.php?view=1&kw=Core%20i7%203770&page=1
155デフォルトの名無しさん
2019/12/11(水) 00:11:26.60ID:ivhCTlPt156デフォルトの名無しさん
2019/12/11(水) 00:15:38.57ID:rj8eSq0k バックグラウンドで色々動きっぱなし(usage 60%ぐらい)のWindows PC(Ryzen 5 2600, 3.66GHz)で
Cygwin
real 0m23.706s
user 0m23.375s
sys 0m0.093s
WSL
real 0m3.987s
user 0m3.891s
sys 0m0.016s
だった。えっ、私のCygwin遅すぎ・・・
Cygwin
real 0m23.706s
user 0m23.375s
sys 0m0.093s
WSL
real 0m3.987s
user 0m3.891s
sys 0m0.016s
だった。えっ、私のCygwin遅すぎ・・・
157デフォルトの名無しさん
2019/12/11(水) 00:21:29.42ID:5YQOA1oq158デフォルトの名無しさん
2019/12/11(水) 00:26:41.57ID:H3x5MOt+ >>153
$ printf "%d-%d¥n" $(shuf -r -i 0-999 -n 1000000) $(shuf -r -i 0-999 -n 1000000) > input.txt
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
1行目は0-999でランダムな引き算を100万件生成してファイル出力
2行目の処理は50秒かかったのと同じマシンで1.7~1.8秒で終わる
計算結果をキャッシュするからか10種類くらいの引き算の使い回しだと
100万件でも0.17秒くらいになる
$ printf "%d-%d¥n" $(shuf -r -i 0-999 -n 1000000) $(shuf -r -i 0-999 -n 1000000) > input.txt
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
1行目は0-999でランダムな引き算を100万件生成してファイル出力
2行目の処理は50秒かかったのと同じマシンで1.7~1.8秒で終わる
計算結果をキャッシュするからか10種類くらいの引き算の使い回しだと
100万件でも0.17秒くらいになる
159デフォルトの名無しさん
2019/12/11(水) 00:40:07.88ID:5YQOA1oq >>158
円文字化けしてんぞ
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
real 0m0.373s
user 0m0.300s
sys 0m0.005s
$ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo "+$var" || echo " $var"; done' < input.txt > output2.txt
real 0m8.247s
user 0m4.337s
sys 0m3.904s
まあ速いんだろうけどさ。想定の範囲内かな。
円文字化けしてんぞ
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
real 0m0.373s
user 0m0.300s
sys 0m0.005s
$ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo "+$var" || echo " $var"; done' < input.txt > output2.txt
real 0m8.247s
user 0m4.337s
sys 0m3.904s
まあ速いんだろうけどさ。想定の範囲内かな。
160デフォルトの名無しさん
2019/12/11(水) 00:40:26.36ID:H3x5MOt+ ランダムな引き算生成するawkバージョン
$ awk 'BEGIN{srand(); for (i=0; i<1000000; ++i) {print int(rand()*1000)"-"int(rand()*1000)}}' > input.txt
$ awk 'BEGIN{srand(); for (i=0; i<1000000; ++i) {print int(rand()*1000)"-"int(rand()*1000)}}' > input.txt
161デフォルトの名無しさん
2019/12/11(水) 00:46:42.05ID:5YQOA1oq お、こっちの方がわずかに速かった。スクリプトで計算させるよりも読み込み時に分割させたほうが良いんだろうな。
setを使って分割した場合は、setの呼び出しでコストがかかると思うけど
$ time sh -c 'IFS=-; while read i j; do [ $i -gt $j ] && echo "+$i-$j" || echo " $i-$j" ; done' < input.txt > output2.txt
real 0m7.866s
user 0m4.114s
sys 0m3.744s
setを使って分割した場合は、setの呼び出しでコストがかかると思うけど
$ time sh -c 'IFS=-; while read i j; do [ $i -gt $j ] && echo "+$i-$j" || echo " $i-$j" ; done' < input.txt > output2.txt
real 0m7.866s
user 0m4.114s
sys 0m3.744s
162デフォルトの名無しさん
2019/12/11(水) 00:53:02.45ID:mRJcWm57 $ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.268s
user 0m2.264s
sys 0m0.004s
$ time { var=1-2; echo "i=0;while(i<=1000000){${var}<=0;i++;}" | bc > /dev/null; }
real 0m1.540s
user 0m1.175s
sys 0m0.366s
real 0m2.268s
user 0m2.264s
sys 0m0.004s
$ time { var=1-2; echo "i=0;while(i<=1000000){${var}<=0;i++;}" | bc > /dev/null; }
real 0m1.540s
user 0m1.175s
sys 0m0.366s
163デフォルトの名無しさん
2019/12/11(水) 00:54:49.86ID:5YQOA1oq > 対象の文字列は標準出力ではなくて変数に格納されています。
お前らこの条件忘れてるだろw
お前らこの条件忘れてるだろw
164デフォルトの名無しさん
2019/12/11(水) 01:39:58.92ID:5YQOA1oq うーん、よく考えるとこれ実際の要件を想定して
「それぞれのコマンドを使って処理をした結果を元に続きの処理をする」となると
差があまりなくなってしまうかもしれん
$ time sh -c 'while read var; do echo $(($var)); done' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.678s
user 0m9.059s
sys 0m4.427s
$ time awk -F "-" '{ print $1-$2 }' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.629s
user 0m6.358s
sys 0m1.580s
$ time bc < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.649s
user 0m6.869s
sys 0m2.006s
「それぞれのコマンドを使って処理をした結果を元に続きの処理をする」となると
差があまりなくなってしまうかもしれん
$ time sh -c 'while read var; do echo $(($var)); done' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.678s
user 0m9.059s
sys 0m4.427s
$ time awk -F "-" '{ print $1-$2 }' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.629s
user 0m6.358s
sys 0m1.580s
$ time bc < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.649s
user 0m6.869s
sys 0m2.006s
165デフォルトの名無しさん
2019/12/11(水) 01:44:25.40ID:5YQOA1oq $ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo + || echo; done' < input.txt | while read i; do [ "$i" ]; done
real 0m7.596s
user 0m9.484s
sys 0m5.123s
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+" : "" }' < input.txt | while read i; do [ "$i" ]; done
real 0m5.418s
user 0m4.670s
sys 0m1.012s
real 0m7.596s
user 0m9.484s
sys 0m5.123s
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+" : "" }' < input.txt | while read i; do [ "$i" ]; done
real 0m5.418s
user 0m4.670s
sys 0m1.012s
166デフォルトの名無しさん
2019/12/11(水) 01:47:25.15ID:5YQOA1oq 結果をファイルに吐き出すだけなら良いんだけどね、
その結果をシェルスクリプトを使って処理する場合の話
その結果をシェルスクリプトを使って処理する場合の話
167デフォルトの名無しさん
2019/12/11(水) 03:39:07.57ID:MgOCMEvC >>151
今年出た i5 9500
プロセッサー・ベース動作周波数 3.00 GHz
ターボ・ブースト利用時の最大周波数 4.40 GHz
あんまり変わらない気がする
シェルスクリプトなんかスレッド使わないだろうし
今年出た i5 9500
プロセッサー・ベース動作周波数 3.00 GHz
ターボ・ブースト利用時の最大周波数 4.40 GHz
あんまり変わらない気がする
シェルスクリプトなんかスレッド使わないだろうし
168デフォルトの名無しさん
2019/12/11(水) 07:28:04.35ID:hRzITiR9169デフォルトの名無しさん
2019/12/11(水) 08:22:26.35ID:6UY8oXji >>145
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
によると
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_01_02_01
の一覧の内,sizeof()函数,++及び--単項演算子,Selection・Interation・Jumpは実装しなくてよい
とあるから>はPOSIXの範疇だと思います。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
によると
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_01_02_01
の一覧の内,sizeof()函数,++及び--単項演算子,Selection・Interation・Jumpは実装しなくてよい
とあるから>はPOSIXの範疇だと思います。
170デフォルトの名無しさん
2019/12/11(水) 12:44:26.62ID:MgOCMEvC >>168
そりゃプロセスだろ
そりゃプロセスだろ
171デフォルトの名無しさん
2019/12/11(水) 13:32:50.85ID:hRzITiR9 >>170
今はCPUの話だからハイパースレッディングのスレッドだろう
今はCPUの話だからハイパースレッディングのスレッドだろう
172デフォルトの名無しさん
2019/12/11(水) 13:55:32.35ID:hRzITiR9173デフォルトの名無しさん
2019/12/11(水) 15:18:53.13ID:++mq81bA174デフォルトの名無しさん
2019/12/11(水) 15:22:46.18ID:++mq81bA プロセスが別のコアで動くとかか??
スレッドをハイパースレッディングのスレッドを指すなんて初めてみた
スレッドをハイパースレッディングのスレッドを指すなんて初めてみた
175デフォルトの名無しさん
2019/12/11(水) 15:28:13.91ID:hRzITiR9176デフォルトの名無しさん
2019/12/11(水) 15:29:58.09ID:hRzITiR9 >>174
普通にCPUの所に4コア8スレッドって書いてあるからさ
https://kakaku.com/pc/cpu/itemlist.aspx?pdf_se=22&pdf_Spec306=4
普通にCPUの所に4コア8スレッドって書いてあるからさ
https://kakaku.com/pc/cpu/itemlist.aspx?pdf_se=22&pdf_Spec306=4
177デフォルトの名無しさん
2019/12/11(水) 15:39:31.82ID:++mq81bA そこまで出されるとマジでスレッドという意味で使ってたんだな
OSも知らないスレッドだろう、OSから見てもただのコアだろう
OSも知らないスレッドだろう、OSから見てもただのコアだろう
178デフォルトの名無しさん
2019/12/11(水) 15:46:36.17ID:hRzITiR9179デフォルトの名無しさん
2019/12/11(水) 15:55:15.40ID:++mq81bA 一行目なんて書かなきゃならないのね
>>167もそんなスレッドのことを言ってないだろうに。なんでかなw
プロセスじゃなくスレッドならプロセス起動する無駄時間がないとかそういう意味でのだろうし、そもそもスレッドはそういうために
元々のネタがプロセス起動にどれだけ食われてるのかという話だな、するなら
>>167もそんなスレッドのことを言ってないだろうに。なんでかなw
プロセスじゃなくスレッドならプロセス起動する無駄時間がないとかそういう意味でのだろうし、そもそもスレッドはそういうために
元々のネタがプロセス起動にどれだけ食われてるのかという話だな、するなら
180デフォルトの名無しさん
2019/12/11(水) 16:11:12.77ID:6UY8oXji >>172
なるほど。確かに準拠してませんでした,すいません。
なるほど。確かに準拠してませんでした,すいません。
181デフォルトの名無しさん
2019/12/11(水) 20:23:56.94ID:MgOCMEvC182デフォルトの名無しさん
2019/12/12(木) 01:47:04.79ID:4Chv4WTd183デフォルトの名無しさん
2019/12/12(木) 02:33:13.07ID:NtLqNRlV184デフォルトの名無しさん
2019/12/12(木) 02:40:24.09ID:n05Ewb3K CPUのスペック比較とシェルスクリプトでスレッド使わないという話とどう関係あるの?
新しいCPUはOSスレッドを効率的に実行できる機能でもあるの?
新しいCPUはOSスレッドを効率的に実行できる機能でもあるの?
185デフォルトの名無しさん
2019/12/12(木) 03:38:37.48ID:g+q4RhTJ そうだよな。CPUの話をしていたのに
なんでスレッド使うかどうかの話をしたのかだよな
> 今年出た i5 9500
> プロセッサー・ベース動作周波数 3.00 GHz
> ターボ・ブースト利用時の最大周波数 4.40 GHz
> あんまり変わらない気がする
>
> シェルスクリプトなんかスレッド使わないだろうし
なんでスレッド使うかどうかの話をしたのかだよな
> 今年出た i5 9500
> プロセッサー・ベース動作周波数 3.00 GHz
> ターボ・ブースト利用時の最大周波数 4.40 GHz
> あんまり変わらない気がする
>
> シェルスクリプトなんかスレッド使わないだろうし
186デフォルトの名無しさん
2019/12/12(木) 03:41:30.87ID:g+q4RhTJ スレッド使わなくてもコア使うから関係あるだろって言えばよかったのか?
i5 9500の名前を出したのは、コア6スレッド6だからだろ?
i5 9500の名前を出したのは、コア6スレッド6だからだろ?
187デフォルトの名無しさん
2019/12/12(木) 08:10:01.85ID:NtLqNRlV >>184
最新のCPUにしたところで周波数がちょっと早くなった程度で差が無いって話
新しいCPUは同時実行スレッド数が増えてるとか言う奴がいるけどシェルスクリプトには関係ないだろ?
「どう関係あるの? 」とか言われても「関係ない」って最初から書いてんのに読めない訳?
最新のCPUにしたところで周波数がちょっと早くなった程度で差が無いって話
新しいCPUは同時実行スレッド数が増えてるとか言う奴がいるけどシェルスクリプトには関係ないだろ?
「どう関係あるの? 」とか言われても「関係ない」って最初から書いてんのに読めない訳?
188デフォルトの名無しさん
2019/12/12(木) 08:11:55.05ID:NtLqNRlV189デフォルトの名無しさん
2019/12/12(木) 09:49:29.49ID:AVYkL4QT 本気でシェルスクリプトとコアが関係ないと思ってるのか?
パイプ使ったら複数コア使うことになるんだが
例えばcat ファイル名 | grep なんとか ってやると
catのファイル表示と、grepが並列で動く
あとバックグラウンド実行もあるよね
自分が並列で動くものを書いてないからって、
シェルスクリプトと並列が関係ないわけじゃないだろ
自分が書かないって話をするならC言語だってコアは関係ない
パイプ使ったら複数コア使うことになるんだが
例えばcat ファイル名 | grep なんとか ってやると
catのファイル表示と、grepが並列で動く
あとバックグラウンド実行もあるよね
自分が並列で動くものを書いてないからって、
シェルスクリプトと並列が関係ないわけじゃないだろ
自分が書かないって話をするならC言語だってコアは関係ない
190デフォルトの名無しさん
2019/12/12(木) 09:52:07.59ID:AVYkL4QT あと、xargsとかGNU parallelとか
191デフォルトの名無しさん
2019/12/12(木) 10:19:43.03ID:mtFqZIGW それはプロセスレベルの並列化のお話。スレッドの話はどこいった?
192デフォルトの名無しさん
2019/12/12(木) 10:24:13.74ID:AVYkL4QT シェルスクリプトで外部コマンドを使わない場合の話でもしてるのか?
シェルスクリプトでパイプを使わないならコアは関係ない!
そんな事ありえないけど関係ないんだ!
みたいな話したってしょうがないだろ
それにパイプ使うのは foo | bar | baz みたいなシェル関数でも使えるし
シェル関数の中身はそれぞれこんな感じな
while read line
do
省略
done < ファイル名
外部コマンド一切なし
シェルスクリプトでパイプを使わないならコアは関係ない!
そんな事ありえないけど関係ないんだ!
みたいな話したってしょうがないだろ
それにパイプ使うのは foo | bar | baz みたいなシェル関数でも使えるし
シェル関数の中身はそれぞれこんな感じな
while read line
do
省略
done < ファイル名
外部コマンド一切なし
193デフォルトの名無しさん
2019/12/12(木) 10:24:48.46ID:AVYkL4QT >>191
今はCPUコアの話
今はCPUコアの話
194デフォルトの名無しさん
2019/12/12(木) 12:23:33.66ID:NxSFhA/k >コア6スレッド6だからだろ
それを言うならスレッド12だろ。ハイパースレッディングでスペック表すときの論理コア数をスレッドと言っているにすぎないだろうに
いつものやつが絡んでるだけだろうな、すぐに話を逸らすことからも
それを言うならスレッド12だろ。ハイパースレッディングでスペック表すときの論理コア数をスレッドと言っているにすぎないだろうに
いつものやつが絡んでるだけだろうな、すぐに話を逸らすことからも
195デフォルトの名無しさん
2019/12/12(木) 12:43:03.31ID:NxSFhA/k196デフォルトの名無しさん
2019/12/12(木) 12:57:42.86ID:NxSFhA/k >>195,183
>まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
いや、いまどきも1シェルプロセスは1スレッドしかなのか。仮にスレッド使う場合があったとしてもどういう場合というのはわからんな
確認せずにいまどきならと書いた、すまん
>まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
いや、いまどきも1シェルプロセスは1スレッドしかなのか。仮にスレッド使う場合があったとしてもどういう場合というのはわからんな
確認せずにいまどきならと書いた、すまん
197デフォルトの名無しさん
2019/12/12(木) 16:08:19.94ID:AVYkL4QT198デフォルトの名無しさん
2019/12/12(木) 16:10:23.64ID:AVYkL4QT199デフォルトの名無しさん
2019/12/12(木) 16:11:47.38ID:AVYkL4QT200デフォルトの名無しさん
2019/12/12(木) 16:24:20.77ID:AVYkL4QT ちなみに>>164-165とかはパイプを使ってるのでコア数は意味がある
例えばこれだとshプロセスが2つ起動して、それぞれCPUコアを使っている
time sh -c 'while read var; do echo $(($var)); done < input.txt | while read i; do [ $i -lt 0 ]; done'
例えばこれだとshプロセスが2つ起動して、それぞれCPUコアを使っている
time sh -c 'while read var; do echo $(($var)); done < input.txt | while read i; do [ $i -lt 0 ]; done'
201デフォルトの名無しさん
2019/12/12(木) 16:41:19.05ID:1H8k0UmA 自己文書化(?)されたシェルスクリプトの例
http://www.tip.net.au/wiki/index.php/Self_documenting_bash_script_options
もうちょっと洗練して、例えばhelp関数から実行するときはgettoptsコマンドを
ヘルプ出力用に書換えたものにするなんてこともできそう。
http://www.tip.net.au/wiki/index.php/Self_documenting_bash_script_options
もうちょっと洗練して、例えばhelp関数から実行するときはgettoptsコマンドを
ヘルプ出力用に書換えたものにするなんてこともできそう。
202デフォルトの名無しさん
2019/12/12(木) 16:43:22.79ID:AVYkL4QT203デフォルトの名無しさん
2019/12/12(木) 16:49:53.62ID:mtFqZIGW $ seq 1 inf | tail
を実行して別のターミナルで
$ top -1
を実行してみる。f キーを押して fields management 画面に進んで
"Last Used Cpu" を選んで表示させる様にするとプロセスがどの
CPUコアで実行されているか表示される
を実行して別のターミナルで
$ top -1
を実行してみる。f キーを押して fields management 画面に進んで
"Last Used Cpu" を選んで表示させる様にするとプロセスがどの
CPUコアで実行されているか表示される
204デフォルトの名無しさん
2019/12/12(木) 17:08:05.32ID:1H8k0UmA205デフォルトの名無しさん
2019/12/12(木) 17:46:32.53ID:3GyD1b3F206デフォルトの名無しさん
2019/12/12(木) 17:46:52.23ID:AVYkL4QT >>204
ああ、ヘルプの自動生成か。悩むところだよね。
簡単なのなら確かにそのリンク先みたいにできるだろうけど
時々例外的なコードはいるしさ、
とういうかリンク先、なんであんなよくわからんコードなんだ?
もっと簡潔にかけそうなんだが
txmp.txt? zenity?ん??GUI表示するため?
ああ、ヘルプの自動生成か。悩むところだよね。
簡単なのなら確かにそのリンク先みたいにできるだろうけど
時々例外的なコードはいるしさ、
とういうかリンク先、なんであんなよくわからんコードなんだ?
もっと簡潔にかけそうなんだが
txmp.txt? zenity?ん??GUI表示するため?
207デフォルトの名無しさん
2019/12/12(木) 17:48:26.91ID:AVYkL4QT208デフォルトの名無しさん
2019/12/12(木) 17:53:26.87ID:AVYkL4QT 試しに書いてみようかと思ってコピペしようとしたら画像やしw
209デフォルトの名無しさん
2019/12/12(木) 18:02:50.61ID:CkUjiG2X >>207
今回のハイパースレッディングでのスレッドを言い出し絡みまくりからは、ないな
今回のハイパースレッディングでのスレッドを言い出し絡みまくりからは、ないな
210デフォルトの名無しさん
2019/12/12(木) 18:16:03.44ID:n05Ewb3K211デフォルトの名無しさん
2019/12/12(木) 18:21:26.57ID:CkUjiG2X >>210
ん?オプティマイズが仮にあったとしても並列はしないだろう、あの文では
並列にになるように書いた「別の」スクリプトとは別の話だけど?
「え?」じゃなくどうスレッドの効果があるように思うの?みんなはスッキリするかもwだが俺はもやもやもやもやするぞw
ん?オプティマイズが仮にあったとしても並列はしないだろう、あの文では
並列にになるように書いた「別の」スクリプトとは別の話だけど?
「え?」じゃなくどうスレッドの効果があるように思うの?みんなはスッキリするかもwだが俺はもやもやもやもやするぞw
212デフォルトの名無しさん
2019/12/12(木) 18:22:28.30ID:AVYkL4QT >>201
やっつけ仕事w もっと正規表現頑張れば短くできそうだけど、やる気なしw
#!/bin/sh
print_opts() {
sed -nE '/\s+###START/,/\s+###END/ p' < "$1" | while read line; do
case $line in
"###"*) ;;
[0-9a-zA-Z]*)
echo -n "-${line%%)*}"
case $line in *"#"*) echo -n "${line#*#}"; esac
echo
;;
"#"*) echo " ${line#*#}" ;;
esac
done
}
while getopts "h456" optionName; do
case $optionName in
###START
h) print_opts "$0" ;;
4) ;; # negate
5) ;; # colorspace COLOR
# COLOR: RED ro GREEN or BLUE
6) ;; # sepia-tone
###END
esac
done
やっつけ仕事w もっと正規表現頑張れば短くできそうだけど、やる気なしw
#!/bin/sh
print_opts() {
sed -nE '/\s+###START/,/\s+###END/ p' < "$1" | while read line; do
case $line in
"###"*) ;;
[0-9a-zA-Z]*)
echo -n "-${line%%)*}"
case $line in *"#"*) echo -n "${line#*#}"; esac
echo
;;
"#"*) echo " ${line#*#}" ;;
esac
done
}
while getopts "h456" optionName; do
case $optionName in
###START
h) print_opts "$0" ;;
4) ;; # negate
5) ;; # colorspace COLOR
# COLOR: RED ro GREEN or BLUE
6) ;; # sepia-tone
###END
esac
done
213デフォルトの名無しさん
2019/12/12(木) 18:26:08.31ID:AVYkL4QT >>211
今シェルスクリプトの話をしてるんですよ?
という言い方をしておいて、特定のシェルスクリプトコードの話になるわけないし
例えばC言語で使うのは1コアだけだろうがと言われても「は?」としか思わん。
言ったあとで「特定のC言語のコードのことだよ」って弁解してもねw
最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
今シェルスクリプトの話をしてるんですよ?
という言い方をしておいて、特定のシェルスクリプトコードの話になるわけないし
例えばC言語で使うのは1コアだけだろうがと言われても「は?」としか思わん。
言ったあとで「特定のC言語のコードのことだよ」って弁解してもねw
最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
214デフォルトの名無しさん
2019/12/12(木) 18:33:38.18ID:CkUjiG2X215デフォルトの名無しさん
2019/12/12(木) 18:38:11.60ID:CkUjiG2X216デフォルトの名無しさん
2019/12/12(木) 18:57:21.35ID:CkUjiG2X CPU使い尽くす>>167改変版(やっつけ)
numparallels=8
time zsh -c 'var=1-2; sub () { i=0; while [ $i -lt '$((1000000 / $numparallels))' ]; do [ $(($var)) -lt 0 ]; : $((++i)); done; cat; echo "$1:$i" }; echo'"$(printf " | sub %d" $(seq $numparallels))"
まあ、やってることは何もないので分割並列しても何も問題ないが(そもそもスクリプトの目的としては問題ある)、仮にオプティマイズなんぞがあってもこんなことはしない(だろう)
現在のシェルはsubがプロセスだがスレッドを使っていたりしても、しないだろう
「え?」って何か他にスレッドの効果を出すやり方あるかなあ??スレッドを使ったとして
numparallels=8
time zsh -c 'var=1-2; sub () { i=0; while [ $i -lt '$((1000000 / $numparallels))' ]; do [ $(($var)) -lt 0 ]; : $((++i)); done; cat; echo "$1:$i" }; echo'"$(printf " | sub %d" $(seq $numparallels))"
まあ、やってることは何もないので分割並列しても何も問題ないが(そもそもスクリプトの目的としては問題ある)、仮にオプティマイズなんぞがあってもこんなことはしない(だろう)
現在のシェルはsubがプロセスだがスレッドを使っていたりしても、しないだろう
「え?」って何か他にスレッドの効果を出すやり方あるかなあ??スレッドを使ったとして
217デフォルトの名無しさん
2019/12/12(木) 19:01:40.02ID:AVYkL4QT218デフォルトの名無しさん
2019/12/12(木) 19:04:56.67ID:AVYkL4QT219デフォルトの名無しさん
2019/12/12(木) 19:06:01.30ID:CkUjiG2X220デフォルトの名無しさん
2019/12/12(木) 19:23:11.97ID:AVYkL4QT 語彙がおかしくなってる(笑)
221デフォルトの名無しさん
2019/12/12(木) 19:24:18.99ID:CkUjiG2X こういうやつwww
222デフォルトの名無しさん
2019/12/12(木) 22:51:40.18ID:1H8k0UmA223デフォルトの名無しさん
2019/12/13(金) 02:20:43.65ID:ysGzQi5M >>222
書いていて思ったけど、リンク先のやつ
s=$s" -negate" のsの使い方がわからんのよね
その後どう処理するか
それを入れるともっと複雑になるはずだが
それが書いてないからシンプルに見えちゃう
シェルスクリプトに限らないけど、オプション解析ライブラリはヘルプを
自動で作ろうとするけどそのヘルプを詳しく書こうとするととたんに見づらくなる気がする。
横にに長くなるんだよね。
逆の発想でPythonではヘルプを解析してオプション解析コードを生成するdocoptというものがある。
これのシェルスクリプト版でdocoptsというのもあるけど内部でgoバイナリを呼び出してて
シェルスクリプトネイティブじゃないのでちょっとダサい実装だったはず
https://github.com/docopt/docopts
こっちのほうが良い気がしてるがやっぱりヘルプにこだわりだすと、うーんって感じなので
結局、catで出力する方法で落ち着いてる。↓これね
cat<<HERE
Usage: ・・・
-a, --aaa aaaaaa
HERE
書いていて思ったけど、リンク先のやつ
s=$s" -negate" のsの使い方がわからんのよね
その後どう処理するか
それを入れるともっと複雑になるはずだが
それが書いてないからシンプルに見えちゃう
シェルスクリプトに限らないけど、オプション解析ライブラリはヘルプを
自動で作ろうとするけどそのヘルプを詳しく書こうとするととたんに見づらくなる気がする。
横にに長くなるんだよね。
逆の発想でPythonではヘルプを解析してオプション解析コードを生成するdocoptというものがある。
これのシェルスクリプト版でdocoptsというのもあるけど内部でgoバイナリを呼び出してて
シェルスクリプトネイティブじゃないのでちょっとダサい実装だったはず
https://github.com/docopt/docopts
こっちのほうが良い気がしてるがやっぱりヘルプにこだわりだすと、うーんって感じなので
結局、catで出力する方法で落ち着いてる。↓これね
cat<<HERE
Usage: ・・・
-a, --aaa aaaaaa
HERE
224デフォルトの名無しさん
2019/12/13(金) 02:37:48.49ID:r2S5lo/C HERE よりその文章全体の要約がUSAGEなので
END_USAGE とかにしたほうがちょっと読みやすい
END_USAGE とかにしたほうがちょっと読みやすい
225デフォルトの名無しさん
2019/12/13(金) 03:28:44.87ID:ysGzQi5M END_USAGEからはじまるで?
226デフォルトの名無しさん
2019/12/13(金) 12:27:46.56ID:aQIhFndX 素人がここで訊くのはアレだがコマンドのオプションってなんでああもガバガバなの
lsは-hvlみたいにまとめられるしどこにでも指定できるじゃない
shortとlongで仕様を決めたらしいがfindからして従ってないし
ddはそもそも出自が違うらしいから異質でも納得だけども
lsは-hvlみたいにまとめられるしどこにでも指定できるじゃない
shortとlongで仕様を決めたらしいがfindからして従ってないし
ddはそもそも出自が違うらしいから異質でも納得だけども
227デフォルトの名無しさん
2019/12/13(金) 16:35:44.26ID:oSsH2Kni >>222
偉そうな言い方になるけど,もしあのスクリプトの
[ ${_helpcnt:-0} -ge 1 ] && \
{ optdoc 'オプションtの解説'; continue; }
という部分が
helpdoc 'オプションtの解説'
みたいに一コマンドで完結していれば使いたくなったかも。
ところが関数の中でcontinueを使うと効果なくなるのよね……w
偉そうな言い方になるけど,もしあのスクリプトの
[ ${_helpcnt:-0} -ge 1 ] && \
{ optdoc 'オプションtの解説'; continue; }
という部分が
helpdoc 'オプションtの解説'
みたいに一コマンドで完結していれば使いたくなったかも。
ところが関数の中でcontinueを使うと効果なくなるのよね……w
228デフォルトの名無しさん
2019/12/13(金) 18:58:27.09ID:ysGzQi5M 個人的にはgetoptsはロングオプションが使えないから
それだけで候補にはならんなぁ
かと言ってgetoptはロングオプション使えるけど、
数を増やすと一行がどんどん長くなってしまうw
それだけで候補にはならんなぁ
かと言ってgetoptはロングオプション使えるけど、
数を増やすと一行がどんどん長くなってしまうw
229デフォルトの名無しさん
2019/12/13(金) 19:44:00.66ID:oSsH2Kni 寧ろgetoptはPOSIXに準拠しなくなってしまうから嫌だな。
コマンドの主要な部分でどうしても非POSIXコマンドに頼らざる得ないとかならともかく
オプション解析っていう割と副次的な部分の機能を高めるが為にわざわざ標準から逸脱したくない。
(あんまり拘るとキリないけどw)
コマンドの主要な部分でどうしても非POSIXコマンドに頼らざる得ないとかならともかく
オプション解析っていう割と副次的な部分の機能を高めるが為にわざわざ標準から逸脱したくない。
(あんまり拘るとキリないけどw)
230デフォルトの名無しさん
2019/12/13(金) 19:51:43.71ID:ysGzQi5M あ、getoptが良いって言ってるわけじゃないよw
getoptはロングオプションが使えるってのは
一見良いように思えるけど、引数が長くなるから
getoptsが一文字なのは、あえてそうなってるかもなってこと
getoptはロングオプションが使えるってのは
一見良いように思えるけど、引数が長くなるから
getoptsが一文字なのは、あえてそうなってるかもなってこと
231デフォルトの名無しさん
2019/12/13(金) 19:55:08.60ID:ysGzQi5M あとgetoptsもgetoptもだけどさ
使うことでオプション解析って楽になってる?
使わないで独自解析してるのも見かけるけどそれと大差ないように感じる
何が嬉しくてgetoptsもgetoptを使うんだろう?
使うことでオプション解析って楽になってる?
使わないで独自解析してるのも見かけるけどそれと大差ないように感じる
何が嬉しくてgetoptsもgetoptを使うんだろう?
232デフォルトの名無しさん
2019/12/13(金) 21:32:49.16ID:oSsH2Kni そりゃ多少なりとも手間が省けるからじゃない?
たしかに結局whileやらcase文やら多用してるから大差ないように思えるけど
-abc←こういう一つのハイフンの後に複数のオプションが指定されている場合を考慮したり
オプション引数があるときはshiftする個数変えたり……
みたいなことは少なくとも俺のような頭の弱い人間には保守・管理しにくい。
経験上,getoptsが使われている場合は,
自前でオプション解析してる場合よりも常套的な構文が使われてる(もうほぼほぼwhileとcaseの入れ子)
から,gettoptsによるオプション解析の部分は読み飛ばしてもOKっていうのは気分が楽w
たしかに結局whileやらcase文やら多用してるから大差ないように思えるけど
-abc←こういう一つのハイフンの後に複数のオプションが指定されている場合を考慮したり
オプション引数があるときはshiftする個数変えたり……
みたいなことは少なくとも俺のような頭の弱い人間には保守・管理しにくい。
経験上,getoptsが使われている場合は,
自前でオプション解析してる場合よりも常套的な構文が使われてる(もうほぼほぼwhileとcaseの入れ子)
から,gettoptsによるオプション解析の部分は読み飛ばしてもOKっていうのは気分が楽w
233デフォルトの名無しさん
2019/12/14(土) 11:52:21.09ID:gTK06/8e POSIX man(開発段階)の仕様書に
各企業が「よりよいヘルプ体系」(“better help system”)を付け加えることに意欲的である
っていう文章があるんだけど
このよりよいヘルプ体系について具体的に論じてるページとか知りませんか。
各企業が「よりよいヘルプ体系」(“better help system”)を付け加えることに意欲的である
っていう文章があるんだけど
このよりよいヘルプ体系について具体的に論じてるページとか知りませんか。
234デフォルトの名無しさん
2019/12/14(土) 12:02:40.53ID:q2HhYeOb ドキュメントはもうウェブサイトで用意したほうが良いよ
235デフォルトの名無しさん
2019/12/14(土) 20:55:20.00ID:gTK06/8e236デフォルトの名無しさん
2019/12/14(土) 21:20:20.57ID:6YH7rFov オフラインダウンロード機能でもあればいいだけじゃん
manの表現力は低いわけだし、いまどき画像表示できるマシンを
誰だって持ってるのに、テキストベースに拘る必要はない
開発者とかろくにメンテしないし、多言語化なんてまず無理
wikipediaのマニュアル特化型みたいにして一元管理
MDNが特定のブラウザの特定バージョンでの実装まで書いてあるのと同じように
バージョン違いもLinux版とかBSD版の違いも全部網羅したほうが良いよ。
古いバージョンのドキュメントは、新しい機能のことまで書いてないしね。
ドキュメントは分離して最新のものを常に更新していったほうが良い
manの表現力は低いわけだし、いまどき画像表示できるマシンを
誰だって持ってるのに、テキストベースに拘る必要はない
開発者とかろくにメンテしないし、多言語化なんてまず無理
wikipediaのマニュアル特化型みたいにして一元管理
MDNが特定のブラウザの特定バージョンでの実装まで書いてあるのと同じように
バージョン違いもLinux版とかBSD版の違いも全部網羅したほうが良いよ。
古いバージョンのドキュメントは、新しい機能のことまで書いてないしね。
ドキュメントは分離して最新のものを常に更新していったほうが良い
237デフォルトの名無しさん
2019/12/14(土) 23:05:33.87ID:gTK06/8e まあ「いつのバージョンについていつ書かれたものか」みたいなのは簡単に確認できるようになるといいね。
RDFとか利用するとWebとの相性も良さそう。
RDFとか利用するとWebとの相性も良さそう。
238デフォルトの名無しさん
2019/12/15(日) 02:19:32.16ID:a0yEED8b >>237
バージョン間で違いが大きすぎるのは別として、
ドキュメント一つで全バージョンを網羅すべきだと思う
このオプションはバージョンいくつ以上から使用可能ですとか
ドキュメントにおいて存在すべきなのは最新のドキュメント一つのみ
バージョンや特定の実装に依存しない。
シェルでもdash用とかbash用とか別々に作るのは無駄だよ。
この機能はbash専用ですとか書いてあれば、一つ見るだけでよくなるし注意点もわかる
別々に作られてたら、あれこれdashで使えるんだっけ?とかなるし
バージョン間で違いが大きすぎるのは別として、
ドキュメント一つで全バージョンを網羅すべきだと思う
このオプションはバージョンいくつ以上から使用可能ですとか
ドキュメントにおいて存在すべきなのは最新のドキュメント一つのみ
バージョンや特定の実装に依存しない。
シェルでもdash用とかbash用とか別々に作るのは無駄だよ。
この機能はbash専用ですとか書いてあれば、一つ見るだけでよくなるし注意点もわかる
別々に作られてたら、あれこれdashで使えるんだっけ?とかなるし
239デフォルトの名無しさん
2019/12/15(日) 03:19:52.38ID:woT0VW+T240デフォルトの名無しさん
2019/12/15(日) 04:20:02.09ID:3SLEzfiL■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【国際法を無視】日本での「中華人民共和国に台湾問題を論じる資格なし」との声に 中国外交部が厳しく反論… ★2 [BFU★]
- 【ネット民のツッコミ】立憲・野田代表の「事実上の撤回」発言がトレンド、「高市さんそんな事は言ってない」「流石に無理あるだろw」 [1ゲットロボ★]
- 【工作員】「X」のアカウント所在地公開機能が暴いた世論操作の実態 MAGA支持著名アカウントの多くが米国外から運営 日本にも波及 ★3 [ごまカンパチ★]
- 生クリームだけの真っ白なクリスマスケーキ 大手メーカーが販売、その理由は…フルーツなしで価格は半額以下に ★3 [おっさん友の会★]
- 【文春】元TOKIO・国分太一(51)「女性スタッフ2名への“わいせつ事案”」日テレ事情聴取の全貌が分かった! ★5 [Ailuropoda melanoleuca★]
- 国分太一 騒動で「数日間の間で全てを失った」 涙ながらに率直な心境吐露 [Anonymous★]
- まったりまったりおじゃる丸待機スレ🏡
- どうしたらおまえが苦しむか、人生を踏み躙れるか
- ズッシリ重たくてもったりとした食感のプリン
- 中国外務省「全く不十分だ。ごまかすような手口を使うべきではない」高市答弁を批判 [834922174]
- 今日からPython勉強する
- コンビニバイトしてるんだが袋いるか聞いても何も答えないのに後から袋つけろてキレてくる奴何なの?
