macOS Sequoiaでrsyncがopenrsyncに置き換えだと!? 完璧なファイルコピーはもう無理なのか
引用元:https://news.ycombinator.com/item?id=43605003
openrsyncのドキュメントがイマイチで、rsyncの代わりになるか不安だなー。
ファイルコピーするなら、完璧なコピーじゃないとダメじゃん?データとかメタデータがちょっとでも欠けたらゴミだよ。
UNIX系のコピープログラムって、デフォルトだと完璧なコピーできないのが多いし、オプション変えても無理なのもあるし。
scpも昔はOSとかファイルシステム違うと完璧なコピーできなかったから使ってない。rsyncだけが完璧にコピーできるんだよね(オプション次第だけど)。FreeBSDのUFSとLinuxのXFSの間でもOK。
openrsyncのドキュメントじゃ完璧なコピーできるか分かんないから、今はゴミ扱い。
bsdtarは完璧なアーカイブ作れるよ(pax形式ね)。
(rsyncはいつもaliasでオプション付けてる)
coreutilsのcpもオプション次第で完璧にコピーできるけど、コンパイルオプションが変だとダメ。
意見が違うけど、バックアップ会社で働いてて、ほとんどの顧客(大企業)はメタデータの99%が正しく復元されなくても気にしないみたい。データさえ戻ればOKって感じ。
(うちは全部丁寧に復元してるんだけど、気にしてるのってうちだけなのかなー)
「気にしない」って言ってる人も、パーミッションがおかしくなったり、時間ベースのスクリプトが動かなくなったりしたら、絶対気にすると思うよ。「データが消えた!」ってパニックになってる時は、誰もそんなこと考えないんだろうけど。
みんなが気にしないのは、あなたが気にしてるからだよ。だから、気にしないことによる不幸を経験したことがないんだ。
いやいや、そんなことないって。ACLとか正確な日付とか、必要ないデータも多いよ。
それに、DICOMとかパスワード付きPDFとかZipアーカイブみたいに、アプリ固有のデータ形式は、ファイルシステムの「追加」属性なんて気にしないことが多いんだ。だって、 universally supported じゃないし、ファイル形式の中で独自に実装してるからね。
同意。データが99%重要で、残りは作り直せるか、どうにかできると思う。ファイルメタデータに頼りすぎてるなら、もっと設計を見直すべき。
もしその情報が業務プロセスを動かすなら、それはメタデータじゃなくてデータだって言えるんじゃない?
OPのコマンドの出力
$ /usr/bin/rsync –version
…openrsyncのこと何も言ってない。Sequoia 15.3.1だけど。
変更は15.4でされたみたい。
えー、こういう変更ってマイナーリリースでやるべきじゃないよね…
それって破壊的な変更なの?
それってAppleみたいな会社が「誰も使わない」って理由で重要な機能を削除するのと同じ思考回路じゃん?Yogi Berraの「誰も行かない、混みすぎてるから」って言葉を思い出すわ。
例えば、Apple製品のターゲットディスクモードを知らない人も多いけど、あれのおかげで何時間も助けられてるし、管理も楽勝なんだよね。ターゲットディスプレイモードを使ったことある人に、それなしでどうすんのって聞いてみてよ。
あと、Time Machineってrsyncベースなんだよね。
>openrsyncの現在のドキュメントには、完全なファイルのコピーを作成できるという保証はないから、デフォルトではできないと思ってる。だから今のところ、役に立たないプログラムだと思ってるよ。
それって単なるドキュメントのスタイルトーンのミスマッチってことない?俺なら、openrsyncは単にライセンスが緩いrsyncだって思うけどな。違う動きをするなんて思わない。ちゃんと検証したの?それとも単なる懐疑論?よくわかんない。
追記:openrsyncのreadme読んだら、rsyncと互換性があって、rsyncのドキュメントを参照しろって書いてあるじゃん。拡張ファイル属性とかACLとか高解像度タイムスタンプがプロトコルレベルでオプションじゃない限り、最近のrsyncがサポートしてることは全部サポートしてなきゃ互換性があるとは言えないよね?それとも、プロトコルは全部受け入れるけど、ACLとかを無視してるってこと?
記事から引用するね:
>openrsyncのコマンドラインツールはrsyncと互換性があるけど、ドキュメントにあるように、openrsyncはrsyncのコマンドライン引数のサブセットしか受け付けない。
でもそれって、メタデータを完全にコピーする機能がないって意味じゃないかもよ?openrsyncは実装を簡単にするために、古くて時代遅れのオプションを削除しただけかもしれないじゃん。
うーん、それらの古くて時代遅れのオプションは、多くのユースケースでまだ重要な役割を果たしてるかもよ?
例えば、tarのマルチボリュームサポートはまだ使ってるし。あれって、tarがテープアーカイブに使われてた頃の名残なんだよね(だからtarって名前なんだよ)。それがないとマジで困るんだ。ハードディスクをバックアップテープとして使ってるから(これが意外と使えるんだよね。つい1、2週間前にリストアが必要になって助かったんだ)。でも、tarユーザーの99.9%はそんなこと知らないと思う。
rsyncも、みんなが思ってる以上にいろんなことに使われてるスイスアーミーナイフみたいなもんだよね。特にリモート機能はマジで凄い。
問題は、何かをクローンするときに完全な互換性がないと、ユーザーは頭を悩ませてイライラするってこと。それなら、別の名前をつけた方が、違うものだって分かりやすいよね。
まあ、そうだね。俺は押し付けがましいソフトウェア(例えばAppleとかGNOME)が大嫌いなんだ。俺に合ったニッチな使い方を見つけるのが得意なんだよね。今はKDEを使ってるんだけど、完全に自分の好みに合わせて改造してるよ。UIと戦わなくて済むから、生産性が上がるんだよね。何百万ものニッチな機能を持つツールは最高。
俺が本当に価値を感じるソフトウェアは、何か変なことをする必要がある状況になって、ドキュメントを読んで回避策を探そうとしたら、まさに必要な機能が隠されてるのを発見したときだね。開発者が俺の心を読んだみたいで。本当に大切に思えるパッケージは少ないんだ(今の時代は特にね。昔のPCソフトウェアの方が強力だったと思う)。
その一つがSP (SK Packet Radio)で、何度かそういうことがあったんだ。あれは本当に凄いソフトウェアだった。8088とTSRベースのソフトモデム(電話回線じゃなくて無線に接続する)で、いろんなことができたんだよ。マジで。どんな突拍子もないことでも、設定だけで実現できたんだ。
これが押し付けがましくないKDEの味:
>https://invent.kde.org/system/dolphin/-/merge_requests/1
OpenRsyncはOpenBSDプロジェクトのものだよ。これは通常、品質が高くてセキュリティに重点を置いてるってことの指標になるね。でも、このケースでは、公式サイトでさえこう言ってる:
>まだ作業中だよ…だから待っててね。
OpenBSDってACLサポートなくしたんだよね、確か。 これはAppleのライセンス問題で、気にするユーザーは少ないと思うな。そういう人はrsyncインストールするでしょ。 Appleが今使ってるrsyncって2006年のバージョンなんだって。iPhoneより前だよ。 それが最後のGPLv2のみのrsyncバージョンなんだね。 素朴な疑問なんだけど、AppleってGPL v3のソフトウェア使うの何が問題なの? Appleはすべての実行ファイルに署名してるから、誰かがGPLv3を使って、Appleに署名キーを渡して自分のバージョンを実行させようとしたり(anti-tivo条項)、GPLv3ソフトウェアを出荷したことで特許侵害で訴えられなくなるリスクがあるんだって。裁判でどうなるかは別として、訴えられるリスクを避けるために、企業はGPL3に近づかないんだよ。銀行もGPL3には触らないんだ。 銀行みたいな組織が、製品に使わなくても、社内利用でもGPL3を禁止するのってなんで? GPLv3には、ソフトウェアの配布全体をカバーするような文言が含まれてるらしい。つまり、GPLv3のものをOSと一緒に出荷すると、rsyncと一緒に配布されるものすべてをエンドユーザーがコンパイルできるようにする必要があると裁判所が判断するリスクがわずかにあるってこと。 完全なコピーってどういう意味?ファイルの中身のこと?それともファイルシステム属性も含むの? ファイルってデータとメタデータ(ファイル名、タイムスタンプ、アクセス権とか)で構成されてるよね。デフォルトだと、ファイルのコピーは全部含めるべき。もし保存できない場合は警告が必要。rsyncみたいなコピーユーティリティは、OS間のAPIの違いに対応する必要があるんだ。 ファイルについてる属性の話だよね。普通にコピーしたらファイルの属性は全部同じにはならないんじゃない?ファイルの中身は同じでもさ。一部はコピーされると思うけど全部じゃないでしょ。 ファイルってのはファイルシステムのエントリーのことだから、メタデータも含まれるんだよ。データだけじゃないんだ。 つまり、ファイルの属性の一部はコピーされるけど全部じゃないってことでしょ? :D オーナーとグループ以外は全部コピーされるべきだと思ってるよ。作成日、更新日、ACL、拡張属性とか全部。 コピーで作ったファイルの作成タイムスタンプは、コピーした時点になるのが普通じゃない?だって、その時まではファイルは存在しなかったんだから。 逆の意見だけど、sshdとかsshとかslurmとかmungeとか、特定のユーザー、グループ、モードじゃないと動かないプログラムって結構あるんだよね。セキュリティとか動作の保証のために。 SELinuxのコンテキストって、コピーするときに常にコピー元からコピーされるべき?それとも、コピー先のディレクトリー構造で定義されたポリシーを継承するのが普通? 普通は違うよ。特別な指定をした時だけ。 >それはほとんどのファイルコピーツールがデフォルトで行うことではありません。 ファイルコピーユーティリティにこれ(拡張ファイル属性のコピー)は要らないな。拡張ファイル属性に頼るのはアンチパターンだよ。タイムスタンプが大事なら、ファイルフォーマット自体に入れるべき。パーミッションが大事なら、プロビジョニングとアクセスシステムに入れるべき。WebアプリケーションとかAPIとか。 Linux初心者だけど、システムのユーティリティのバージョン管理ってマジでごちゃごちゃしてる気がするんだよねー。 そういう時は Unix哲学とかって、後付けの言い訳じゃん?共有ライブラリとかまともなスクリプト言語がないのを正当化してるだけ。1 + 1 = 2をテストするのに、重いプロセスを3つも立ち上げて、意味不明な記号をいっぱい使わないといけないとかありえない。[ ”$(expr 1 + 1)” -eq 2 ] ←こんなの。 え、それ20年前の話じゃね? 20年じゃ20世紀にすら戻れないぞ。Bourneが 昔はそうだったけど、今はもう直ってるよ。 それはLinuxディストリビューション(UNIXじゃない)で修正されただけ。 UNIXは死んだ。誰も気にしてない。今はLinuxだけ。 そうだけど、実際は違うじゃん。 今現在の話をしてるんだけど。 アプリはLinux向けに書かれるのが最初で、LinuxはUnixじゃないからね。 あんたが修正例で48年前のBourne shellみたいな古臭い構文を使ってる限り、俺の例も直さないよ。そこが問題なんだってば。> bash -c ‘[ $((1 + 1)) = 2 ]; echo $?‘だって?Perlだってこんなに記号使わないっての。Lispの括弧が多いって文句言うくせに。Grawlixの絵文字まである始末。 おすすめのシェルって何? 「Unix Haters Handbook」も「Worse is Better」も好きだけど、時代は30年前に終わったよ。あんたの「老人が雲に叫んでる」 rantは、Bjarne Stroustrupの「文句を言われる言語と、誰にも使われない言語がある」って言葉を思い出すね。LISP machineでもPlan9でも好きなの使えばいいじゃん。俺らは不完全なツールとその哲学を楽しむよ。 Unix哲学は「ハンマーさえあれば何でも釘に見える」ってこと。ESRの本はUnixをドグマにして、欠点を美徳に仕立て上げてる。彼はPR担当でハッカーじゃないし、Unix Wayを理想化しすぎ。おまけに人種差別主義者だ。歴史的な偶然を神聖視するな。古いやり方をエレガントな哲学と勘違いするな。もっと良くできるはずだ。哲学は精査されるべきで、崇拝されるべきじゃない。ツールは進化すべきで、停滞すべきじゃない。そして、雲に叫ぶことが変化の風を吹かせることがある。 完璧なツールなんてない。Unix哲学はドグマじゃなくて哲学だよ。ある場合には役に立つし、別の場合には一つのプログラムに全部詰め込めばいい。ハンマーは何千年も前からあるけど、ネジが発明されたらドライバーが必要になったんだ。 TWO heavyweight processes これが昔の遺物で、構文と意味論に苦しめられてるって言ってるんだよ。TWOをTHREEに修正して、プロセスが3つになる理由も説明したじゃん。問題は、元々ひどい設計だったのに、後方互換性のために今もその結果に縛られてるってこと。「速くなくてもいい」って、Unix Philosophyを擁護するために無理な言い訳してるだけじゃん。シェルは遅くて非効率で複雑であるべきだって言うのか?あんたのシェルスクリプトが速くなくてもいいのかもしれないけど、俺は違う。 別にUnix哲学なんて一言も言ってないし(笑)。あんたが貼ったシェル芸がなんでそうなってるのか説明しただけだよ。長々とUnix哲学を語ってるの、あんただけじゃん? Unix哲学とかいうのが過大評価されてるって気付いたのは1993年くらい。Perlを覚えたら、すぐにコマンドラインツールを色々使うのやめた。 $thing$を組み合わせるのが過大評価されてるって気付いたのは1993年くらい。「Grand Unified $thing$」があればいいじゃんってなって、$thing$を色々使うのやめた。 ジョークがよく分かんない。コンテキストとタイミングからすると、Perl6/Rakuのことで、Larry Wallが古代人ってこと? Perlだけが世界じゃないんだよ。マジで。 Unix哲学とかいうのは、FOSS信者の間で流行ってる、意味不明な慣習だよ。Xenix以来、商用UNIXを使ったことないんじゃない?マニュアルにオプションが山ほど載ってないUNIXなんて見たことない。 あんたの“Windows哲学”にうんざりだよ。NTがVMSの焼き直しだってことは置いといて、DOSが裏で動くクソみたいなW9xをまだ使ってるかもしれないじゃん。 Windows哲学なんてものはないし、OSも言語も崇拝しないよ。全部一長一短あるから、状況に応じて使い分ければいい。自分自身を技術スタックと同一視するのは、生まれたときから特定のサッカーチームのファンになるようなもの。 別にUnixしか使ってないわけじゃないよ。RPIでRisc OS(Apache 2.0?)を起動して、Unix/C以外のことを試してる。 Windowsみたいな脳みそがイカれたOSでも、PowerShellがある。PowerShellを使えば、あらゆる種類の操作を簡単かつ効率的に実行できるし、ライブラリ(“cmdlet”)を動的にリンクして直接呼び出すこともできるし、型付きの文字列以外のパラメータを持つ関数を呼び出すこともできるし、コピーやコンテキストスイッチやシリアライズやパイプ処理やデシリアライズをせずに、同じアドレス空間で実行されているコード間で生のOBJECTをパイプで渡すこともできる。 PowerShellのオブジェクトは.NETオブジェクトだから、.ToString()メソッドを持ってるってか。へー、PSH、TCLが30年前にやったことを、もっと悪くやったんだね。TCLは全部文字列で、数字もそう。evalで計算しなきゃいけないのは面倒だけど、メリットの方が多いよ。 PowerShellはTCLやbashと逆で、文字列じゃなくてオブジェクトを直接渡すんだよ。何が言いたいのかマジでわからん。TCL/Tkは死ぬほど書いてきたし、オープンソースにもしてるし。 DebianとかUbuntuは、システムのツールのバージョンをOSのバージョンに固定したがるんだよね。 unzipは特殊なケースで、開発がほぼ止まってるんだよね。最後のリリースは2009年[0]。バージョン6.0ね。それから色々問題が見つかったし、機能も足りない。だからみんなめっちゃパッチ当ててる[1]。結果、同じバージョン番号でも全然違う実行ファイルになってる。 大量のgitリポジトリのミラーを管理してるから、色々知ってるんだけど、多くオープンソースプロジェクトは活動を停止したり、新しいリリースを出さなくなったりしてるよね。syslinuxみたいにunzipと似たような状況のプロジェクトもあるし。Quaggaみたいに完全に活動停止して、まともに動くgit remoteすらないプロジェクトもある。 わからん、混乱する気持ちはわかる。俺は7z使ってて、今のところzipのニーズは満たせてる。 MacOSはもっと酷くて、Appleは(一般的に機能が豊富な)GNU版じゃなくて、BSD版の一般的なUnixユーティリティをバンドルしてるんだよね。だから、MacOSとLinuxの両方で動くBashスクリプトを書くのは至難の業だよ… MacOSでzshを使えばいいじゃん。 zshを使ったからって、シェル以外のPOSIXユーティリティがGNU拡張機能を持つわけじゃないよ。 MacOSのuserspaceはFreeBSDからフォークされたから、GNU拡張機能じゃないものがバンドルされてるんだよ。それにFreeBSDのuserspaceはその後GNUismを取り入れてるし。 openrsyncがrsyncの一部の機能をサポートしてないのはちょいと困るけどねー。でも、rsyncの実装が複数あるのはマジで良いことじゃん?ソフトウェアってより、プロトコルとして扱われてるってことだもんね。もっとコメントを表示(1)
例えば、ファイルのオーナー。コピーしたらコピーした人がオーナーになるのが普通じゃない?オリジナルファイルのオーナーじゃなくてさ。
rootがオーナーでsetuidされてるファイルをコピーして、普通のユーザー権限でサーバーに上げても、同じ属性がコピーされるべきじゃないよね。
コピーしたらオーナーは自分になるよね。でも更新日とかは同じままだったりする。特にAppleのAPFSみたいなcopy-on-writeなアーキテクチャだとさ。
「全部じゃない」よりは具体的だと思うけど。勘違いしないでね。
アーカイブからインストールしたり、ファイルを配布するときは、ファイルの中身もメタデータも全部、思った通りにコピーされてほしいんだ。全部役に立つから。
コピーする人に権限がない場合は、警告とかエラーが出てほしいな。
例えば、ユーザーのホームディレクトリーから/var/www/html/にコピーする場合、httpd_sys_content_tコンテキストが必要になるよね。コピー元のuser_home_tコンテキストをコピーすると、Webサーバーがアクセスできなくなる可能性がある。
つまり、SELinuxコンテキストはコピー元からコピーすべきじゃないってことじゃない?
fooがuser barのファイルをコピーして自分のホームディレクトリーに置くとき、fooがオーナーになるのは嫌でしょ?
期待が高すぎるんじゃない?
うん、それでいいんだよ。
>fooがuser barのファイルをコピーして自分のホームディレクトリーに置くとき、hがfooユーザーによって所有されることを望む最後のもの。
場合によるよね。
>あなたの期待は非現実的です(sic)。
そんなことないよ。rsyncならできるし(try -avSHAX)、tarはデフォルトでそうだし。ここではrsyncの話をしてるんだよ。
コピー先のファイルの属性は、コピー元からコピーするんじゃなくて、指定した通りになってほしい。もっとコメントを表示(2)
例えばunzip
。Debianと古いUbuntuのサーバーに入ってるやつ、どっちもAES-256で暗号化されたZIPファイルに対応してないんだわ。Stack Overflowによると、対応してるバージョンもあるらしいんだけど。
結局、
1. アップデート版のunzip
が簡単に見つからない。
2. バージョンが全部「6.00」って書いてあるのに、挙動が違うからマジ意味不明。
3. たまーに見つかるけど、システムのやつを置き換えるのが安全かどうかわからん。
開発者が頑張って便利な機能を追加しても、結局使えないってどうなのよ。コアなユーティリティって、アップデートしづらいんだなーって思った。
WindowsとかmacOSも似たようなもんかもしれんけど、Linuxならもっとマシだと思ってたわ。7z
がマジおすすめ。zipとか圧縮ファイル全般で使えるよ。Linuxでunzip
使ったことないかも。
あと、Unixの「一つのことをうまくやるシンプルなツール」っていう哲学も関係あるかもね。tarballで固めて、gzipで圧縮して、最後に暗号化するみたいな流れが普通だったりする。.tar.gz.pgpみたいな拡張子になるのはそのため。
バージョン表記が両方6.00ってのは謎だけど、ArchとかManjaroみたいなローリングリリースにしたら最新のパッケージが使えるかも。ただし、自分で管理する手間が増えるけどね。
Linuxのバージョン管理でいつも思うのは、v1.00を宣言したがらない人が多すぎ問題。便利なライブラリとかプログラムがいっぱいあるのに、v0.2とかv0.68のまま何年も放置されてるの、初心者にはマジでわかりにくいと思うんだよねー。安定してるし機能もほぼ揃ってるのに、完璧じゃないからってv1にしないんだよね。
CPUが1サイクルで計算できるのに。
今はPOSIXシェルに算術演算が組み込まれてるから、どのシェルでも動くし、新しいプロセスも作らないよ。
>bash -c ‘[ $((1 + 1)) = 2 ]; echo $?’
>0
>zsh -c ‘[ $((1 + 1)) = 2 ]; echo $?’
>0
>busybox ash -c ‘[ $((1 + 1)) = 2 ]; echo $?’
>0
YSH(https://oils.pub/)はCとかJavaScriptみたいな構文だし。
>ysh -c ‘if (1 + 1 === 2) { echo hi }’
>hi
PythonとかJSみたいなデータ構造もあるし。
>echo ‘{”foo”: 42}’ > test.json
>ysh
>ysh-0.28$ json read < test.json
>ysh-0.28$ echo ”next = $[_reply.foo + 1]”
>next = 43
浮動小数点数とかも使えるよ。
>echo ”q = $[_reply.foo / 5]”
>q = 8.4
https://oils.pub/release/latest/doc/ysh-tour.html
(スクリプトにも使えるけど、インタラクティブシェルとしても使えるよ)sh
を書いた1977年からだと48年だ。
『UNIX-HATERS Handbook』の著者の一人として、1980年代から色々なバージョンのUnixを使ってきたけど、そういう問題は20年以上前からあるのは当たり前じゃん。今でも「歴史的な遺産」に苦しめられてるってのが問題なんだよ。昔はプロセスをforkしてテキストをpipeで繋いでたけど、今は共有ライブラリと機械語で計算するべきでしょ。それを「Unix哲学」とか言って正当化してるのがムカつく。
X-Windowsの問題は解決したのか?Linuxデスクトップの年はいつになったんだ?
>X-Windowsの惨状:これは『UNIX-HATERS Handbook』の第7章です。X-Windowsの惨状の章は、Don Hopkinsが書きました。
>https://medium.com/@donhopkins/the-x-windows-disaster-128d39…
1 + 1 = 2をテストするのにプロセスを3つも使って、コンテキストスイッチをしまくって、記号をいっぱい使ってた理由:
>expr 1 + 1
>外部プログラムを使って計算。
>$(…) (コマンド置換)
>サブシェルでexpr
を実行して、出力をキャプチャ。
>[ … ]
>初期のシェルでは、[
(別名test
)も外部バイナリ。
プロセスを3つも使ってた理由:
>Unixには組み込みの算術演算がなかった。
>シェルは計算できなかった。
>条件分岐([
)も外部プログラムだった。
>すべてが壊れやすいテキストとサブプロセスで繋がっていた。
CPUが1サイクルで計算できるのに、ユーザー空間とカーネル空間を行ったり来たりしてた。
それが「Unix哲学」が美化してる歴史的な非効率性。
Unix嫌いなのはいいけど、例をアップデートしてね。
しかもbash
だけだし。X WindowsとWaylandの状態は、全然修正されてないと思うけど。
お前の例も文句も古いし、悪意がある。
文句言ってるやつらに聞きたいけど、この1年でUNIXディストリビューションを使ったことあるやついる?Linux、OpenBSD(シェア0.1%)、macOS(UNIXらしさを気にするのをやめたのバレバレ)以外で。macOS
はマジでUNIX認証されてるぞ。macos
で何かする時は、macos
専用の例外処理が必要なの、みんな知ってるし。
プロセスが2つだって強調するなら、せめて本当に2つにしてくれ。[
はシェルの組み込みコマンドだぞ。evalが重いって言うなら、calcの方が軽くて良いぞ。意味不明な記号の嵐って言うけど、ちゃんと説明できるしドキュメントもある。Shell scriptingは簡単じゃないけど、時代の産物だし標準化されてるからね。Bourne shellは1979年だし、POSIXは後方互換性を重視してるんだ。-eqは数値比較に使って、POSIX shellは文字列比較がデフォルトだからだよ。プロセッサには足し算とか比較の命令があるって言うけど、shell scriptingはインタプリタ言語だし、他のコードに処理を任せるのが普通だから速くなくても良いんだよ。高速に計算したいならCで書くわ。
シェルスクリプトを複雑なソフトの糊付け役って考えるのはアリだと思うな。パイプラインとかファイルシステム操作とか、バッチ処理とか、CLIと同じインターフェースをスクリプトに提供するとか、色々できるし。
>あんたのシェルスクリプトは速くなくても、書きやすくなくても、読みやすくなくても、メンテしやすくなくても、算術できなくても、ヤバい地雷満載でもいいと思ってるのかもしれないけど、それはあんただけな。
多くのsysadminとかDevOpsとか、シェルを使う仕事してる人はそう思ってると思うよ。bashの欠点も認めるけど、bashくらい安定してて、どこでも動いて、色々なことに使えるものはないって感じ。
速くて高性能な代替手段に地雷がないってのも違うと思う。
Cは型システムが貧弱だし、メモリ安全じゃないし、境界チェックもないし、リエントラントじゃない関数もあるし、UBもあるし、色々考慮しないと速さの恩恵を受けられない。
C++はちょっとマシだけど、Cの欠点も引き継いでるし、STLの肥大化問題もある。
RustはC++よりずっといいけど、borrow checkerにハマることもあるし、型システムが難解なこともあるし、cargoで依存関係が競合することもあるし、ビルドが遅いこともある。mutableなグローバル変数は扱いにくいし。
PythonはPOSIXシェルより使いやすいし、型システムもマシだけど、コンパイル言語には速度で勝てない。それに、機能が肥大化してきてる。
どれも一長一短だよ。ツールなんて使い方を間違えれば全部ダメになるし、ほとんどのツールは特定の用途に特化してる。汎用言語でも得意分野があるし。CでMVCのWebサイトを作ることもできるけど、もっと良いツールがあるし。Rubyで最適化コンパイラを書くこともできるけど、人生を見直した方がいい。
bashはシェル言語として別に悪くない。構文は変だけど、どこにでもあるから覚える価値はある。bashスクリプトは、特別なディレクトリ構成とかに依存しなければ、ほとんどの*nixで動くはずだし。POSIXシェルとbashismの違いが一番のハードルかな。もっとコメントを表示(3)
で、10年か20年後くらいに、Grand Unified $thing$自体が組み合わさってることに気付いた。しかも、自分でなくて誰かが。だからコントロールできない。そこで思ったわけ。「Grand Unified $thing$」を分解して、再利用可能な$thing$にすれば最高じゃん?そうすれば、Grand Unified $thing$の癖に依存せずに、生産性を最大限にできる。
で、そう書かれて、そう実行された。たくさんの$thing$を作って、世界は良くなった、最高にね。でも、古代人の一人が気付いた。「$thing$をGrand Unified $thing$に組み合わせれば、生産性が劇的に向上する。色々な$thing$の使い方を覚えなくても済むから」って。
で、そう書かれて、そう実行された。これが古代人の物語、そして最も神聖なサイクルの始まり。
構成可能性に夢中になって、飽きて統一して、で、統一されたものが古臭くて変になって、また好きになるっていう繰り返しについての一般的な話だよ。Perlはその良い例。
Risc OSの方がマシだよ。メモリ保護がないとしても(たぶんないと思うけど、数日しか試してない)。
でも、Windowsは重すぎる。8から最悪。NTカーネル+explorerはすごく軽量化できるのに(ReactOSとかXPとか、軽量化されたW7を見てみ)。
AppleとMS(とRedHat)は、つまらないことに大量のサイクルを浪費して、光るクソを売ってるだけ。
さらに、1GBのRAMでまともなシステムとして動くように軽量化できない。
n270ネットブックで720p@30FPSの動画をMPVで見れるよ。WXPのネイティブプレイヤーでも、ローレベルのdirect draw callsをうまく使っても無理なのに。
RedHatとAppleにおけるWindows>XP哲学はこうだ。「OSに不要なサービスとXMLのゴミ(とJSとC#みたいなインタプリタ言語)を詰め込んで、ハードウェアベンダーが崇拝するように仕向け、平均的なユーザーが同じことをするために新しいものを買い続けるようにする」。
セキュリティ?なんでGnome 3は最初にJSが必要なんだ?Valaはどこに行った?Valaがあればもっと良くなって、Mutterのメモリリークも過去のものになるのに?
PowerShellには、他のアプリケーションに埋め込むためのhosting apiもある。bashで同じことを試してみて。少なくともpythonならできる!
しょぼいWindows PowerShellでさえ、パワー、使いやすさ、学習しやすさ、保守性、効率、柔軟性においてUnixシェルを圧倒的に打ち負かしているのに、まだUnixシェルを擁護して、Unix哲学の言い訳をしてるの?いい加減にしろ。
負けるには低すぎるハードルなのに、Unix哲学とかいう意味不明なカルトを擁護してる。
Lisp出身なら、ここは居心地がいいかも。l*関数をLispのリストみたいに使えるけど、carとかcdrとかで悩まなくて済むし。
あと、Expectってのも過小評価されてるよね。
upvarは嫌いだけど、namespaceでほとんど避けられるし。
TCLはマジなことにも使えるんだよ。Excelで何百万行ものコロナ患者とか国勢調査のデータ使ってるなら、TCL/TkとSQLiteの方がずっと速いと思うよ。
>https://github.com/SimHacker/micropolis/blob/master/micropolis/…
Debianはリリースサイクルが長いけど、すごく安定してる。stableだと全部うまく動く(testingも他のOSに比べて安定してる)。
Ubuntuは、Debianを「もっと頻繁にリリースしたらどうなる?」って感じ。
最新のツールが欲しいなら、安定性を犠牲にするしかないかも(NixとかArchとか)。どっちもユーザーフレンドリーじゃないけどね。
安定してて最新のツールが欲しいなら、Gentooがいいけど、Archよりずっと敷居が高い。
安定性とシンプルさが欲しいなら、ディスクスペースを犠牲にするしかない。Docker/podman, flatpak, appcontainers, snapとかがあるね。
WindowsとMacも同じ問題を抱えてる。Windowsは古いバージョンのライブラリを同梱して、アプリごとに動的にリンクすることで解決してる。
[0]:https://infozip.sourceforge.net/UnZip.html
[1]:Archのビルドレシピを見ると、どれだけパッチが当てられてるかわかるよ:https://gitlab.archlinux.org/archlinux/packaging/packages/un…
だからunzipは特別じゃなくて、関心が薄れてきてるっていう一般的な問題なんだよ。
(Linuxは何でもできる方法がいくらでもあるし)。
でも、unzipは問題なくアップデートできるはずだよ。重要なサービスが依存してないなら、アップデートして試してみれば。
それに、zshはほとんどのディストリビューションにデフォルトでインストールされてないし。
なんでBash 2をデフォルトシェルにしたのかは謎だけど。俺はいつもZshに切り替えて使ってたし、Zshの方がバージョンが新しかったからね。今はLinuxとFreeBSDでもZshを使ってる。シェルを統一したいから。