[過去ログ]
シェルスクリプト総合 その31 (1002レス)
シェルスクリプト総合 その31 http://mevius.5ch.net/test/read.cgi/tech/1565446670/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
716: デフォルトの名無しさん [sage] 2019/10/01(火) 19:16:54.12 ID:fust4gpU >>709 forkだよ。$( ) の部分がサブシェルになってて 多くのシェルではサブシェル = 別プロセス生成で実装されてる。 そのおかげでサブシェルの中でcdを実行したり変数を使ったりしても 呼び出し元は汚染されたりしない kshはサブシェルの実装が最適化されていて 全てではないが、サブシェルの部分を同一プロセスで実行する。 独自で状態の保存と復帰を実装してるのだろう。 https://codeday.me/jp/qa/20190810/1425430.html kshは速いと言っちゃ速いんだが、その(複雑な?)仕組みのせいで バグのもとになってたりする。ということを書いてあるページが 有ったんだがどこか忘れた。 http://mevius.5ch.net/test/read.cgi/tech/1565446670/716
717: デフォルトの名無しさん [sage] 2019/10/01(火) 19:25:21.59 ID:fust4gpU 遅い原因の本質は標準出力のキャプチャじゃないから この二つでも違いがでる hoge () { : } for i in $(seq 1000); do hoge (hoge) done >>715 > kshでも差があるね。ループ数増やせば体感できるほどの差となるね そうなんだよね。サブシェルのコストは以外と大きい。 だから変数に入れて使うことが目的とした関数は以下のように グローバル変数を使って返したほうがずっと速いわけさ hoge () { RET=Hello } for i in $(seq 1000); do hoge a=$RET done http://mevius.5ch.net/test/read.cgi/tech/1565446670/717
720: デフォルトの名無しさん [sage] 2019/10/01(火) 19:37:54.80 ID:fust4gpU >>719 > なんで内部関数なのにサブシェルになんのかねん、 考え方が違う。 コマンド置換$( ) は「サブシェルを使用して実行する」という"仕様"なんだよ なんでサブシェルになるのか?ではなく仕様でサブシェルにすると決まってる。 ただし別プロセスにするとは決まっていない。だから子プロセスとかいう既存の 名前ではなく、新たにサブシェルという用語を作った。 サブシェルの仕様としては、「サブシェル内で行った変数などの変更は呼び出し元には伝わらない。」 などがあるが、それを実現してるなら別の別プロセスでなくてもよい。 だけど別プロセスにするほうが実装が簡単だから多くのシェルではサブシェル=別プロセスになってる。 http://mevius.5ch.net/test/read.cgi/tech/1565446670/720
722: デフォルトの名無しさん [sage] 2019/10/01(火) 19:44:28.64 ID:fust4gpU >>718 > 内部関数なのにってとこがね 他の言語の場合、(基本的に)関数内の変数の変更は呼び出し元に反映されない。 つまりローカル変数になってるだろ? それと同じなんだよ。POSIXの範囲ではlocalもtypesetもないから シェルスクリプトにはローカル変数がない ように思えるが、実はサブシェルを使うからローカル変数は必要ない。とも言える。 ローカル変数を実現するためのサブシェルと言える。 サブシェルの仕様としてローカル変数は必須の機能だが、別プロセスにするのは必須ではない。 サブシェル(別プロセス)と捉えるから仰々しくなってるが、 変数のローカル化と考えれば、内部関数内の変数をローカル化するってだけだから 「内部関数なのに」とは思わないだろ? http://mevius.5ch.net/test/read.cgi/tech/1565446670/722
724: デフォルトの名無しさん [sage] 2019/10/01(火) 19:52:05.05 ID:fust4gpU >>718 そのコードに関しては ls | { a=0 while read line; do [ "$line" = 'hoge' ] && a=1 done [ a -eq 1 ] && ... } こう書けばいいって事がわかってから悩むことはなくなったなw 上記をさらに発展して、関数化すれば以下のようになる。 hoge() { a=0 while read line; do [ "$line" = 'hoge' ] && a=1 done [ a -eq 1 ] && ... } ls | hoge そうするとa変数は実質ローカル変数として扱ってるんだから スコープ的にはこっちのほうが適切だと気づくだろう http://mevius.5ch.net/test/read.cgi/tech/1565446670/724
725: デフォルトの名無しさん [sage] 2019/10/01(火) 19:53:21.70 ID:fust4gpU >>723 > 内部変数云々ならhogeもサブシェルにしなくちゃじゃないですか? 使い分けるんだよ。 ローカル変数化したいならサブシェルを使う。 そうでないならサブシェルを使わないって。 http://mevius.5ch.net/test/read.cgi/tech/1565446670/725
727: デフォルトの名無しさん [sage] 2019/10/01(火) 20:00:53.41 ID:fust4gpU >>726 他の言語感覚って言うけど、 じゃあお前いくつ言語しってんの?って話だよ。 狭い言語の知識=言語の全てって思ってるだけさ http://mevius.5ch.net/test/read.cgi/tech/1565446670/727
730: デフォルトの名無しさん [sage] 2019/10/01(火) 20:09:04.89 ID:fust4gpU >>728 どの言語でも、その言語を知らなければ、その言語特有の所でコストがかかるってだけだ だからちゃんとその言語を知らなければいけない。 http://mevius.5ch.net/test/read.cgi/tech/1565446670/730
736: デフォルトの名無しさん [sage] 2019/10/01(火) 21:52:27.77 ID:fust4gpU すべての言語はそれぞれ違っているんだが、 同じ言語がほしいのか? http://mevius.5ch.net/test/read.cgi/tech/1565446670/736
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.047s