シェルスクリプト総合 その32
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 ・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。 シェルスクリプト総合 その31 https://mevius.5ch.net/test/read.cgi/tech/1565446670/ なんか説明しようとしたんだがな ダブルクォートが入っていても関係ないよ。なぜかは調べてね >>518 悪い文化というより、POSIXで規定しろというだけかな 悪い文化のががっつりカーネルで実装されてるんだけど >>521 単なる表現だから気にしないでほしいけど 悪い←実装ごとに挙動がバラバラ・標準仕様が規定を諦めている 文化←にもかかわらずほとんどの実装がこれを取り入れていて、利用者もしょうがなく使っている という状況を言ったつもりだった。 >>522 なるほど まあ、誰も(大多数が)困ってないんじゃなのかな、統一されてなくても もしくはそれぞれがそれぞれが良いと思って譲らないとかかwそれは確かに悪い文化だな 誰も困ってないって方だと思うけど shebangが悪い所の一つは絶対パス指定ってところなんだよね content-typeみたいなのだったら良かったのに shebangのオプションに関しては使わないっていうのが正解なんだと思う なぜならファイルを直接指定して実行すると変わっちゃうから てかshebang使わなくてもシェルから起動したらそのまま動かない? と思って、念の為Bashから起動したらまさかのaliasが効かなかった……。 こういうのを避ける為に#!/bin/shとせざる得ないのか。残念。 >>524 絶対パスかどうかは、シェルというか、インタープリタに依存するんじゃないの? Pythonなんかだと、パスさえ通っていれば、#!python とか #!python3 で使い分けできるし。 >>526 (少なくとも現在は)shebangを解釈しているのはOSであって、絶対パス必須 #!pythonと書いたスクリプトをexecveした場合、普通は動かない みんな #!/bin/env python じゃないの? 環境変数使ってくれるよ envがあるところは/usr/bin/envな あとそれ使うと #!/usr/bin/env bash -e とかできなくなるからな Linuxで >>529 /bin/envの環境と/usr/bin/envの環境がある >>530 envってコマンドを使うと、環境の違いを吸収してくれるから便利だぞ >envがあるところは/usr/bin/env に対しての /bin/envにある環境もあるって話だろ。「それってなに?」だろ言うなら >>531 そのenvコマンドとやらのパスが環境ごとに違うんだよなぁ…。 なんかこの前々スレあたりで標準出力と標準エラー出力に別々の処理を施した上で どちらも標準出力に流す方法を見た覚えがあるんだけど 今それっぽい語句で検索しても引っ掛からない。 覚えてる人いない? >>446 ありがとうございます。 コードを参考にさせていただいて、 sed -e 's/\("[^"]*"\)*,\("[^"]*"\)*/\1 \2/g' という手法にしました。 今のところ <<. cat | aa,"dd,dd","aa,bb",cc,"ab c" . sed -e 's/\("[^"]*"\)*,\("[^"]*"\)*/\1 \2/g' がうまいこといくので満足してます。 どうもお手数おかけしました。 case $value in ここ) esac ここって何ていうの?globじゃないよね? bash(1) だと pattern って書いてある (unofficial) Bash Strict Modeって知ってる? http://redsymbol.net/articles/unofficial-bash-strict-mode/ これが何って話があるわけじゃないんだけど有名なのかな?と思って 外国だとそれなりに情報出てくるけど日本はあまり見つからない 名前が知られてないだけでsetで-eu -o pipefailしましょうというのは聞くけどね ただIFS=$'\n\t'は知らなかったな。これやったほうがいいんかな? スペースが削られてるから問題起きそうだけど >>545 IFS=$'\n\t' ↑これはどういう事態を防げるの? 寧ろ for file in *; do echo $file done こういうのが動かんくなる気がするけど。 >>546 それは変数使ってるわけじゃないから問題なく動くよ なるほど。文芸的プログラミングという ドキュメントを書くときにコードを埋め込んで (動作確認のために?)実行できるようにするための マークアップ言語みたいなものがあるんだな コードの中にコメントを埋め込むのとは逆の発想か bashのsourceって英語としては意味なんだろう? includeとかimportだったら読み込むってわかるけど、 なんでsourceって単語にしたんだろうか なんのことかと思ったらMarkdown文書をソースとするshellがありますぞというだけかという感じ >>551 元々は設定ファイルを読み込む $ source .bashrc あたりで使っていたようなので、「基にする」あたりが 英語の意味かと思う 今から考えるとimportコマンドとかの方がいいね。 importは他のファイル等で定義済みの関数やクラスを今の名前空間に持ってくるイメージ sourceは他のファイルに書いてるコードを実行するイメージ 言語によってはやってること同じだったりするけど主たる目的が違う気がする > sourceは他のファイルに書いてるコードを実行するイメージ 動作としてはそうなんだけど、 気になってるのは英単語としてどうかなんだよね 変なことを気にしてると思うけど そもそもsourceって動詞?ああ、動詞としての意味もあるのか? https://talking-english.net/source/ > sourceは動詞でも使い方があり「仕入れる」といった意味になりますが、 > > 例文 > We source our coffee beans from Venezuela. > 私たちはコーヒー豆をベネズエラから仕入れている。 importに名前空間を移動する印象があるのは同意だけど sourceの「他のファイルに書いてるコードを実行する」ような印象はないな。 つーかsourceってシェル以外でみかけない。 名前空間とか高級な概念を無視する、単なる対象ファイルの実行・読み込みは includeが一番「それっぽい」な。 C言語みたいなコンパイル方式でもm4・Xresourceみたいなインタプリタ・設定ファイル形式でも。 sourceの本来の名前が . だとして、 /etc/profileとかに . /etc/bash.bashrc とか書いてあるでしょ? これは関数定義等を読み込んでると言うより、 ただそこにあるスクリプトを実行してるという感じがしない? そもそもなんで . (ドット)だったのかっていう疑問もあるけどw >>560 ああ、いや、たしかにそうなんだけど、 sourceっていう名前の(または.(ドット)って名前の)コマンドや指令が シェルスクリプト以外で見掛けないなと思ってさ。 じゃあシェルスクリプト以外の言語でsourceに最も近いはたらきをするのは なにかって言えば、includeかなぁ。と。 includeで言えばC言語かなぁ でもC言語のincludeはヘッダファイルの読み込みで (今のC++はそうとは言えないが) 実行するものはなにもないものだったよね .やsourceを他の言語で見たことがないのは同意 なんでこの単語を選んだのか。まあ当時はそういうことをするときの 標準的な単語はなく、includeやimportの方がたまたま有名になったってだけな気もするけど includeってC/C++以外あったっけ? include, import, load, require, source 他に何があるかな? とういうか、その話をするためにきたんじゃなかったw makeってどういう亜種があるの? それぞれのOSでどこまで互換性があるの? どこかにそういう情報まとまってないかな https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html ここにPOSIXに関しては書いてあるけど、現実としてはどこまで互換性があるのかなと つまり便利ないろんな機能(?が使いたいけど、ここには書いて無いようで 使っていいものなのかわからない Makeについて調べていたら上のシバンの話、!の後にスペース入れれっていうのが見つかったでw https://web.sfc.wide.ad.jp/ ~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html > また,以 下のように,インタプリタ仕様として,感嘆符の後にスペースを含めてください. > > #! /usr/bin/perl ここまでコピペするべきだった > パスの前のスペースを省略する場合,(DYNIXのような)4.2BSDを基本 とするシステムは, > `#! /'は4バイトのマジックナンバーとして解釈される ので,その行を無視します. > 古いシステムでは,`#!'行の長さにも小さな 制限があり,例えばSunOS 4では,(改行を含めず)32バイトになります. >>569 それ間違っている https://www.in-ulm.de/ ~mascheck/various/shebang/#blankrequired >You may also read, that (allegedly) such a kernel parses "#! /" as a 32-bit (long) magic. >4.2BSD in fact doesn't require it, although previous versions of the GNU autoconf tutorial wrongly claimed this ("10. Portable Shell Programming", corrected with release 2.64, 2009-07-26). >But instead, see 4.2BSD, /usr/src/sys/sys/kern_exec.c (the first regular occurence). A blank is accepted but not required. >>563 あなたはC言語がUNIXを作るために作られた言語だと知らないの? >>569 そもそもどのUNIX、Linuxの話をしているのか? >>575 それがどう話につながるのか説明してくれ shellはUNIX上でのいちプログラム、UNIXはCで作られてる。shellだってCで(途中から?)作られていただろう。故に、 >当時はそういうことをするときの標準的な単語はなく、includeやimportの方がたまたま有名になった ということはなく、同じならinclude使うんじゃねってとこかな?なんか違うから違うのにしたという方が読みやすいかなあ shell scriptはPrologの構文が元じゃなかったっけ。ちょっとググったとこでは、 :- か。なんかこれに似てるといえば似てるな . は >>577 先に存在しているC言語とは別の考えで設計されている。カリフォルニア大学のバークレー校の複数人が考えたものだから、統一感がないのは仕方ない。 >>572 linuxならlinux自体にプロセス名の長さ制限(16文字)があるからそうなる コマンドライン自体はlinuxも十分長い文字列を扱えるから、-fを使えばよい >>578 >shell scriptはPrologの構文が元じゃなかったっけ 違った。ALGOLだな。ALGOLでそれっぽいのはUSINGみたいだが、ちょっと違うなあ for a in XXX; do somecmd... done ↑ここのXXXの大きさについて、SUSやらで文書化された制限ってある? もしあるとすればどう調べればいいかな。 XXXは引数じゃないからARG_MAXとかじゃないし、 もしかしたら実質無制限?(システムのメモリに依存とか?) ksh 2020がでたのは知ってるけどkshに一体何が起きてるんです? 20年以上の開発がゴミクズとして消えるんですか? Rewinding this repo and encouraging community https://github.com/att/ast/issues/1466 https://github.com/att/ast/tree/ksh2020 This branch is not supported This branch contains the ksh2020 version of the AST tools, from January 2020, which primarily written and maintained by @krader1961 and @siteshwar. This branch is not supported or maintained by AT&T; the repo at https://github.com/att/ast only officially hosts ksh93u+ and the experimental ksh93v- branch. See #1464 and #1466 for discussion and history of this decision. Please search for forks of this repo if you are looking for ksh2020. https://github.com/att/ast/issues/1466 私はAT&T Labs Research で@lkoutsofiosと協力し、コミュニティが 快適な状態にレポを復元できるかどうかを確認するためにボランティアで参加しました。これは最後に#1464で議論されました。 私はkshや技術的な問題の専門家ではなく、歴史全体を知りませんが、私の理解は 1. ksh93u +は、AT&Tからの最終的な公式リリースです。これはブランチ2012-08-01-masterにあります 2. 後のバージョンであるksh93v-は、AT&Tを離れた後に元の作者によって提供されましたが、 このバージョンは安定しているとは見なされません。これはタグksh93vで見つけることができます 3. @ krader1961はmasterブランチを数年間維持しています。彼はコードベースを合理化しようとしました (そしてastの残りではなくkshのみをサポートしました)が、これは互換性の問題を引き起こしました。 kshの元の作者はすべてAT&Tを去りました。社内にはまだ多くのユーザーがいますが、 プロジェクトを維持および管理できるユーザーはいません。 私の提案は: ・ 現在のマスターをブランチ「ksh2020」(または適切なもの)に移動します。 ・そのブランチのREADME.mdおよびCHANGELOG.mdをメンテナンスされていないものとして 明確にマークします。#1464をポイントし、詳細についてはこの問題を参照してください。 ・ マスターブランチを2012-08-01-masterにリセットします ・リポジトリから外部の共同編集者を削除します。AT&Tの誰もこれを維持していないので、 このフォークをアクティブなものにすることは意味がありません。GitとGithubを使用すると、 誰でも自分のスペースで好きな方向にコードを取得できます。 ・ README.mdをクリーンアップして、現在の状態を反映します。「このレポには、ASTの AT&T ksh93u +および試験的なksh93v-バージョンが含まれます。ASTおよびkshのフォークは 後である可能性があります。」 ・ CONTRIBUTING.mdを変更し、テンプレートを明確にして、このフォークを 積極的に維持しておらず、何も確認しないことを約束します。 ・リポジトリの説明を「AST-AT&T Software Technology」に短縮します(#1441) これが完了したら、AT&Tでmasterブランチのksh93u +にパッチを提供する可能性があります。 些細なこと(ビルドの問題など)でない限り、貢献を確認したり受け入れたりすることはおそらくないでしょう。 最終的には、このリポジトリをアーカイブします。 現在、会社の誰もがkshのためだけにレポを作成するつもりはないと思います。 しかし、これはかなり簡単で、コミュニティが取り上げることができると思います。 こういうこと? 1. AST-AT&T Software Technologyはkshだけのプロジェクトではない。kshはASTプロジェクトの一部 2. 誰かがkshだけをメンテナンスしていた。ASTプロジェクト全体をメンテナンスしてる人はいない 3. 今リリースされてるksh 2020はそれ 4. ksh 2020 は後方互換性がなく古いスクリプトが動かなくなっていた 5. それは困るのでmasterを2012-08-01-masterにリセットしてアーカイブする 6. AT&Tはこのリポジトリをメンテナンスしない。 誰か開発したいのなら、ksh2020ブランチから続きをやれ 7. ksh2020ブランチにはもうメンテナンスしてないって書いてあるからそれ消してから勝手に続きをやれ Google翻訳使うなとは言わないけど,わざわざそれをスレに載せるな。 せめて自分で訳したものならともかく,なんの情報でもない。 え?翻訳すらしないでコピペすることだってあるじゃん そういうのを引用っていうんだよ。 引用したらだめってこと?意味がわからないなぁ >>590 飛躍しすぎ。 スレと関係ないただの忠告になるからこれ以上言わんが、 引用するななんて一言も言ってないし,ただの引用のほうがよほどマシ。 ていうかGoogle翻訳したものを貼り付けて「引用」って…… あなたはGoogle翻訳(機械翻訳全般)を信じてるのかも知れないけれども, 2020年現在,これらの翻訳の質は,あなたが貼り付けた文章を見ても分かる通り,酷いもの。 半分「嘘っぱち」の文章が出てると言っても過言じゃない。 特に,機械翻訳の中でも,minhonやlibtr8nとは違って,Google翻訳は2018年ころから 「学習した英語・日本語訳文からそれっぽい文字の並びを引っ張ってくる」っていう手法を取るようになったから 「見てくれは他の機械翻訳より自然≠セけど内容が全くデタラメ」っていう最悪の事態を生み出すようになってしまった。 幸か不幸か,あなたが貼り付けた文章にそこまで酷い誤謬はないけど,上述の翻訳手法である以上, Google翻訳した文書を貼り付けるのは,原文を貼り付けるより酷いばかりか, 何も情報を提供せずに各自がリンク先なんかで情報を確認するよう要求するほうがよほどマシなくらい。 あなたは悪気なくGoogle翻訳を使って,スレに貢献しようとしたのかもしれない。 リンク先の文書の内重要と思われる部分をスレ本体に引用することは悪いことじゃないけれど, そこでGoogle翻訳を使ってしまうのは,ちょっとキツい言い方になるけど「嘘を教える」ことに繋がってきてしまう。 もしこれからリンク先の文章を引用する機会があれば,原文を貼り付けるか,下手でもいいから自分で翻訳してみてね。 >>591 はは、的外れすぎてワロタw 英語をそのまま貼ってもリンク先読まない人が多いから 単に変換しただけ。英語というだけでスルーする 日本語ならぱっと見でわかる。内容が気になったのならリンク先読みなさい。 読んだのなら貼り付けた意味があったということ >>593 もう放っておこうぜ。 俺なりにかなり丁寧に説明したんだけど, どうも何について文句を言われてるかすら分かっていないようだから。 >>591 こういう輩は長文を読む力がないのだから、こういえばいいんだよ 「日本語でおk」 擁護賛同してるのか?あそこの初っ端は間違っているけどな 直してやれよ コマンドの速度を測りたいときに出力を/dev/nullに捨てるとその影響で 出力を捨てないときより速く計測されてしまうことがあるんだけど 例: $ time { < /usr/bin/od od -A nx -t x1 -v; } ... 出力略 ... real 0m0.055s user 0m0.042s sys 0m0.008s $ $ time { < /usr/bin/od od -A nx -t x1 -v > /dev/null; } real 0m0.020s user 0m0.020s sys 0m0.000s これを防ぐために「端末上に書き出してるのと同じくらいの負荷が書かるけど、実際には端末上に出力されない」 みたいな状況を作りたい。 おしえてください。 pv 使うとか $ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' $ time { < /usr/bin/od od -A nx -t x1 -v; } : real 0m0.404s user 0m0.024s sys 0m0.005s $ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' $ time { < /usr/bin/od od -A nx -t x1 -v | pv -q -L2M > /dev/null; } real 0m0.458s user 0m0.019s sys 0m0.007s >>597 画面に出力されてる時間のせいだから無理じゃね? /dev/ttyにだせば端末上に出力されてるけど標準出力に影響はない あとは出した上でエスケープシーケンスで消すとか >>598 うーん。ちょっと偉そうな注文だけど システム全体の設定を変更したり、 かつroot権限が必要なのはちょっと… >>599 エスケープシーケンスは思い付かなかった。 でも出力の中に一つでも文字属性を元に戻すようなものが 含まれたりするとマズいよね(いやまあ,それに目を瞑ればいいだけの話なんだけど)… どうも一般的な方法では無理そうなので, ダラダラ出力させることにします。 困ることといえば端末のスクロール履歴が消えるくらいだし。 標準出力バッファを無効にして/dev/nullに送り込むと良いかも。知らんけど ていうかtimeで測った絶対速度なんてほとんど信用できなくて、(ハードウェアの状態なんかに依存するから) 使い道としては複数のコマンドどうしの相対速度の比較が主でしょう。 ならば、両方とも> /dev/nullに捨てておけば、相対速度としては変化しないから速度比較の目的は果たせるのでは。 リダイレクトとfdは概ね理解したけど3以上はどう使えばいいんです? 1>や2>は自然と使い分けてるけど1>&3を使う機会なくて &>の方がまだ出番ある >>603 スクリプト開始時の stdout や stderr を保存しておくのに使うぐらいかなあ # stdout を fd=3 にコピー exec 3>&1 # fd=1,2 を foo.log にリダイレクト exec > foo.log 2>&1 echo "foo.log に途中経過出力中です..." >&3 ... echo "処理B開始" >&3 ... echo "終了しました" >&3 bashの問題なのか知らんけど、 CRとかLFとかTABとかVTとかをどう解釈するかって 制御するフラグってあったりする?OSがらみの設定でもいいけど >>604 foo.logには標準出力とエラーが両方保存される >&3がある行だけが画面に出力される よく出来てますわ ログ取りに使えるのか >>606 sttyコマンドなのかな? 詳細は言えないけど、"予め構築された特定の環境"のみおかしくなる (どうやって構築されたかは公開されてない) それと近いと思われる環境を自分で作っても再現できなくて困っている。 evalやコマンド置換と改行やタブ含めたホワイトスペースに属する文字を 使ったときにおかしくなってるのはわかるんだが どうやったらこんな状況を作れるんだろうか。なぞだ。 頭悪い奴ってのは、おかしくなったとかエラーになったとかいうだけで、 どうなったのかメッセージはなんなのか、そこを書かないのは何でだぜ おかしいのはシステムじゃなくておまえの頭だろうという evalするときに何故か構文エラーが起きたり ホワイトスペースがどこかで消えたりしている。 >詳細は言えないけど なんだろ。単なるチラ裏なことを長々とというだけの 対処する側なのにその前置きでエスパー求めるなんてありえないし もちろんその環境以外ではそんな事は起きていない。 だから制御する方法があるのだろうと思ってるがわからない。 >>610 何かを求めたいなら具体的に書こうな。Terminalでのまんまとか そのままじゃ何か問題があるなら、似たようなのに加工できるだろう >>613 具体的に書くとまずいことがあるからわざとぼやかしてる 短くしたら、お前が俺にレスさせるようにしただけ。 最初に詳細は言えないって書いてるんだから察しろ そうちゃんと読みとって>>611 と書いているんだが。すでに 何かをまだ期待してちょっとだけな>>610 をとか続けるようだからなんだがな これ以上もうないだろけど 俺が>>610 と続けた後に お前が>>611 を書いたんだろ 時系列ぐらい把握しろやw ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる