シェルスクリプト総合 その34
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 ・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。 シェルスクリプト総合 その33 https://mevius.5ch.net/test/read.cgi/tech/1584893550/ うう。リロード忘れてとっくの昔に終わった話にレスを・・・orz あ、まだ終わってなかったかな? まあでもたいした事書いてないからどうでもいいや。俺のことは忘れてくれ。 普通に使うな。逆になんで使わないと思うのか不思議 lsで問題があるようなら言うような別のをにするけど いろんなコマンドを臨機応変に使うことが気になる質だったんやろ。 好き好きとしか。 >>526 POSIX限定コマンドじゃないなら ls以外でほとんどのことができるからでしょ macOSがオプション違っていて面倒くさすぎるってのを除けば パーミッションとかもstatコマンドで取得できるし それにしてもWindowsはLinuxに対応したから楽になったけど macOSはBSD系だからローカルでテストして そのままサーバーに持っていくってのが難しくなってるなw 訂正 POSIX準拠コマンドに限定しないなら ls以外でほとんどのことができるからでしょ >>527 ls使わないだからな、臨機応変ではなさげ 好き好きにとしかは同意 >>530 ,527 ああ、 >コマンドを臨機応変に使うことが気になる質 は、他の人を指してるとも読めるな。そっちのつもりならすまん >>531 使うことが気になる(から使いたくない)質 >>532 >>531 の、 >コマンドを臨機応変に使うことが気になる質 は「ことが気になる質」余分だった「コマンドを臨機応変に使う」だなと書き込んだ後で気がついた。まあいいかとほっといた(真逆(?)なんだが)。すまん なんとなくw理解。どうも&重ね重ねすまん 誰とは言わんけどツイッターで永遠と古い記事繰り返し流してるボットいるよね リンク切れてるし邪魔なだけなんだけどああいうの消し去りたい https://zenn.dev/mattn/books/bb181f3f4731920f29a5/viewer/5 > 既にシェルスクリプトのみでやる領域を超えてきています。 > 本来ならば正しいプログラミング言語を選んで正しくフィルタリングすべきだと思います。 と書いてありますが、これを「正しいプログラミング言語」で書くとどうなりますか? シェルスクリプトだけでやるより分かりやすくなりますか? >>535 Windows のRuby で、JSON ファイルをダウンロードして保存する、部分だけを作ったが、 85KB のファイルの中身には、日本語は無く、 ほとんど、\u6708 みたいなユニコード・コードポイントの表示ばかりで読めない。 {{\u30ab\u30ec\u30f3\u30c0\u30fc 10\u6708}} ダウンロードする際の、オプションでも間違ったのかな? download_file = "wikipedia.json" # ファイルが存在しない時だけ、ダウンロードして保存する unless FileTest.exist? download_file require 'open-uri' require 'cgi' require 'date' today = Date.today.strftime( "%-m月%-d日" ) # 今日の日付。1桁表示。例、10月1日 url = "https://ja.wikipedia.org/w/api.php?format=json& ;action=query&prop=revisions&rvprop=content&exintro&explaintext&redirects=1&titles=" + CGI.escape( today ) # URL encode # ダウンロードしたファイルを保存する open( url ) do |file| open( download_file, "w" ) do |out| out.write( file.read ) # 書き込み end end end >>537 やっぱり逆に長くなってるし分かりやすくなってないですよね? Ruby の方が、一般的な関数を使っているから、分かりやすい。 例えば、CGI.escape で、URL encode してる 元のサイトだと、date +%-m月%-d日 の部分を、何かでエンコードして、以下のようにして、 date +%-m%%E6%%9C%%88%-d%%E6%%97%%A5 それを、titles の所に書いている。 titles=$(date +%-m%%E6%%9C%%88%-d%%E6%%97%%A5) > Ruby の方が、一般的な関数を使っているから、分かりやすい。 その理屈だとシェルスクリプトにもそのような関数(コマンド)があればいいって話になるよね? シェルスクリプトの場合はJSONからデータ取るのにjqのミニ言語を覚えなきゃいけないというのはあるけど Wikipediaのように構造化しにくいデータをテキストのまま加工するならそこまで大きな差はないよね 便利な関数が用意されてるかどうかやエラーハンドリングがやりやすいかどうかくらいの違い Wikipediaのデータ用のパーサー使ってテキストじゃなく構造化したデータを扱えるなら差が出てくる jqのミニ言語 vs 言語のパーサー?とかだろうけど 結局、jqのミニ言語の方が小さくならね? それでも言語のパーサー使うってことは 大きくなったら、さくっと複雑な正規表現一発よりもも 愚直に文字や単語を検索していって処理を書いたほうが 分かりやすいと言ってるのと同じようなことなんかな? 答えを教えてくれという質問に答える必要があるのか? なんでRubyなのか。初心者ならどのプラットフォームでも動くPythonを勧めておけよ。 >>543 答えたくないなら何も話さなくていいのに そのような質問をする必要があるのか?w macOSがzshに変わっても/bin/shはbashなんだしzshでコード書くやつなんておらんだろと 思っていたけどzshrcとかで書くことはあるんだな 何言ってるのかと思ったら、zsh固有のを使ってことか 誰も好き好んでそうシェルはそう変えないけど、デフォがzshになったらそれなりに出てくるんじゃね だいたいがデフォだからそのシェルを使ってるって理由にならない理由wだからな >zshに変わっても/bin/shはbashなんだし bashismに慣れているんだったら脱却した方がいいぞ。あくまでも過渡期(変えた直後)だからそうしてるだけで、そのうち無くなるぞ。絶対何かに変わる。dashとか(dashとは言ってない) なくならないほうに賭けるぜ! Bashはもうなくせんやろ。w bashはなくならないが、インタラクティブシェル /bin/shはdash、もしくはPOSIX準拠のシェルだろ dashよりも速いシェルって作れる気がするんだよな JITとか取り入れてさ メンテするのめんどくさくなって消してしまうのが定番だからなあ 必要なら自分で入れろになると思うよ。いつも通りならw dash dash dash bash and dash bashismは嫌いだから/bin/shはdashにしてbashをオプショナルにするか POSIXで標準化して欲しい >>553 既存シェルスクリプトの動作検証よりはマシやろ。w BashとかPerl5とかはすでにインフラみたいなもんだし。 まあ、Python2も消せないやろ、と思ってたら、意外と3のみになったもよう。 >>556 何を言っているのかイマイチわからん 現在の bash 3.2 ですら時代遅れだし、Apple自身でメンテしなくてはならない macOS内でApple製のスクリプトがあるんだったらもちろん代替になるので問題なく書き換えられるだろう 今まで通りならmacOSバンドルとしてはインストールされなくなるのは当然のような帰結 macOSの/bin/shのbash3.2はもう負債だよねw これからAppleはどうするつもりなんだろ zshは互換性ないし、dashにしたら機能低下だしw >>557 あー、アポーの話だったか。。。 まあ、今までも互換を壊すときには平然とぶち壊してきたし、マジメに考えてもしょうがないのでは。w いつ無くなってもいいように今からしとこというマジメに考えたらの話だけど マジメってどういう意味なのか知らんけど Appleは突然Swift出してきたりMetal出してきたりArm出してきたりであらゆる分野で考慮するだけ無駄というスタンス >>561 そうそう。w Bashをなくしたとして、POSIX互換シェルをわざわざ残すのかと。 そんな心配をするよりも、今使えるBashを謳歌したほうが合理的やろ。 その今使えるbashっていうのがmacOSでは3.2なのよね・・・ https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/migration_planning_guide/sect-migration_guide-package_changes-bash Bash-4.0 およびそれ以降のバージョンは、 プロセス置換の構成をブレース展開を使って変更せずに渡すことができるようになるため、 内容の展開はすべて別々に指定し、 各プロセス置換を別々に入力しなければならなくなります。 Bash-4.0 およびそれ以降のバージョンでは Posix が指定するのと同様に、 SIGCHLD が wait の組込みに割り込みを許可するため、 全ての子を待機するよう「wait」を使用する場合、 子を終了したら SIGCHLD トラップは常に呼び出されることがなくなります。 Bash-4.0 およびそれ以降のバージョンは、 クローズ用の区切り文字 $() コマンド置換を検索する場合に Posix のルールに従うようになり、 旧バージョンのような動作はしなくなりますが、 より多くの構文および解析のエラーを先に捕らえてからコマンド置換を評価するためのサブシェルを生成します。 Bash-4.0 およびそれ以降のバージョンでは、 パイプラインのコマンドのひとつがコマンド一覧を実行している間に SIGINT によって終了させられた場合、 シェルは割り込みを受けたかのような動作をします。 Bash-4.0 およびそれ以降のバージョンでは、 set -e オプションの処理法が変更されるため、 パイプラインが失敗すると (失敗したパイプライン内の最後のコマンドが単純なコマンドでない場合も) シェルは終了します。 これは Posix が指定するものとは異なります。 この部分の基準を更新する作業が進展中です。 Bash-4.0 の動作はリリースの時点での合意を得ようとしている動作です。 Bash-4.0 およびそれ以降のバージョンでは、"." がシステムの PATH に存在しない場合でも、. (source) ビルトインが ファイル名の引数を現在のディレクトリで検索してしまう原因となっていた Posix モードのバグが修正されています。 Posix では、このような場合シェルによる PWD 変数内の検索は行われるべきではないと述べられています。 >Bashをなくしたとして、POSIX互換シェルをわざわざ残すのかと 何もわかってないのに口出す馬鹿 シェル上で別の種類のシェルが動いたり、種類が異なるシェルが別のシェルの動作をエミュレートしていることを知らないんだろうね。 >>564 まあ見とけ。w どうせあと数年でコロッと変わるんやろ。 変わるも何も現状及びその対応の予測の理解が間違ってるってことなんだがw POSIXという標準があるから変わるわけないんだよな 多く使われてるdebian/ubuntuがPOSIXに準拠を頑なに守ってる /bin/shがdashが多いからPOSIX準拠で書くしかない そうすればmacOSでも動く 1行目と2行目以降が繋がらない bashのエミュレーションがちゃんとしてたら問題がなかったのにな GNUはライセンスにうるさいwくせになぜあんなのなのだかな >>554 chown chown smbd zip xargs smbd シェルスクリプト関連のツイート見てたらGPT-3?か知らんけど AIで文章を生成して日本語に翻訳してるボットを発見したw https://twitter.com/5hc7PFFLfvjD88V https://twitter.com/5chan_nel (5ch newer account) 素人ですが世話になります POSIXってシェルの最低限の共通規約って認識でいいんだろうか 機能を拡張しても所詮は方言だから封印しとけと grep -L pat file > /dev/null って捨てると返り血が変わる…? >>572 POSIXに準拠しておけば、Debian、Ubuntuの/bin/sh(dash)や Alpine Linux(busybox)やmacOS(古いbash 3系)やmacOSのユーザーシェル(zsh) でもそのまま、もしくはわずかな修正で動くようになるというメリットが有る 世の中全部bashやろーとか言ってるやつは、Debianで実際にシェルが変わったときや macOSのbashが古いなどで変化に耐えられず、最新のbashしかしらん どうせbash使うもんって言いはる羽目になってる bash依存してるやつは、なにか理由があってbash依存してるのではなく 無知ゆえに必要もないのに[[ ]]を使ったりfunctionキーワードを使ったり 独自のforの書き方をしたり配列を使ってたりするだけ ちゃんと知っていればbashスクリプトの9割は簡単にPOSIX準拠で書ける もしPOSIX shではなくbashを使いたくなったら、他の言語を使ったほうが良い POSIX shの機能は本当に必要なものだけを実装している。それがUNIXの思想 素人はまずPOSIXの機能だけ勉強しとけ 最初にbashから入ると、これはPOSIXで使えるんだっけ?って悩む羽目になる そういや日本人が作った口先だけのPOSIXの原理主義みたいな変なのがありましたねw 3人ぐらいのグループでPOSIXにしろーしろーと叫ぶだけで何も生み出さない それを使って自分たちは商売してるから 本人にとっては生み出してるんでしょうが あれに洗脳された学生とかは可哀想です。 だってそのグループ界隈以外ではまったく使われてないものだから >>576 いやいや、ニオイどころか、まるだしやろ。w 現実の動作確認もろくにできない机上のPOSIXを夢想してもしかたない。 んなこと、いちいちやってられんからな。 現実の動作確認ならDebianやmacOSやAlpine Linuxでできますが? >>578 原理主義者といえばそうかもしれんが、臨機応変なことができないのは確かそうだな >>579 それは、あくまで個々の実際であって、POSIXの証明にはならんやろ。 >>581 POSIXの証明って何の話? bash拡張機能はbashでしか使えない。POSIX shの範囲でならどのPOSIXシェルでも使える 実際にbash拡張機能はDebianの/bin/sh(dash)やAlpine Linuxの/bin/sh(busybox)では使えない という当たり前の話しかしてないが 俺に何を証明して欲しいん? 動かない命令でも書いてほしいんか? array=(1 2 3) ↑DebianやAlpine Linuxで動かない。ほらPOSIXの証明になったろw POSIX STRICTチェックみたいなものないの? もしくはピュアPOSIXの実装とか >>583 shellcheck こういうエラーが出る $ shellcheck posix.sh In posix.sh line 3: array=(1 2 3) ^---^ SC2034: array appears unused. Verify use (or export if used externally). ^-----^ SC2039: In POSIX sh, arrays are undefined. For more information: https://www.shellcheck.net/wiki/SC2034 -- array appears unused. Verify use ... https://www.shellcheck.net/wiki/SC2039 -- In POSIX sh, arrays are undefined. > もしくはピュアPOSIXの実装とか それがdash WSL(Ubuntu)の/bin/shもdash、ピュアPOSIXの実装 dashの目的は、それまで使われていた/bin/shの代替 高速で軽量でPOSIX互換を目指している この目的と目標は実現され /bin/shの代替として Debian系(Ubuntu含む)などで多く使われている FreeBSDやNetBSDでもashが使われてる dashはそのashをDebian用に移植したもの bashはインタラクティブシェルとしては一番使われてるだろうが shebangのは/bin/shが使われることが多いので シェルスクリプトを動かす場合はdashが一番使われているシェルだろう https://twitter.com/col_richie/status/1316543524569903111 リッチー大佐の中の人 @col_richie 「シェルスクリプトによる○○」と銘打ちながら、必要なものにPythonやGoが含まれるというなら、 それは「Pythonによる○○」あるいは「Goによる○○」に他ならな なぜ「シェルスクリプトによる○○」と語ることにこだわるのか? 他言語に頼る時点で既にそんな資格はない。当たり前だろうが!!! ↓ 郵便番号から住所欄を満たすアレを、シェルスクリプトで実装 https://github.com/ShellShoccar-jpn/zip2addr https://github.com/ShellShoccar-jpn/zip2addr/blob/master/commands/parsrj.sh ※ これはシェルスクリプトではなくawk(笑) # # # === Generate the JSONPath-value with referring the head of the ======= # # strings and thier order # awk ' # BEGIN { # # Load shell values which have option parameters # alt_spc_in_key=ENVIRON["sk"]; # root_symbol =ENVIRON["rt"]; # key_delimit =ENVIRON["kd"]; # list_prefix =ENVIRON["lp"]; # list_suffix =ENVIRON["ls"]; # # Initialize the data category stack # datacat_stack[0]=""; # delete datacat_stack[0] # # Initialize the key name stack # https://twitter.com/5chan_nel (5ch newer account) https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html NAME awk - pattern scanning and processing language awk - パターン走査および処理言語 DESCRIPTION The awk utility shall execute programs written in the awk programming language, which is specialized for textual data manipulation. awk ユーティリティは,テキストデータ操作に特化した awk プログラミング言語で書かれたプログラムを実行する. _人人人人人人人人人人人_ > awk プログラミング言語 <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄ >>591 awk ユーティリティは,テキストデータ操作に特化した awk プログラミング言語で書かれたプログラムを実行する. _人人人人人人人人人人人_ > awk プログラミング言語 <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄ たっくん シェルスクリプトでTwitterBotっていうのを見かけたけど、「コマンドの実装にGoを使う」って書いてあって「うーん?」となってしまった リッチー大佐の中の人 まったくだ。なめてるのかと。我らの小鳥男こそシェルスクリプトによる最強のTwitterクライアントアプリだ。 もちろん、別途シェルスクリプトを組めばbotも好きなように作れる。 https://github.com/ShellShoccar-jpn/kotoriotoko ↓ https://github.com/ShellShoccar-jpn/kotoriotoko/blob/master/UTL/base64 # Main (cat ${1+"$@"}; echo '') | awk ' # BEGIN { # # --- prepare # OFS = ""; # ORS = ""; # # --- prepare encoding # for(i= 0;i<256;i++){c2p[sprintf("%c",i)]=sprintf("%%%02X",i);} # c2p[" "]="'"$instead_of_spc"'"; # for(i=48;i< 58;i++){c2p[sprintf("%c",i)]=sprintf("%c",i); } # for(i=65;i< 91;i++){c2p[sprintf("%c",i)]=sprintf("%c",i); } # for(i=97;i<123;i++){c2p[sprintf("%c",i)]=sprintf("%c",i); } # c2p["-"]="-"; c2p["."]="."; c2p["_"]="_"; c2p["~"]="~"; # POSIX準拠コマンドの中で言語と言えるもの (セミコロンや改行区切りで "複数の命令" を手続き的に実行できるものを言語としています) awk - pattern scanning and processing language bc - arbitrary-precision arithmetic language ed - edit text sed - stream editor 他にもあるかな? bcは複数の命令を実行できるから言語だけど exprは式を評価するだけだから違う exでもできるん? sedとか"s/a/b/"みたいに一行のコマンドを実行してるように見えるけど 実際には s/a/b/ s/c/d/ みたいにsedスクリプトを実行できるわけだよね sedは置換をベースとしたかなり独特な言語だけど awkなんてBEGINで全部書いてしまえば 完全に普通のスクリプト言語になる bcも実際はスクリプトを使って計算する https://linux.die.net/man/1/bc の中間あたりにある例は 関数定義やif文while文も使っていて実は言語であることがわかると思う まあ言いたいことは、シェルスクリプトからPythonやGoを呼び出していて そこがメインで処理してるのがシェルスクリプトでないように awkやsedでメインの処理を行ってるなら同様にそれもシェルスクリプトではない じゃCで書いてるコマンド呼び出したらシェルスクリプトじゃないね >>598 そのとおりだよ シェルスクリプトで階乗を行うコードを実装しましたと言っておきながら C言語でコードを実装して、シェルスクリプトではそれを呼び出すだけなら それはシェルスクリプトで実装したとは言えない シェルスクリプトで実装というのなら、シェルスクリプトで 定義されているものだけを使って使って作らないといけない 例えば変数展開(を利用した文字列処理)や算術式展開を使った四則演算や case文を使った文字列パターンマッチング処理で作る 外部コマンド呼び出しは(そのコマンドを自分で実装してないなら) 外部コマンドと組み合わせてシェルスクリプトで実装したと言えなくはないが そもそもその外部コマンドがPythonやawkのような"別の言語"を使うものなら そこから別の言語に切り替わっている イチャモンつけるならmakeがチューリング完全って話にまで火花が散るので、適当な落しどころは POSIXに規定されておらず、それ自身が汎用プログラミング言語であることを目的として実装されたインタプリタやランタイムに対して、目的の処理を委譲しているのをシェルスクリプトだと表現されると気に食わない人が居る くらいでいいでしょ イチャモンつけるのも程々にしとかなきゃただ相手の意図を汲み取るつもりのない人間でしかなくなるぞ >>600 厳密な境目を見つけたいんじゃなくて https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html The awk utility shall execute programs written in the awk programming language, awkユーティリティは、awkプログラミング言語で記述されたプログラムを実行します。 と書いてあるんだから、awkは「awkプログラミング言語」 make は内部的にシェルを呼び出してるので GNU拡張は無視するとして、makeの範囲だけでなにか作れるんですかね? GNU拡張を含むなら沢山の関数があるので それらを使って作ったものは当然シェルスクリプトで実装したことにはならないですよ あとイチャモンの内容は、Pythonで作ったものはシェルスクリプトではないのはそのとおりだけど 同じ用にawkで実装したものもシェルスクリプトではないんだから awkで実装ばかりしてるお前(リッチー大佐)は自分のことを棚に上げてるwwwって言ってるだけ >>599 C言語でsystem()関数を使って、Bashを呼び出したら、シェルスクリプトだな! >>605 そりゃそうよw そのシェルスクリプトでメインの処理を行ってるんでしょ? >>603 だーからそういう揚げ足取りがしょーもないって話してんのが分からんかね awkがプログラミング言語であるのは否定しない ただ発端の話者はPOSIX狂いで有名な上awk多用してるんだから、対象のツイート中で言うプログラミング言語がPOSIXを除くものについての言及と考えれば辻褄は合うし、そう考えるのも突飛な発想と言うほどおかしくはないでしょ 確かにその人は語り口が横柄な事があるし好かれる性格キャラ作りはしてないさ でも個人憎しでしょーもない揚げ足取りしてんのは同等かそれ以上につまんねーことしてんなって感じだよ >>607 だから結論としては、awkはシェルスクリプトじゃないんだから お前(しょっかー)もawk使ってるくせにシェルスクリプトって言ってるじゃん ってことでしょ それ以外になにか言うべきことあんの? ないでしょ それで話は終わりだよね >>608 意図的に悪意を持って相手の意図を読もうとしてないんだと思ってたら本当にただ単に日本語読めないだけだったんだね… なんか…ごめんね? >>609 なんで相手の意図とか読んであげようとしてんのw 相手をかばう必要なんかないじゃん awkはシェルスクリプトではない 事実だけを言えばいい >>610 意図を読む事を相手をかばうとか言ってる時点でコミュニケーションする気なし、端っから粗探ししてdisる気満々じゃん そういうスタンスを俺は見てて気に食わないよ それだけ >>611 意図じゃなくてお前の願望だろw awkは明らかにシェルスクリプトじゃないし POSIX準拠のコマンドだけを使って作ったというのなら、そう言えばいいだけで そう言わない理由はあるわけがないので、単にそのことを理解してないってだけ それをお前はかばおうとしてるだけだろ >>612 >>607 に対しての時点でその返しが来てたら分からんでもないけど、そこでスルーしてんのに今更言ってんのが議論とか意見出しがしたいんじゃなくて粗探ししてますって自白してるようなもんでしょ そう言わない理由があるわけないは言い過ぎだよ 人間誰しも無意識の前提を置いてしまうことはある 恥ずかしいよねw 自分がシェルスクリプトといいながら、awkで書いちゃってるのに 他に人にはPythonはシェルスクリプトじゃないと言っちゃってるわけだw >>614 awkやsedはシェルスクリプトの一部とみなす慣例は大昔からだから。 シェルスクリプトに混ぜて書く場面が多ければほぼシェルスクリプトのようなものと思ったって何の問題もない それはお前の願望ですよね? https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html The awk utility shall execute programs written in the awk programming language, awkユーティリティは、awkプログラミング言語で記述されたプログラムを実行します。 >>618 そうだよ。UNIXでもそう説明される。ただし、実態は単独では使われない。 awkをシェルスクリプトと組み合わせて使っても awk言語がシェルスクリプトに変わるわけがないって話ですよね? いつから単独で使われるかどうかの話にすり替わったんですか? シェルスクリプトがシェルのスクリプトだとわかってない? シェルのスクリプトから呼び出す 外部コマンド(awkやpython)が シェルではないことぐらい知ってるよね ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる