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

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

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

シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
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方式で良いんじゃね?
2019/12/15(日) 10:01:39.28ID:E44EqLgR
Wikipedia方式ってのがよく分からんけど
かなり自由に編集できて,既定で最新版が表示されるけど変更履歴が辿れるっていう方式ならいいね。
↑これはwiki全般に言えることだから寧ろコマンドwikiって言ったほうが適切か。

で,Wikipediaの方針をもっと厳しくして
様式を完全に統一したり典拠や変更コメントを必須にしたりしたら
自由に編集できる利点はそのまましっかりした文書になりそう。

という訳で誰かそういうwiki作ってw
2019/12/15(日) 11:36:59.02ID:pTp+dpJs
必要性を感じた者がやるんだよ! 頑張れ!
2019/12/16(月) 00:44:09.03ID:5wUpgmce
日本語manだけ更新日が1990年代
英語manだけなぜかBSD版
--helpと言ってることが違う
これ食らってから正直manには期待していない
infoの日本語化って無理なのか?あっちも使いにくいが
2019/12/16(月) 07:48:45.99ID:4GuGuHT1
逆になぜinfoは信頼できると思ったのか
2019/12/17(火) 13:48:36.21ID:BxEORdhA
infoを使用すると完全なマニュアルを読むことができるはずだ。ってmanにあるくせにそれ言うのか
247デフォルトの名無しさん
垢版 |
2019/12/17(火) 22:02:31.85ID:kdkfgKcy
>>244
なければ作るとよい
2019/12/18(水) 18:56:56.67ID:Cw3S1jU2
manはそんなに難しい英語ではない
マニュアルとしてはとてもよく書けている
これを英語で読めないんだと、そもそもマニュアルを
読み取るのが難しい国語レベルかと
2019/12/18(水) 19:39:48.69ID:uFDqtnkl
日本語の問題とman自身の問題は別の話でしょう?

英語圏の人がmanを使ったときの問題は
テキストベースだから使いづらい。
HTMLではないから使いづらい。
画像がないから分かりづらい。
そういった点でしょう?

日本語の問題はワークフローの問題だよ。
まず世の中英語と日本語だけじゃない無数に言語がある。
アプリの新バージョンを作ったときに翻訳してからじゃないとリリースできない
ってのは無いと思うし、翻訳だけしたらバージョンアップというのもおかしな話
(例えば--helpの内容とか)

アプリとそのマニュアルは本来別でリリースすべきなんだろう
2019/12/19(木) 10:03:23.50ID:y7Q/2NKF
マニュアルとプログラム本体が一緒くたにされてる今でもマニュアルの内容が古いとか
書いてることと実際の動作が違うとか問題が多発してるのに
分けようなんて言いだしたらもはや二者の乖離が酷すぎて、だれもマニュアルなんて読もうとしなくなる
……っは!もしやそれが狙いか?w
2019/12/19(木) 11:24:35.20ID:belDjs1+
まぁ指摘される度にお前がやれだの英語で読めだの言うけどそれ諦めてるよね
逃げ口上というか捨て台詞というか負け惜しみというか
2019/12/19(木) 16:35:50.82ID:jArWapvD
OSS
言い出しっぺがやるというだけだろ
指摘ってなにが目的なんだか。俺がか?
2019/12/19(木) 18:30:09.45ID:4hkxYlHE
bashで関数名に使える文字と使えない文字ってこれであってる?

・使える
アルファベット、ASCII文字以外 (制御文字は知らんw)
- = ~ [ ] : , . _ /
% (ジョブ機能が有効だと呼び出せない?)
数字 @ (単体はダメ)
# ^ { } (始まっているものはダメ)
+ * ?(終わるものはダメ)

・使えない
! " $ & ' ( ) \ | ` < > ; スペース

何だこのカオスwww
2019/12/19(木) 18:38:08.39ID:UoMpZOx6
関数名には記号を使わないのが基本だ
使っていいのは _ ぐらい
あとは紛らわしくてしょうがない
可読性が著しく下がる
2019/12/21(土) 20:28:47.93ID:X9+p8H27
func() {
 foo "123$@"
}

って書いて、func a b c と実行すると
foo 123a b c という呼び出しになるという仕様
奇妙だなって思ってたけど理由に気づいた

func() {
 tar "v$@"
}

func zxf file.tar.gz ってやった時
tar vzxf file.tar.gz とするために必要な仕様なんだ

はー、よくできてんなー。
シェルスクリプトってなんとなくいきあたりばったりで
作られたように見えるのによく練られた仕様だと思うよ
2019/12/22(日) 11:21:06.45ID:JDtuJK73
むしろそうじゃない方が例外的な動作で奇妙に見えるけど
""の内側で$@は引数に展開されるし
"str$var"←こういう引用符だったら文字列と引数はくっ付いて表示される。
2019/12/22(日) 11:45:14.20ID:JDtuJK73
sedでC言語中の#includeディレクティブを無効化したいんだけど
sed \
-e ':a' -e '/^#[[:blank:]]*include.*\\$/N;/\\\n/d;ta' \
-e '/^#[[:blank:]]*include.*/d'
↑これで対処できるかな。
2019/12/22(日) 12:51:34.17ID:O05uH48x
>>256
他の言語だったら、文字列+文字列の配列 の場合に
エラーかもしくは配列の要素が一つ増えるって考えるでしょ?
文字列の配列の一番目に、結合されるって仕様はなかなか思いつかないと思うよ
2019/12/22(日) 15:12:02.64ID:JDtuJK73
>>258
なるほど。

ただ、$@って配列変数じゃない気がするわ。
単に引数が空白区切りで格納されてるだけで。
↑じゃあ配列と何が違うんだと言われると難しいけどw
配列だとおこりえない挙動を示せるいい例が思い付かないので。
2019/12/22(日) 15:49:52.02ID:9GUBQyj0
>>257
t は s の結果に依存するのでそこで使うのは適切ではないと思われる。
sed でやるならこんな感じか。

#!/bin/sed -f
/^#[[:blank:]]*include/!b
:L0
/\\$/{N;b L0}
d
2019/12/22(日) 16:03:17.69ID:XO28QfbO
削除じゃなくてコメントにしちゃうとか

sed -e '/^#[[:blank:]]*include.*\\$/,/[^\\]$/s:^://:' \
-e 's:^#[[:blank:]]*include://&:'
2019/12/22(日) 17:46:01.65ID:O05uH48x
>>259
$1、$2でアクセスするし、その$1に空白入れる事も
できるんだから配列は配列だよ。空白区切りじゃない。

bashでは$@の名前付き版$NAME[@]は
明確に配列と言われてるしね
2019/12/22(日) 18:25:06.92ID:M+q9E136
>>255
必要な仕様というよりシンプルな文字列展開としてはそうなるというだけでは
その例はたまたまそういうように使えるというだけのような
あえて賢い対応してるなと言うなら "v""$@" とか書く必要がないとこかな
2019/12/23(月) 15:40:09.98ID:YJsAIsu8
シェル組み込みのgetoptsを同一処理内で二回以上用いるときに
$OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる

dashみたいにgetoptsを内蔵していないシェルでは
外部コマンドとしてgetopts(1)を起動した瞬間に$OPTIND変数が初期化されるみたい。
BashやらKshみたく組込みgetoptsを内蔵してるシェルの、
それも関数を跨がない処理
(getoptsを使ってる関数から一度も抜けることなく再度使用)
の時だけ$OPTIND変数が初期化されないみたいで、
そのせいで不本意な挙動の原因が掴めず半時間ほど無駄にしたw
(dashだと問題ないし、Bashでも特定の箇所でだけ不具合が生じるから)
2019/12/23(月) 15:55:18.14ID:YJsAIsu8
>>262
どういう要件を見たせば
ある変数が配列変数だって言えるのか知ってる?
(俺は知らん。でもプログラミング言語論とかで定義されてそう)
$@がその要件を満たしてれば配列に違いないね。

でもそういう明確な定義が無いなら
もう個人の勝手なんじゃないかな。
2019/12/23(月) 16:20:51.38ID:CGg4xw4r
>>264
> $OPTIND変数を初期化してないと、前の結果が引き継がれてるせいでおかしな挙動になる
当たり前だな。どこに状態を保存してるのかと

> dashみたいにgetoptsを内蔵していないシェルでは
は?内蔵してるが?おそらく初期版から。
getoptsを内蔵してないのはbusyboxで
意図的に外してビルドした場合ぐらいだろ
2019/12/23(月) 16:22:45.93ID:CGg4xw4r
>>264
何を言ってるのかわからんが、検証が間違ってる
2019/12/23(月) 16:36:13.95ID:YJsAIsu8
>>267
あ、そうなの。
じゃあdashの組み込みgetoptsが何らかの
形でBashやKshのそれと$OPTIND変数に対する処理が違うんだな。
ともあれ単純に初期化すればいいだけなんで、
事もないよ。
2019/12/23(月) 16:37:34.35ID:CGg4xw4r
だいたい$OPTINDはシェル変数なんだから、
getoptsは外部コマンドとして実装するのは不可能なんだよ

どうやってシェルスクリプトから実行された外部コマンドから
呼び出し元シェルスクリプトの
プロセス内のメモリを書き換えるんだよw
2019/12/23(月) 16:40:45.68ID:CGg4xw4r
>>268
geoptsを何回も呼び出したいなら、OPTINDを1にして初期化しろ仕様で決まってる

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html

> If the application sets OPTIND to the value 1, a new set of parameters can be used:
> either the current positional parameters or new arg values. Any other attempt to
> invoke getopts multiple times in a single shell execution environment with
> parameters (positional parameters or arg operands) that are not the same in all invocations,
> or with an OPTIND value modified to be a value other than 1, produces unspecified results.
2019/12/23(月) 16:43:06.84ID:CGg4xw4r
bashやkshはローカル変数にでもなってるんだろ
2019/12/23(月) 20:47:02.60ID:sS1JWXeN
ぷぷぷ、ぷろぐらみんぐ言語論wwwww
2019/12/23(月) 20:50:03.01ID:YJsAIsu8
>>269
え、そうなん?
じゃあ
https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
↑getoptsはここには載ってるけれども
実質としては組み込みコマンドとして実装するしかないのか。

ありがとう!勉強になったわ。
2019/12/23(月) 22:11:39.28ID:gENEPh5i
>>273
そこに乗ってるのは確かに気持ち悪さがあるけどね。alias、cd、readあたりも。
まあプロセス間通信などを使えば、外部コマンドとして作るのは
絶対に不可能というわけじゃないがまずやらんだろうなw
2019/12/23(月) 22:26:33.99ID:EXKdfS/F
大昔は cd が外部コマンドだったと知って吃驚仰天
276デフォルトの名無しさん
垢版 |
2019/12/24(火) 11:07:35.47ID:mQqeuoCV
そんなバナナ
2019/12/24(火) 11:10:44.79ID:8h2rOUkn
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32549&;forum=6

Cシェル(csh)上に、/usr/bin/cdと書くと、チェンジディレクトリがうまくいかず、普通にcd〜〜と書くと正しくチェンジディレクトリされます。

shellのカレントディレクトリを変更したいのなら、組み込みコマンドを使わないとダメです。

# にもかかわらず外部コマンドのcdを持っているUnixがあるのは何故だろう?
# joke ?
2019/12/24(火) 11:11:40.76ID:8h2rOUkn
https://tutorialmore.com/questions-292990.htm

この素晴らしい回答で参照されているように、POSIXシステムには外部バイナリ cd があります
シェル組み込みに加えて。 OS X 10.8では /usr/bin/cd です 。組み込みの cd のように
使用することはできません 独自の作業ディレクトリを変更するとすぐに終了するためです。どんな目的に役立つのですか?

解決した方法 # 1
主に、シェルの
2019/12/24(火) 13:50:24.53ID:lTGNfo7C
POSIXシステムには外部バイナリ cd があります
ないけど…?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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