1 名前:デフォルトの名無しさん mailto:sage [2019/08/10(土) 23:17:50.64 ID:L+B8OP2P.net] シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 ・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。 シェルスクリプト総合 その30 https://mevius.5ch.net/test/read.cgi/tech/1561989867/
644 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 23:46:42.80 ID:LCUbae2V.net] >>633 訂正 × oct=$(( ($hex >> 6) * 100 + ($hex >> 3 & 0x7) * 10 + ($hex & 0x7) )) ○ oct=$(( (0x$hex >> 6) * 100 + (0x$hex >> 3 & 0x7) * 10 + (0x$hex & 0x7) ))
645 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 00:06:22.06 ID:IA1rgq5F.net] >>632 posixの範囲ではprintfで16進数から文字に変換することが出来ない printf '\101' # => A printf '\x41' # bashは変換できるが、dashでは変換できない バイナリデータの処理など、文字コードを使って処理する必要がある場合は 8進数を使うほうが良い
646 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 00:09:45.15 ID:IA1rgq5F.net] 8進数よりも16進数の方が使い勝手が良いのにパーミッションが8進数なのは、 当時はまだ16進数が発明されてなかったからだったりするのかな? シェルスクリプトもそうだけど、なんか古い時代は8進数しかなかった感じがする それとも単なるビット数を節約しただけなんだろうか?
647 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 00:18:14.43 ID:kEXgFQM4.net] 7ビット機だったような
648 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 02:12:04.50 ID:sr4VPY0J.net] rwxで3ビットしか使ってない必要ないと思ったからだろう
649 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 04:55:24.40 ID:KdPNzCQK.net] パーミッションの話じゃなくて
650 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 09:45:35.22 ID:3tDP3W6T.net] >>634 ありがとうございます!
651 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 12:39:27.59 ID:e1bW+EWq.net] >>637 >当時はまだ16進数が発明されてなかったからだったりするのかな? どこでなにが「発明」を指して居るのかわからんが、コンピュータ業界コンピュータサイエンス(?)としては当時でも普通に16進数があっただろう。スイッチをパチパチしてマシン語を打ち込む当時のコンピュータでは打ち込むプログラムは16進数で書いてたようだから Unix version 1 は 18ビットマシンの PDP-7 でから始まり、すぐに PDP-11 に移行したがその名残だろう、K&R C の文字リテラルでは8進数表現しかできないのとかは、また、K&R C の影響じゃね PDP-7 は 18ビット= 3 3 3 3 3 3 で表した方書いた方がきりがいいからそれが普通のような感じだったんじゃね、今でもパーミッションは3ビットに収まっているので3ビット区切りで表した方が書いた方がわかりやすいのと同じように
652 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 12:48:38.39 ID:N6BvjGdd.net] 昔はなぜか 12bit 15bit 18bit 24bit 36bit あたりのマシンが多い
653 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 13:26:02.16 ID:e1bW+EWq.net] そうなの。見物したスイッチをパチパチしてマシン語を打ち込む当時のコンピュータは16bitだったから、PDP-7(というかPDP-11の前までのDEC)が異端かと思ったw
654 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 09:32:25.18 ID:pw3H64dJ.net] 16進数から8進数への変換って↓ $ hex=fa; printf '%o' $((0x$hex)) ↑こういうのだとPOSIX違反?
655 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 13:37:02.90 ID:fQRmEVoK.net] POSIXは知らんが、 古いzsh? は $((0x$hex)) が使えなくて $((16#$hex)) だった気がする もしくは $((011)) が zshでは8進数にならなくて $((8#11)) と書かないといけない という問題だったかもしれない。まあ忘れたw
656 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 15:46:33.91 ID:pw3H64dJ.net] ふむ。ということは今であればほぼ問題ないという訳か。 thx
657 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 18:40:57.99 ID:YblgUZDU.net] >>644 基本的にメインフレームってカテゴリのコンピュータはCPUも自社設計だったので 8bit単位じゃなく自分たちの使いやすいbit数だった ザイログとかモトローラのCPUを使っていると基本的に8bitの整数倍になる
658 名前:デフォルトの名無しさん mailto:sage [2019/09/22(日) 22:42:51.90 ID:UP8ZY9Jm.net] symlnkのフォルダからファイルをmvすると実体パスの方で移動するけどmvの仕様?
659 名前:デフォルトの名無しさん mailto:sage [2019/09/22(日) 22:58:25.61 ID:wuCdbk0L.net] 移動なら実体を移動しなきゃ移動しないだろう、ファイルシステム的に
660 名前:デフォルトの名無しさん mailto:sage [2019/09/22(日) 23:05:40.23 ID:QKufl6gy.net] 例えば/a/b/cがあって、/x/yが/a/bを指すとする。 cd /x/y; mv c ..したときにcが/x/cじゃなくて/a/cになるという話なら仕様。 実際はcd /x/yの時点でカーネル的には既に/a/bに移っている。 pwdして/x/yと表示されたり、プロンプトに/x/yと出たりすることがあるのは、シェルがそう見せているだけ。 外部コマンドを呼んだ時点で/x/yにいるという情報は伝わらない。
661 名前:デフォルトの名無しさん mailto:sage [2019/09/22(日) 23:22:54.08 ID:dHMqf7rP.net] シェルによっては今いるディレクトリをシンボリックリンクのままPWD環境変数に出力するから、外部コマンドでも>>651 の場合に/a/bではなく/x/yにいると分かることもある だからmvでもやろうと思えば環境変数によって動作をかえて/x/cに移すこともー応可能ではある ただ普通はそういう危なっかしい動きはしない
662 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 00:58:42.07 ID:XnqhgXWR.net] なるほど ~/dir/foo.txtがあって、dirのリンクを~/Desktop/dir_linkに作ったんだ んでdir_linkからmv foo.txt ../したらDesktopになくてあれってね シンボリックリンクはあくまで別名だって念頭に置かないといつかやらかしそうだなぁ
663 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 13:44:18.78 ID:uT43KuRv.net] シンボリックリンク自体はカーネルっていうかファイルシステムの機能であって シェルの機能じゃないよね? シンボリックリンクされたディレクトリへの移動やその表示が、シェルの機能?
664 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 14:55:36.41 ID:16gV8N0U.net] シンボリックリンクはただのファイルで、APIが機能を提供してるだけだろう ハードリンクはファイルシステムの機能だろうが
665 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 15:20:14.51 ID:0wgm+uqt.net] シンボリックリンクはPOSIXで決まっているが、 シェルスクリプトとは関係ない。 シェルとも関係ない。すれ違いだ。 シェルスクリプトの話をしろ。
666 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 15:43:16.78 ID:PpvL3bdr.net] シンボリックリンクもハードリンクもファイルシステムの機能だ
667 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 15:44:56.02 ID:mZE+d06B.net] ドヤァ
668 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 16:01:07.98 ID:16gV8N0U.net] >>657 どこまでをファイルシステムかと言うのかだが、論理矛盾とかリンク切れとかあってもなんも関係ないのだから低レベル=どのファイルシステムでフォーマットする?というファイルシステムのファイルシステムではないな そのレベルではファイルとフラグを提供しているにすぎない APIも含めたOSがアプリケーションに対しての提供するファイルシステムといえばファイルシステムだろうが
669 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 16:41:43.41 ID:aoth6Tve.net] まぁ、いずれにしても、ここではスレ違い
670 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 16:58:42.91 ID:COQ8/G13.net] シンボリックリンクやハードリンクはOSの機能 ファイルシステムはそれを実装するだけ (FATのように実装してないものもある)
671 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 17:01:20.42 ID:PpvL3bdr.net] アホばっかw
672 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 17:09:58.15 ID:fWeAQpZu.net] 自戒か
673 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 17:22:55.59 ID:qNyZUwSM.net] ファイルシステムはOSの提供する1つの機能だろ
674 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 20:09:09.12 ID:uT43KuRv.net] いつからカーネルがOSに掏り替わった?
675 名前:デフォルトの名無しさん mailto:sage [2019/09/25(水) 16:36:07.25 ID:vuS5tsH7.net] カーネルってファイルシステム含まないでしょうが
676 名前:デフォルトの名無しさん mailto:sage [2019/09/25(水) 17:26:48.60 ID:Fy/ppuPa.net] 子供がまだ食ってる途中でしょうが
677 名前:デフォルトの名無しさん [2019/09/29(日) 15:56:27.36 ID:kt1IDkk5.net] 誠意って何かね
678 名前:デフォルトの名無しさん [2019/09/29(日) 17:07:22.81 ID:G1Omq4Sq.net] 金
679 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 19:09:52.55 ID:VaR9nylT.net] 女だったらアレかもしれんが
680 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 19:22:34.45 ID:CY5JaLwa.net] 俺が定期的にお題を出してやらないとすぐクソスレ化するなw
681 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 19:31:49.84 ID:cn7qdGIP.net] Oh, I like Japan. Japanese are crazy. Ha ha ha. Japanese are pigs, pigs, you know. Moneys and they have small cocks you know short legs yellow monkeys. Do you understand?
682 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 19:34:18.39 ID:RIFVILY+.net] POSIXの話するから荒れて盛り上がるから誰かしてよ
683 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 19:34:36.19 ID:RIFVILY+.net] POSIXの話すると荒れて盛り上がるから誰かしてよ
684 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 20:34:15.29 ID:1ct4yMlj.net] POSIX準拠で固定小数点ライブラリほしいな 小数使うことは稀だけど、たまに無いとめんどくさい exprは外部コマンドで遅いので却下w
685 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 20:53:22.53 ID:UgGWrkoZ.net] bashって便利だけど計算部分だけマジでダサいな 1+1が $((1+1))ってなんなんだよ
686 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 21:19:57.63 ID:1ct4yMlj.net] どの言語にも言えることだけど、 ダサい部分ってのは互換性のためだよ シェルスクリプトは外部コマンドを関数として呼び出せて、 そして外部コマンドに使える文字は、ファイルに使える文字と同じ だから例えば@とか%とかいう文字でさえ、コマンド名として使える だから、安易に記号を追加するわけにもいかないし予約語も増やせない。 $に関してはシェルスクリプト当初から特殊記号だったから 新たに特殊記号や予約語を増やすのではなく$を拡張するという方法を採用したのだろう 互換性は一番大事だからね
687 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 21:21:56.71 ID:1ct4yMlj.net] 補足 例えば「1 + 1」は、"1"コマンドを、+と1という引数で呼び出すという意味になるし 「1+1」だと"1+1"コマンドになる。 選択肢が限られるんだよね
688 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 06:57:25.74 ID:Ceph+2oU.net] $ awk 'BEGIN {print 0.1+0.2}' 0.3 bcより使いやすい悲しみ
689 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 13:47:50.63 ID:bgqbOy9v.net] POSIXの仕様書, 算術展開での(浮動)小数点演算は今度の2020年度改訂で一部解禁されるらしい。 ちなみに時を同じくして$'\n'←みたいな書式も解禁。 やったぜ。
690 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 14:14:05.05 ID:gJLA2fQe.net] やったぜ。
691 名前:デフォルトの名無しさん [2019/09/30(月) 14:57:01.11 ID:seE3nGDx.net] 石器時代かよワロタw
692 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 14:59:09.67 ID:1VQTT5dv.net] 生理がこないんですけど どうしたらいいですか?
693 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 15:14:42.58 ID:g4qimp0d.net] 俺も生理来たことないわー
694 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 15:24:33.48 ID:g4qimp0d.net] >>680 どこ情報ですか?
695 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 17:46:55.62 ID:zGRcNdYK.net] もしもし、先生!もしもし! だけどもねー、実はあのー、子供つくらないようにしてるんですよね、わたくしも本当に辛くてですね、子供には遺伝しないでしょうか?
696 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 19:45:29.40 ID:bgqbOy9v.net] >>685 austingroupbugs.net/view.php?id=249 こことか。
697 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 20:35:29.76 ID:sHSicWZI.net] >>687 いや、小数の話
698 名前:デフォルトの名無しさん [2019/09/30(月) 21:58:43.29 ID:M1BD3UNk.net] しょうっすか…
699 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:03:44.06 ID:qRuhgEzP.net] 無理にシェルスクリプトだけで小数対応しなくても、 perl -e "print 0.2*0.3" とか、いろいろやりようはあるからあまり必要性を感じない。
700 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:20:20.33 ID:nI7iDoAi.net] >>690 大量に計算をするとプロセス呼び出しになるから遅いんだよ $ time ksh -c 'for i in $(seq 1000); do n=$(echo "0.2*0.3" | bc -l); done' real 0m1.921s user 0m1.762s sys 0m0.715s $ time ksh -c 'for i in $(seq 1000); do n=$((0.2*0.3)); done' real 0m0.009s user 0m0.009s sys 0m0.000s たったの1000回でここまで差が出るからね
701 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:28:35.91 ID:qRuhgEzP.net] 意図と違うと思うが、 time perl -e '$j=0; for($i=0;$i<1000;$i+=1) { $j+=0.2*0.3; }; print $j' とか、別にシェルスクリプトだけに頼らんでもなんとかなってしまうというか・・・・
702 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:29:54.18 ID:nI7iDoAi.net] だから出来るできないの話はして無くて 遅いって話をしてる
703 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:35:15.29 ID:1VQTT5dv.net] >>692 これで事足りるな
704 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:58:52.54 ID:nI7iDoAi.net] perlは入ってない環境も有るのでその点でも駄目だしね
705 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 00:02:33.23 ID:cNB/gbgI.net] >>679 これで事足りるな
706 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 00:27:03.86 ID:rxcb8vGn.net] 必須すぎやろw
707 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 01:47:40.69 ID:SPlRKvH8.net] なになに縛りが好きなマゾなんだろうw
708 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 02:00:19.69 ID:rxcb8vGn.net] そんな事する必要がないなら縛りって言ってもいいけど、 perlが入ってない環境は実際に存在するからね
709 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 02:09:56.58 ID:ESup7bfu.net] awkも使えない環境で何やるんだよw
710 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 02:09:58.85 ID:PTA8MEY/.net] >>679
711 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 02:36:49.10 ID:eGCx9XC9.net] >>700 awkはbusyboxに入ってるよw
712 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 09:01:32.62 ID:O2y9F
] [ここ壊れてます]
713 名前:dCY.net mailto: 「可搬性が高い」を「POSIX縛り」と取り違えてるおバカさんがいますね… [] [ここ壊れてます]
714 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 09:11:30.09 ID:ZA6pNaC0.net] POSIXで縛るだけではPOSIX未満のbusyboxで動かなかったりするからね 可搬性を高くするにはPOSIXで規定されたコマンドであっても なるべく使わないほうが良い
715 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 10:51:02.41 ID:CGhZJwfl.net] どういうことなの…
716 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 11:09:51.43 ID:ZA6pNaC0.net] ここはシェルスクリプトのスレ つまり可搬性とはシェルスクリプトの話をしてる。 シェルスクリプトではよく外部コマンドを呼び出す しかし外部コマンドはOSによって違う。 特に基本的なコマンドは、各OSでバラバラに作っていたり 独自の修正を入れており複数の実装があり微妙に動きが異なっている。 例えば、LinuxのsedとMacのsedでは使える命令が違う。 POSIX準拠のコマンド(もちろんオプションなども含む)で規定されてるものだけを 使っていれば可搬性はそれなりにあるが、それでも完璧じゃない。 例えば組み込みで使われるbusyboxはPOSIX準拠コマンドのサブセットが実装されてる。 だから本気で可搬性を高くしようと思えばPOSIX縛りでも不十分。 POSIX準拠のコマンドが信じれない。という前提にたてば 思い切って外部コマンドすら呼び出さない、完全にシェルスクリプトだけで 実装するのがもっとも可搬性が高い。 もちろん限界は有るので実際には出来る限りシェルスクリプトで作って、 外部コマンドは必要最小限、必要に応じて互換性を吸収するようにラッパー関数を作る。 ということになる。
717 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 15:50:14.87 ID:P1455Lxu.net] 可搬性に異常に拘っているのは一人か二人しかいないけどな 可搬性に拘ってないというレスにも可搬性を押し付ける
718 名前:デフォルトの名無しさん [2019/10/01(火) 16:28:55.36 ID:9fvqkmcJ.net] 認めろよ。 シェルスクリプトに可搬性などない。 どこでも動くシェルスクリプトなど幻想。
719 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 16:40:08.47 ID:8eIOCDAd.net] hoge () { echo "Hello" } for i in $(seq 1000); do hoge a=$(hoge) done myfunc と a=$(myfunc) の実行時間の差はなんなん?標準出力を横取りするためだけにしてはコストが高いかな 簡単に思いつくのは横取りするためパイプでで別プロセスにしなきゃとかかな?
720 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 16:46:56.18 ID:O2y9FdCY.net] それBashでやってない? 試しにKshでやってみて。(俺環かもしれんから,速度比較は晒さない)
721 名前:デフォルトの名無しさん [2019/10/01(火) 16:52:40.16 ID:/6RuW8/Q.net] perlが入ってない環境ってそれは入れる必要ないんだろ 一から構築していくならそれでいいけど
722 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 16:54:32.38 ID:8eIOCDAd.net] なるほど。ksh(だけが?)がなんか賢いかな。zsh他も差がある
723 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 17:07:00.59 ID:cNB/gbgI.net] perlが無い環境があるからどうのこうの言うけど kshが無い環境があるからは言わないんだなw
724 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 17:10:13.56 ID:8eIOCDAd.net] 違う人じゃね?同一人物だったらアレだけどw
725 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 18:59:48.82 ID:8eIOCDAd.net] >>712 zsh他も差があるは、>>709 で体感できる差があるが正しいか kshでも差があるね。ループ数増やせば体感できるほどの差となるね
726 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:16:54.12 ID:fust4gpU.net] >>709 forkだよ。$( ) の部分がサブシェルになってて 多くのシェルではサブシェル = 別プロセス生成で実装されてる。 そのおかげでサブシェルの中でcdを実行したり変数を使ったりしても 呼び出し元は汚染されたりしない kshはサブシェルの実装が最適化されていて 全てではないが、サブシェルの部分を同一プロセスで実行する。 独自で状態の保存と復帰を実装してるのだろう。 https://codeday.me/jp/qa/20190810/1425430.html kshは速いと言っちゃ速いんだが、その(複雑な?)仕組みのせいで バグのもとになってたりする。ということを書いてあるページが 有ったんだがどこか忘れた。
727 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:25:21.59 ID:fust4gpU.net] 遅い原因の本質は標準出力のキャプチャじゃないから この二つでも違いがでる 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
728 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:26:55.18 ID:8eIOCDAd.net] >>716 内部関数なのにってとこがね&普通の他の言語とはやはり違うな(まあ当然だが)という(内部汚染とかこれの本題ではないっすよ) zshはkshを習ってだけど、ちょこちょこ習えてないなあ。kshの否定面のレスだけど、kshは人に優しいとこもあるとも思うw a=0 ls | while read line; do [ "$line" = 'hoge' ] && a=1 done [ a -eq 1 ] && ... っていう見た目他の言語的では当たり前のがちゃんと動くというwまあ、異端だけど とりあえず、どうしようもないそういうものということでいいのね。どうも
729 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:30:13.87 ID:8eIOCDAd.net] >>717 せっかくですが、ちょい本題とは違うかな。そりゃ () は... なんで内部関数なのにサブシェルになんのかねん、他の言語的感覚ではという まあ、内部関数だろうと、() と同じで $() もサブシェルになるということをおっしゃっりたいのでしょうけど どうも
730 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:37:54.80 ID:fust4gpU.net] >>719 > なんで内部関数なのにサブシェルになんのかねん、 考え方が違う。 コマンド置換$( ) は「サブシェルを使用して実行する」という"仕様"なんだよ なんでサブシェルになるのか?ではなく仕様でサブシェルにすると決まってる。 ただし別プロセスにするとは決まっていない。だから子プロセスとかいう既存の 名前ではなく、新たにサブシェルという用語を作った。 サブシェルの仕様としては、「サブシェル内で行った変数などの変更は呼び出し元には伝わらない。」 などがあるが、それを実現してるなら別の別プロセスでなくてもよい。 だけど別プロセスにするほうが実装が簡単だから多くのシェルではサブシェル=別プロセスになってる。
731 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:41:25.43 ID:8eIOCDAd.net] >>720 その続きなどを読んでよ。言われていることはすでに書いてあるんですけど どうしようもないという結論が得られたのでw、 結局、こんなことにもそれなりの差があるんだから「常時それも無条件で」実行時間の差があるなんて気にするなんて無意味だなと なにかそれが問題になったときに気にする対応すればいいだけだなという。のをそもそも言いたかったw
732 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:44:28.64 ID:fust4gpU.net] >>718 > 内部関数なのにってとこがね 他の言語の場合、(基本的に)関数内の変数の変更は呼び出し元に反映されない。 つまりローカル変数になってるだろ? それと同じなんだよ。POSIXの範囲ではlocalもtypesetもないから シェルスクリプトにはローカル変数がない ように思えるが、実はサブシェルを使うからローカル変数は必要ない。とも言える。 ローカル変数を実現するためのサブシェルと言える。 サブシェルの仕様としてローカル変数は必須の機能だが、別プロセスにするのは必須ではない。 サブシェル(別プロセス)と捉えるから仰々しくなってるが、 変数のローカル化と考えれば、内部関数内の変数をローカル化するってだけだから 「内部関数なのに」とは思わないだろ?
733 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:51:56.19 ID:8eIOCDAd.net] >>722 なにを教えてくれてるのか教えたいのかわからないです 内部変数?内部変数環境のことは言ってないです。他の言語でもの(内部)関数を呼ぶその返り値を使うって話なんですけど 内部変数云々ならhogeもサブシェルにしなくちゃじゃないですか?内部関数という言葉が悪かったならすまんすですけど
734 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:52:05.05 ID:fust4gpU.net] >>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変数は実質ローカル変数として扱ってるんだから スコープ的にはこっちのほうが適切だと気づくだろう
735 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:53:21.70 ID:fust4gpU.net] >>723 > 内部変数云々ならhogeもサブシェルにしなくちゃじゃないですか? 使い分けるんだよ。 ローカル変数化したいならサブシェルを使う。 そうでないならサブシェルを使わないって。
736 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 19:56:56.36 ID:8eIOCDAd.net] >>725 なんか教えたがりのようですけど、ちょっと無理があるかなと あくまでも「他の言語的感覚では」が前提、それとは違うというのの確認でしかないんですけど 使い分けるとかそもそも内部変数の話はしてないんですよ
737 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 20:00:53.41 ID:fust4gpU.net] >>726 他の言語感覚って言うけど、 じゃあお前いくつ言語しってんの?って話だよ。 狭い言語の知識=言語の全てって思ってるだけさ
738 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 20:02:16.96 ID:8eIOCDAd.net] そもそものそもそもは、bcの毎回起動するのに時間がかかるというので、せっっかくの標準で暗黙的にもマルチプロセスなのでサーバ&クラアント的に起動しとけばいいんじゃねと trap 'exec 8>&-; exec 7>&-; rm -f from-server to-server' EXIT mkfifo from-server mkfifo to-server exec 8<> to-server exec 7<> from-server < to-server bc -l > from-server & calc () { echo "$*" > to-server read result < from-server echo $result } てのを書いたのよ、単なる興味的にどれだけのコスト削減できるのかを試し確認するために。で、この一連の(他の言語的には)思ってもいなかったとこでコストがあるなと。その確認だけだよ。で、やっぱり>>721 のようなことだなとw
739 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 20:02:43.57 ID:8eIOCDAd.net] >>727 はいはい
740 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 20:09:04.89 ID:fust4gpU.net] >>728 どの言語でも、その言語を知らなければ、その言語特有の所でコストがかかるってだけだ だからちゃんとその言語を知らなければいけない。
741 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 20:10:22.49 ID:8eIOCDAd.net] はいはい。知っていることを延々と言われても。それも聞いてもいないのに
742 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 21:09:03.88 ID:/EdGAgHY.net] >>726 つうか、お前の感覚の話なんか誰にもわからんだろ。 だから、馬鹿だと言う前提で説明してるだけじゃん? それすら理解できないってことはやはり馬鹿なんだなぁと思うばかり。
743 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 21:21:30.07 ID:T/R8ZN8b.net] ろくにシェルスクリプトのことを知らないから聞いてみた。 親切に教えてくれる人がいた。 ……何が不満なんだ?
744 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 21:25:17.92 ID:8eIOCDAd.net] 何がお怒りのなのかさっぱりですけどw