シェルスクリプト総合 その32

■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。

シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
2019/12/05(木) 15:58:33.95ID:TzSLtKO4
>>140-141
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。

ありがとうございました!
143デフォルトの名無しさん
垢版 |
2019/12/06(金) 20:34:56.63ID:08yg4gJX
宇宙刑事シェバン
2019/12/10(火) 22:30:09.16ID:zD6aLrgM
x-y
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。

思い付いたのは
[ ${var%-*} -lt ${var#*-} ]

$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。
2019/12/10(火) 23:18:51.56ID:kdXCWOtW
$((var < 0))はPOSIX準拠じゃなくね?

やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
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秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
2019/12/10(火) 23:25:16.53ID:SL+fGedD
echo "$var<0"|bc
2019/12/10(火) 23:28:35.11ID:kdXCWOtW
bcプロセス起動してるから遅い
それは実行しなくてもわかる
2019/12/10(火) 23:50:31.02ID:kdXCWOtW
あとオマケ、速いとは思えないけど

IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2

これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
2019/12/10(火) 23:51:59.49ID:LOypIkS3
>>146
それ100万やったら50秒かかったわ
10万で5秒だしawk使うわ
2019/12/10(火) 23:59:28.15ID:kdXCWOtW
>>150
えらい遅いなw
俺のなんて2012年発売のCPUだぞ。
i7 3770。3.40Ghz(ブースト時で3.9Ghz)
2019/12/11(水) 00:00:32.26ID:ivhCTlPt
i7 3.4Ghzって今どき低スペックなのか?
ハイスペックかと思ってた
2019/12/11(水) 00:00:55.23ID:5YQOA1oq
>>150
awkつかうなら、awkのコード書いてみてくれ
実行してみる。
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
2019/12/11(水) 00:11:26.60ID:ivhCTlPt
>>154
凄い時代になったなw
いつのまにか皆さんハッピーになってた
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遅すぎ・・・
2019/12/11(水) 00:21:29.42ID:5YQOA1oq
>>156
うちもcygwinだとそんな感じだわw msysも
WSLは全然速度変わらないのにな

本質的にCPUだけで処理できる内容のはずだが
なにかシステムコール呼び出してるんだろうな
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秒くらいになる
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

まあ速いんだろうけどさ。想定の範囲内かな。
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
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
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
2019/12/11(水) 00:54:49.86ID:5YQOA1oq
> 対象の文字列は標準出力ではなくて変数に格納されています。

お前らこの条件忘れてるだろw
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
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
2019/12/11(水) 01:47:25.15ID:5YQOA1oq
結果をファイルに吐き出すだけなら良いんだけどね、
その結果をシェルスクリプトを使って処理する場合の話
2019/12/11(水) 03:39:07.57ID:MgOCMEvC
>>151
今年出た i5 9500
プロセッサー・ベース動作周波数 3.00 GHz
ターボ・ブースト利用時の最大周波数 4.40 GHz
あんまり変わらない気がする

シェルスクリプトなんかスレッド使わないだろうし
2019/12/11(水) 07:28:04.35ID:hRzITiR9
>>167
スレッドバリバリ使ってるぞw
| つかうと必然的にスレッドになるしな
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の範疇だと思います。
2019/12/11(水) 12:44:26.62ID:MgOCMEvC
>>168
そりゃプロセスだろ
2019/12/11(水) 13:32:50.85ID:hRzITiR9
>>170
今はCPUの話だからハイパースレッディングのスレッドだろう
2019/12/11(水) 13:55:32.35ID:hRzITiR9
>>169
POSIX準拠じゃないのでは?と言ってるのは
$((var < 0)) のvarは数値限定ってところだよ
2019/12/11(水) 15:18:53.13ID:++mq81bA
>>171
> | つかうと
じゃないの。普通は子プロセスだろう
2019/12/11(水) 15:22:46.18ID:++mq81bA
プロセスが別のコアで動くとかか??
スレッドをハイパースレッディングのスレッドを指すなんて初めてみた
2019/12/11(水) 15:28:13.91ID:hRzITiR9
>>173
文句は>>167に言ってくれ。合わせただけ
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
2019/12/11(水) 15:39:31.82ID:++mq81bA
そこまで出されるとマジでスレッドという意味で使ってたんだな
OSも知らないスレッドだろう、OSから見てもただのコアだろう
2019/12/11(水) 15:46:36.17ID:hRzITiR9
>>167涙目www

でよろしいか?
俺に言うなって
2019/12/11(水) 15:55:15.40ID:++mq81bA
一行目なんて書かなきゃならないのね
>>167もそんなスレッドのことを言ってないだろうに。なんでかなw

プロセスじゃなくスレッドならプロセス起動する無駄時間がないとかそういう意味でのだろうし、そもそもスレッドはそういうために
元々のネタがプロセス起動にどれだけ食われてるのかという話だな、するなら
2019/12/11(水) 16:11:12.77ID:6UY8oXji
>>172
なるほど。確かに準拠してませんでした,すいません。
2019/12/11(水) 20:23:56.94ID:MgOCMEvC
>>175
いや、あってないから
勘弁してくれ
2019/12/12(木) 01:47:04.79ID:4Chv4WTd
>>181
シェルスクリプトでスレッドってどういう事?
スレッド使わなくてもコアは使うじゃん。
2019/12/12(木) 02:33:13.07ID:NtLqNRlV
>>182
なんでオレに聞くんだよ
シェルスクリプトはスレッド使わないって当然のこと言っただけじゃないか
なんで頭悪い奴が絡んでくるんだよ気持ち悪いな
2019/12/12(木) 02:40:24.09ID:n05Ewb3K
CPUのスペック比較とシェルスクリプトでスレッド使わないという話とどう関係あるの?
新しいCPUはOSスレッドを効率的に実行できる機能でもあるの?
2019/12/12(木) 03:38:37.48ID:g+q4RhTJ
そうだよな。CPUの話をしていたのに
なんでスレッド使うかどうかの話をしたのかだよな

> 今年出た i5 9500
> プロセッサー・ベース動作周波数 3.00 GHz
> ターボ・ブースト利用時の最大周波数 4.40 GHz
> あんまり変わらない気がする
>
> シェルスクリプトなんかスレッド使わないだろうし
2019/12/12(木) 03:41:30.87ID:g+q4RhTJ
スレッド使わなくてもコア使うから関係あるだろって言えばよかったのか?
i5 9500の名前を出したのは、コア6スレッド6だからだろ?
2019/12/12(木) 08:10:01.85ID:NtLqNRlV
>>184
最新のCPUにしたところで周波数がちょっと早くなった程度で差が無いって話

新しいCPUは同時実行スレッド数が増えてるとか言う奴がいるけどシェルスクリプトには関係ないだろ?
「どう関係あるの? 」とか言われても「関係ない」って最初から書いてんのに読めない訳?
2019/12/12(木) 08:11:55.05ID:NtLqNRlV
>>186
頭悪いなー
シェルスクリプトで使うのは1コアだけだろうが
2019/12/12(木) 09:49:29.49ID:AVYkL4QT
本気でシェルスクリプトとコアが関係ないと思ってるのか?
パイプ使ったら複数コア使うことになるんだが

例えばcat ファイル名 | grep なんとか ってやると
catのファイル表示と、grepが並列で動く

あとバックグラウンド実行もあるよね

自分が並列で動くものを書いてないからって、
シェルスクリプトと並列が関係ないわけじゃないだろ
自分が書かないって話をするならC言語だってコアは関係ない
2019/12/12(木) 09:52:07.59ID:AVYkL4QT
あと、xargsとかGNU parallelとか
2019/12/12(木) 10:19:43.03ID:mtFqZIGW
それはプロセスレベルの並列化のお話。スレッドの話はどこいった?
2019/12/12(木) 10:24:13.74ID:AVYkL4QT
シェルスクリプトで外部コマンドを使わない場合の話でもしてるのか?

シェルスクリプトでパイプを使わないならコアは関係ない!
そんな事ありえないけど関係ないんだ!
みたいな話したってしょうがないだろ


それにパイプ使うのは foo | bar | baz みたいなシェル関数でも使えるし
シェル関数の中身はそれぞれこんな感じな
while read line
do
 省略
done < ファイル名

外部コマンド一切なし
2019/12/12(木) 10:24:48.46ID:AVYkL4QT
>>191
今はCPUコアの話
2019/12/12(木) 12:23:33.66ID:NxSFhA/k
>コア6スレッド6だからだろ
それを言うならスレッド12だろ。ハイパースレッディングでスペック表すときの論理コア数をスレッドと言っているにすぎないだろうに
いつものやつが絡んでるだけだろうな、すぐに話を逸らすことからも
2019/12/12(木) 12:43:03.31ID:NxSFhA/k
>>183
まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
シェルスクリプトを書いてどこがスレッドとか全然わからん、どうスクリプト書けばスレッドになるのかなんて全然わからないとこではあるので、そういう意味ではスレッド使わないと言えるだろうけど

また、>>146にスレッドの効果なんて期待できないだろう。子プロセスがんがん起動しているわけでもなさそうだし、並列化なんてできそうもないスクリプトのようだからね

使ってる環境のshの実態がなんによるかが大きいんじゃないのかな?bashはかなり遅い感じかなあ
2019/12/12(木) 12:57:42.86ID:NxSFhA/k
>>195,183
>まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
いや、いまどきも1シェルプロセスは1スレッドしかなのか。仮にスレッド使う場合があったとしてもどういう場合というのはわからんな
確認せずにいまどきならと書いた、すまん
2019/12/12(木) 16:08:19.94ID:AVYkL4QT
>>194
i5 9500は6コア6スレッド
なんでこういつも思い込みで発言するかな?

URL貼れないから「インテルR Core? i5-9500 プロセッサー」からググれ
2019/12/12(木) 16:10:23.64ID:AVYkL4QT
>>195
OSのスレッドは使ってなくても、
CPUのコア数が多ければ、シェルスクリプトでそれを使えるから
コア数の数はシェルスクリプトでも意味があるよって話
2019/12/12(木) 16:11:47.38ID:AVYkL4QT
>>105
> なんでこういつも思い込みで発言するかな?
そりゃそうやろw

ただの1-2の計算なんか、どんな言語使っても
スレッドの効果なんてねーよw
言語じゃなくてやる処理の問題
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'
2019/12/12(木) 16:41:19.05ID:1H8k0UmA
自己文書化(?)されたシェルスクリプトの例
http://www.tip.net.au/wiki/index.php/Self_documenting_bash_script_options
もうちょっと洗練して、例えばhelp関数から実行するときはgettoptsコマンドを
ヘルプ出力用に書換えたものにするなんてこともできそう。
2019/12/12(木) 16:43:22.79ID:AVYkL4QT
>>201
それ何が嬉しいん?
ロングオプションがあればいいだけの話?
2019/12/12(木) 16:49:53.62ID:mtFqZIGW
$ seq 1 inf | tail

を実行して別のターミナルで

$ top -1

を実行してみる。f キーを押して fields management 画面に進んで
"Last Used Cpu" を選んで表示させる様にするとプロセスがどの
CPUコアで実行されているか表示される
2019/12/12(木) 17:08:05.32ID:1H8k0UmA
>>202
わざわざヘルプを別個に書かないでも
gettopts ... case ...
↑この行を解析できるようになれば
半自動的にヘルプが生成できる(のでは)ってことじゃない?
2019/12/12(木) 17:46:32.53ID:3GyD1b3F
>>197
ああ、ハイパースレッディングなんてないCPUか。そりゃすまん

わざわざコア6スレッド6なんて書く必要ないだろう、そのスレッドの所以たるハイパースレッディングなんてないんだから、ただのコア6だな
ハイパースレッディングがあるCPUと並列したりする場合にあった方がハイパースレッディングが無いという意味でわざわざ書くぐらいだろう

ハイパースレッディングなんて名前が悪いなw(まあ、CPU内部でやってることはスレッディングなんだろけど)

>>199言い足りなかったのねwやはりいつものか
2019/12/12(木) 17:46:52.23ID:AVYkL4QT
>>204
ああ、ヘルプの自動生成か。悩むところだよね。
簡単なのなら確かにそのリンク先みたいにできるだろうけど
時々例外的なコードはいるしさ、

とういうかリンク先、なんであんなよくわからんコードなんだ?
もっと簡潔にかけそうなんだが
txmp.txt? zenity?ん??GUI表示するため?
2019/12/12(木) 17:48:26.91ID:AVYkL4QT
>>205
コア6(ハイパースレッドなし) と書くよりも
コア6 スレッド6 の方が明確で短いだろw
2019/12/12(木) 17:53:26.87ID:AVYkL4QT
試しに書いてみようかと思ってコピペしようとしたら画像やしw
2019/12/12(木) 18:02:50.61ID:CkUjiG2X
>>207
今回のハイパースレッディングでのスレッドを言い出し絡みまくりからは、ないな
2019/12/12(木) 18:16:03.44ID:n05Ewb3K
>>188
>頭悪いなー
>シェルスクリプトで使うのは1コアだけだろうが
えっ?

>>195
>また、>>146にスレッドの効果なんて期待できないだろう
えっ?

話が噛み合ってなかった理由がわかってみんなスッキリだね
2019/12/12(木) 18:21:26.57ID:CkUjiG2X
>>210
ん?オプティマイズが仮にあったとしても並列はしないだろう、あの文では
並列にになるように書いた「別の」スクリプトとは別の話だけど?

「え?」じゃなくどうスレッドの効果があるように思うの?みんなはスッキリするかもwだが俺はもやもやもやもやするぞw
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
2019/12/12(木) 18:26:08.31ID:AVYkL4QT
>>211
今シェルスクリプトの話をしてるんですよ?

という言い方をしておいて、特定のシェルスクリプトコードの話になるわけないし

例えばC言語で使うのは1コアだけだろうがと言われても「は?」としか思わん。
言ったあとで「特定のC言語のコードのことだよ」って弁解してもねw

最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
2019/12/12(木) 18:33:38.18ID:CkUjiG2X
ああ、>>184なのかそもそもは
スレッド使ってなんか賢いことしてたら、プロセス起動する時間や並列なんぞで速くなるとか思ったのだろう、よくわからんけどw
(スレッド使えば速くなると思いがちというのはありがち)

スレッドでうまいことやっていたとしても、>>146にスレッドの効果なんて期待できないだろうということだよ。>>167のその部分の否定だよ、やんわりとしたw
で、「え?」って?


>>213
イミフ。何をいいたいのかな?C??妄想すぎるな
2019/12/12(木) 18:38:11.60ID:CkUjiG2X
>>213
ああ、誰かと同一人物だと思ってる??違うよ
>>167だって、>>170と言っているだろう(プロセスで並列処理だろう)、
>最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
とんちんかんな決めつけだろうなw
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がプロセスだがスレッドを使っていたりしても、しないだろう

「え?」って何か他にスレッドの効果を出すやり方あるかなあ??スレッドを使ったとして
2019/12/12(木) 19:01:40.02ID:AVYkL4QT
>>215

↓こいつが馬鹿だって言ってる。

>>188
> シェルスクリプトで使うのは1コアだけだろうが

並列処理しないコードはコアを使わないと言われても
どんな言語でも当たり前としか言えない。そういう話
2019/12/12(木) 19:04:56.67ID:AVYkL4QT
>>214

>>167が言うには「シェルスクリプトでスレッドを使わない」(このスレッドとはハイパースレッディングのスレッドの意味)

正しい答えはシェルスクリプトでも並列処理できるし。マルチコアを使い切ることも可能。
2019/12/12(木) 19:06:01.30ID:CkUjiG2X
>>217,218
お前には聞いてない。最初からそう思っているおもいっきりばかにしたくてなんだろ?
そんなやつの言うことはww 変に勝手に決めつける点からも明らかに
2019/12/12(木) 19:23:11.97ID:AVYkL4QT
語彙がおかしくなってる(笑)
2019/12/12(木) 19:24:18.99ID:CkUjiG2X
こういうやつwww
2019/12/12(木) 22:51:40.18ID:1H8k0UmA
>>201
>>212

俺も作ってみた。
改良どころか根本的な書き直しが必要かもw
https://paste.ubuntu.com/p/wDwt8mWZrx/
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
2019/12/13(金) 02:37:48.49ID:r2S5lo/C
HERE よりその文章全体の要約がUSAGEなので
END_USAGE とかにしたほうがちょっと読みやすい
2019/12/13(金) 03:28:44.87ID:ysGzQi5M
END_USAGEからはじまるで?
2019/12/13(金) 12:27:46.56ID:aQIhFndX
素人がここで訊くのはアレだがコマンドのオプションってなんでああもガバガバなの
lsは-hvlみたいにまとめられるしどこにでも指定できるじゃない
shortとlongで仕様を決めたらしいがfindからして従ってないし
ddはそもそも出自が違うらしいから異質でも納得だけども
2019/12/13(金) 16:35:44.26ID:oSsH2Kni
>>222
偉そうな言い方になるけど,もしあのスクリプトの
[ ${_helpcnt:-0} -ge 1 ] && \
{ optdoc 'オプションtの解説'; continue; }
という部分が
helpdoc 'オプションtの解説'
みたいに一コマンドで完結していれば使いたくなったかも。
ところが関数の中でcontinueを使うと効果なくなるのよね……w
2019/12/13(金) 18:58:27.09ID:ysGzQi5M
個人的にはgetoptsはロングオプションが使えないから
それだけで候補にはならんなぁ
かと言ってgetoptはロングオプション使えるけど、
数を増やすと一行がどんどん長くなってしまうw
2019/12/13(金) 19:44:00.66ID:oSsH2Kni
寧ろgetoptはPOSIXに準拠しなくなってしまうから嫌だな。
コマンドの主要な部分でどうしても非POSIXコマンドに頼らざる得ないとかならともかく
オプション解析っていう割と副次的な部分の機能を高めるが為にわざわざ標準から逸脱したくない。
(あんまり拘るとキリないけどw)
2019/12/13(金) 19:51:43.71ID:ysGzQi5M
あ、getoptが良いって言ってるわけじゃないよw

getoptはロングオプションが使えるってのは
一見良いように思えるけど、引数が長くなるから
getoptsが一文字なのは、あえてそうなってるかもなってこと
2019/12/13(金) 19:55:08.60ID:ysGzQi5M
あとgetoptsもgetoptもだけどさ
使うことでオプション解析って楽になってる?
使わないで独自解析してるのも見かけるけどそれと大差ないように感じる
何が嬉しくてgetoptsもgetoptを使うんだろう?
2019/12/13(金) 21:32:49.16ID:oSsH2Kni
そりゃ多少なりとも手間が省けるからじゃない?
たしかに結局whileやらcase文やら多用してるから大差ないように思えるけど
-abc←こういう一つのハイフンの後に複数のオプションが指定されている場合を考慮したり
オプション引数があるときはshiftする個数変えたり……
みたいなことは少なくとも俺のような頭の弱い人間には保守・管理しにくい。
経験上,getoptsが使われている場合は,
自前でオプション解析してる場合よりも常套的な構文が使われてる(もうほぼほぼwhileとcaseの入れ子)
から,gettoptsによるオプション解析の部分は読み飛ばしてもOKっていうのは気分が楽w
2019/12/14(土) 11:52:21.09ID:gTK06/8e
POSIX man(開発段階)の仕様書に
各企業が「よりよいヘルプ体系」(“better help system”)を付け加えることに意欲的である
っていう文章があるんだけど
このよりよいヘルプ体系について具体的に論じてるページとか知りませんか。
2019/12/14(土) 12:02:40.53ID:q2HhYeOb
ドキュメントはもうウェブサイトで用意したほうが良いよ
2019/12/14(土) 20:55:20.00ID:gTK06/8e
$ man foo
please see http://example.com/foo

ってかw
ネットワーク環境がなかったり貧弱だったりする環境は無視ですかい?
2019/12/14(土) 21:20:20.57ID:6YH7rFov
オフラインダウンロード機能でもあればいいだけじゃん
manの表現力は低いわけだし、いまどき画像表示できるマシンを
誰だって持ってるのに、テキストベースに拘る必要はない

開発者とかろくにメンテしないし、多言語化なんてまず無理
wikipediaのマニュアル特化型みたいにして一元管理

MDNが特定のブラウザの特定バージョンでの実装まで書いてあるのと同じように
バージョン違いもLinux版とかBSD版の違いも全部網羅したほうが良いよ。

古いバージョンのドキュメントは、新しい機能のことまで書いてないしね。
ドキュメントは分離して最新のものを常に更新していったほうが良い
2019/12/14(土) 23:05:33.87ID:gTK06/8e
まあ「いつのバージョンについていつ書かれたものか」みたいなのは簡単に確認できるようになるといいね。
RDFとか利用するとWebとの相性も良さそう。
2019/12/15(日) 02:19:32.16ID:a0yEED8b
>>237
バージョン間で違いが大きすぎるのは別として、
ドキュメント一つで全バージョンを網羅すべきだと思う
このオプションはバージョンいくつ以上から使用可能ですとか

ドキュメントにおいて存在すべきなのは最新のドキュメント一つのみ
バージョンや特定の実装に依存しない。

シェルでもdash用とかbash用とか別々に作るのは無駄だよ。
この機能はbash専用ですとか書いてあれば、一つ見るだけでよくなるし注意点もわかる
別々に作られてたら、あれこれdashで使えるんだっけ?とかなるし
2019/12/15(日) 03:19:52.38ID:woT0VW+T
ソフトウェア作ってるのはそんなの気にしないだろう
拡張部分で同じだがちょっと違うとは普通にあるのだし
やるのは他の誰か必要と思ったのがやるもんだろな、たとえば>>238
2019/12/15(日) 04:20:02.09ID:3SLEzfiL
>>238
昔のバージョンの動作に問題があったとしても、そこに誰が手を加えるのかって話があるのでまとめるのには無理があると思う。
いつ書いた物で、その当時の最善を尽くした、がお互い(作る方と使う方で)
許容できる最善手じゃないのか?まあつまり>>237の言ってることだがw
2019/12/15(日) 04:35:07.70ID:a0yEED8b
>>240
wikipedia方式で良いんじゃね?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況