シェルスクリプト総合 その31
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 ・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。 シェルスクリプト総合 その30 https://mevius.5ch.net/test/read.cgi/tech/1561989867/ grepは自身で上書きすると中身空になるけど回避方法ある?要はspongeなんだけども data=$(grep 〜); echo "$data" > 〜 >>612 こんなのが出たので見るのを止めた。 この接続ではプライバシーが保護されません sechiro.hatenblog.com では、悪意のあるユーザーによって、パスワード、メッセージ、クレジット カードなどの情報が盗まれる可能性があります。詳細 NET::ERR_CERT_COMMON_NAME_INVALID >>618 お前のパソコンなんかおかしくなってるぞw 5ch では、はてなブログのURL を貼ってはいけない! 書き込み禁止画面が出ずに、いきなり吸い込まれて、 アクセス禁止になるようにしてあるから、超危険! 同様に、twitter の長いURL にも、吸い込まれるものがあるらしい そこだけ、全角などに変換した方がよい。 hatenblog >>612 のURL は、証明書エラー! HTTPS の証明書が切れてる! >>612 hatenblog そもそも、上ははてなブログじゃない!w a が無い はてなブログは、 hatenablog >>612 hatenblog に、a を追加したら、ちゃんと見れた! はてなブログは、 hatenablog https://sechiro. hatenablog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9 >>619 スマホのChromeなんだけどね。おかしいのかね?よくわからんが。 >>621 あ、そういうことか。 たしかに無事開いてしまったら何か違う世界を見てしまいそうで怖いアドレスだなw 16進数(最大二桁 0xFF)から8進数に変換したいんですが bcを使う以外にsedなどを使った方法とかありますかね…? $ printf 'obase=8;ibase=16;%s\n' 'FA' | bc もしあれば,bcは16進数のアルファベットが大文字じゃないといけないし, POSIX標準とはいえUbuntuとかには既定で導入されてないしで, あまり使いたいくないんです(わがままですいません) 8進数にパーミッション以外の使いみちなんてあったのか… >>630 hex=fa oct=$(( ($hex >> 6) * 100 + ($hex >> 3 & 0x7) * 10 + ($hex & 0x7) )) # oct=$((0x$hex >> 6))$((0x$hex >> 3 & 0x7))$((0x$hex & 0x7)) 3桁固定版 echo "$oct" 出力が必須でない場合(変数に入れて処理する場合)は oct=$(printf '%o\n' 0xfa) よりも速いはず 他にも case を使って書けるはず 最大0xFFなら case $value in 01) 〜 02) 〜 : [fF][eE]) [fF][fF]) esac とかねw たかだか256+α行。頑張ればFF の一桁ずつ処理すれば行は減らせるだろう。 >>633 訂正 × oct=$(( ($hex >> 6) * 100 + ($hex >> 3 & 0x7) * 10 + ($hex & 0x7) )) ○ oct=$(( (0x$hex >> 6) * 100 + (0x$hex >> 3 & 0x7) * 10 + (0x$hex & 0x7) )) >>632 posixの範囲ではprintfで16進数から文字に変換することが出来ない printf '\101' # => A printf '\x41' # bashは変換できるが、dashでは変換できない バイナリデータの処理など、文字コードを使って処理する必要がある場合は 8進数を使うほうが良い 8進数よりも16進数の方が使い勝手が良いのにパーミッションが8進数なのは、 当時はまだ16進数が発明されてなかったからだったりするのかな? シェルスクリプトもそうだけど、なんか古い時代は8進数しかなかった感じがする それとも単なるビット数を節約しただけなんだろうか? rwxで3ビットしか使ってない必要ないと思ったからだろう >>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ビット区切りで表した方が書いた方がわかりやすいのと同じように 昔はなぜか 12bit 15bit 18bit 24bit 36bit あたりのマシンが多い そうなの。見物したスイッチをパチパチしてマシン語を打ち込む当時のコンピュータは16bitだったから、PDP-7(というかPDP-11の前までのDEC)が異端かと思ったw 16進数から8進数への変換って↓ $ hex=fa; printf '%o' $((0x$hex)) ↑こういうのだとPOSIX違反? POSIXは知らんが、 古いzsh? は $((0x$hex)) が使えなくて $((16#$hex)) だった気がする もしくは $((011)) が zshでは8進数にならなくて $((8#11)) と書かないといけない という問題だったかもしれない。まあ忘れたw ふむ。ということは今であればほぼ問題ないという訳か。 thx >>644 基本的にメインフレームってカテゴリのコンピュータはCPUも自社設計だったので 8bit単位じゃなく自分たちの使いやすいbit数だった ザイログとかモトローラのCPUを使っていると基本的に8bitの整数倍になる symlnkのフォルダからファイルをmvすると実体パスの方で移動するけどmvの仕様? 移動なら実体を移動しなきゃ移動しないだろう、ファイルシステム的に 例えば/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にいるという情報は伝わらない。 シェルによっては今いるディレクトリをシンボリックリンクのままPWD環境変数に出力するから、外部コマンドでも>>651 の場合に/a/bではなく/x/yにいると分かることもある だからmvでもやろうと思えば環境変数によって動作をかえて/x/cに移すこともー応可能ではある ただ普通はそういう危なっかしい動きはしない なるほど ~/dir/foo.txtがあって、dirのリンクを~/Desktop/dir_linkに作ったんだ んでdir_linkからmv foo.txt ../したらDesktopになくてあれってね シンボリックリンクはあくまで別名だって念頭に置かないといつかやらかしそうだなぁ シンボリックリンク自体はカーネルっていうかファイルシステムの機能であって シェルの機能じゃないよね? シンボリックリンクされたディレクトリへの移動やその表示が、シェルの機能? シンボリックリンクはただのファイルで、APIが機能を提供してるだけだろう ハードリンクはファイルシステムの機能だろうが シンボリックリンクはPOSIXで決まっているが、 シェルスクリプトとは関係ない。 シェルとも関係ない。すれ違いだ。 シェルスクリプトの話をしろ。 シンボリックリンクもハードリンクもファイルシステムの機能だ >>657 どこまでをファイルシステムかと言うのかだが、論理矛盾とかリンク切れとかあってもなんも関係ないのだから低レベル=どのファイルシステムでフォーマットする?というファイルシステムのファイルシステムではないな そのレベルではファイルとフラグを提供しているにすぎない APIも含めたOSがアプリケーションに対しての提供するファイルシステムといえばファイルシステムだろうが シンボリックリンクやハードリンクはOSの機能 ファイルシステムはそれを実装するだけ (FATのように実装してないものもある) 俺が定期的にお題を出してやらないとすぐクソスレ化するなw 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? POSIXの話するから荒れて盛り上がるから誰かしてよ POSIXの話すると荒れて盛り上がるから誰かしてよ POSIX準拠で固定小数点ライブラリほしいな 小数使うことは稀だけど、たまに無いとめんどくさい exprは外部コマンドで遅いので却下w bashって便利だけど計算部分だけマジでダサいな 1+1が $((1+1))ってなんなんだよ どの言語にも言えることだけど、 ダサい部分ってのは互換性のためだよ シェルスクリプトは外部コマンドを関数として呼び出せて、 そして外部コマンドに使える文字は、ファイルに使える文字と同じ だから例えば@とか%とかいう文字でさえ、コマンド名として使える だから、安易に記号を追加するわけにもいかないし予約語も増やせない。 $に関してはシェルスクリプト当初から特殊記号だったから 新たに特殊記号や予約語を増やすのではなく$を拡張するという方法を採用したのだろう 互換性は一番大事だからね 補足 例えば「1 + 1」は、"1"コマンドを、+と1という引数で呼び出すという意味になるし 「1+1」だと"1+1"コマンドになる。 選択肢が限られるんだよね $ awk 'BEGIN {print 0.1+0.2}' 0.3 bcより使いやすい悲しみ POSIXの仕様書, 算術展開での(浮動)小数点演算は今度の2020年度改訂で一部解禁されるらしい。 ちなみに時を同じくして$'\n'←みたいな書式も解禁。 やったぜ。 もしもし、先生!もしもし! だけどもねー、実はあのー、子供つくらないようにしてるんですよね、わたくしも本当に辛くてですね、子供には遺伝しないでしょうか? 無理にシェルスクリプトだけで小数対応しなくても、 perl -e "print 0.2*0.3" とか、いろいろやりようはあるからあまり必要性を感じない。 >>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回でここまで差が出るからね 意図と違うと思うが、 time perl -e '$j=0; for($i=0;$i<1000;$i+=1) { $j+=0.2*0.3; }; print $j' とか、別にシェルスクリプトだけに頼らんでもなんとかなってしまうというか・・・・ だから出来るできないの話はして無くて 遅いって話をしてる perlは入ってない環境も有るのでその点でも駄目だしね そんな事する必要がないなら縛りって言ってもいいけど、 perlが入ってない環境は実際に存在するからね 「可搬性が高い」を「POSIX縛り」と取り違えてるおバカさんがいますね… POSIXで縛るだけではPOSIX未満のbusyboxで動かなかったりするからね 可搬性を高くするにはPOSIXで規定されたコマンドであっても なるべく使わないほうが良い ここはシェルスクリプトのスレ つまり可搬性とはシェルスクリプトの話をしてる。 シェルスクリプトではよく外部コマンドを呼び出す しかし外部コマンドはOSによって違う。 特に基本的なコマンドは、各OSでバラバラに作っていたり 独自の修正を入れており複数の実装があり微妙に動きが異なっている。 例えば、LinuxのsedとMacのsedでは使える命令が違う。 POSIX準拠のコマンド(もちろんオプションなども含む)で規定されてるものだけを 使っていれば可搬性はそれなりにあるが、それでも完璧じゃない。 例えば組み込みで使われるbusyboxはPOSIX準拠コマンドのサブセットが実装されてる。 だから本気で可搬性を高くしようと思えばPOSIX縛りでも不十分。 POSIX準拠のコマンドが信じれない。という前提にたてば 思い切って外部コマンドすら呼び出さない、完全にシェルスクリプトだけで 実装するのがもっとも可搬性が高い。 もちろん限界は有るので実際には出来る限りシェルスクリプトで作って、 外部コマンドは必要最小限、必要に応じて互換性を吸収するようにラッパー関数を作る。 ということになる。 可搬性に異常に拘っているのは一人か二人しかいないけどな 可搬性に拘ってないというレスにも可搬性を押し付ける 認めろよ。 シェルスクリプトに可搬性などない。 どこでも動くシェルスクリプトなど幻想。 hoge () { echo "Hello" } for i in $(seq 1000); do hoge a=$(hoge) done myfunc と a=$(myfunc) の実行時間の差はなんなん?標準出力を横取りするためだけにしてはコストが高いかな 簡単に思いつくのは横取りするためパイプでで別プロセスにしなきゃとかかな? それBashでやってない? 試しにKshでやってみて。(俺環かもしれんから,速度比較は晒さない) perlが入ってない環境ってそれは入れる必要ないんだろ 一から構築していくならそれでいいけど なるほど。ksh(だけが?)がなんか賢いかな。zsh他も差がある perlが無い環境があるからどうのこうの言うけど kshが無い環境があるからは言わないんだなw ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる