Scribble at 2020-05-01 16:15:25 Last modified: 2020-05-01 22:54:00

csh / tcsh のサイトで取り上げたいテーマとして、やはり僕なりに原理原則まで突き進んだり、歴史的な経緯をたどれるだけたどったりして、調べたり考察したい(即座に「絞殺死体」って変換するなよ・・・)と思っている幾つかの問いがある。その一つが、csh のシェル・スクリプトが「貧弱」だと指摘する人たちによる、「csh はワンライナーを書けない」というものだ。これは、考えてみれば変な話である。なぜなら、たとえば1行の中で反復処理を書けるといったことは、僕らにとっても《強力》な機能ではあるけれど、半面でサーバへの攻撃者にとっても強力なプラットフォームを提供していることになるからだ。

僕らは、サーバ技術者として php をセット・アップするときに、実装するプログラムが特定のビルトイン関数を使わないとわかっているときには、phpinfo() や exec() といった関数を無効にするディレクティブを php.ini に記述する。情報セキュリティの(ISMS などに関わる書類作業という意味ではなく実装現場での)実践的な知識があれば、使わなくてもよいシェル・スクリプトを任意に実行するような穴を最初から作らないでおくというのは、はっきり言ってプロとしての常識だし責務ですらあろう。つまり、ワンライナーで色々な処理を実行できるということは、ひとたびサーバの外から1回のリクエストを受けて処理しただけでサーバに致命的なダメージを与えられるような穴を開けるということでもある。これを不問の前提にしておいて、ワンライナーが書けるかどうかという基準でシェルを評価するというのは、もちろんそういう基準が《あっても別に構わない》わけだが、僕にしてみれば一定の正当化なしには採用できない基準である。もし、そのような正当化を認めるためには、許容できる限度を超えてサーバのセキュリティ・レベルを引き下げる必要があるとすれば、そのような基準を自明として受け入れることはできない。

そして更に、プログラミング言語の初等的な本で冒頭部分を読むと何度か感じていたことなのだが(それは、そういう入門書の大半が、対話的に実行するコマンド環境での使い方からプログラミング言語の説明を始めることが多いからなのだが)、ワンライナーで書けるということは、それほど凄いことなんだろうかという疑問がずっとある。それほど生産的な実行環境であるなら、JavaScript や CSS でも見かける実装と同じように、PHP や Perl のスクリプトも serialized という手法を採用して、短いプログラムであれば1行に圧縮してサーバへ実装してしまえば良いではないか(もちろん、php でも中間コードをキャッシュするというアクセラレータが何年も前からあるのは知っているので、そういう手法が大して効果的とも言えないのは分かっているわけだが)。昨今、CI サービスも普及しているのだから、ローカルで動く IDE の画面でコメントやコードの構造が分かりやすくなっていさえすればいいわけであって、サーバへ実装するときは猫のウンコみたいにギュウギュウ詰めにしてファイル転送しても構わないだろう。ともあれ、ワンライナーなんて、そのコマンドの使い方を解説する文章や本で見かけるくらいの用途しかないと思えるのに、どうしてそんなことができるくらいで《現代的な》シェルとしての重大な要件であるかのように言われなくてはいけないのか。

ワンライナーをネタにブログ記事を書く人はたくさんいるのだが、たとえば python や go でワンライナーを書くなんてことを、本当にルーチン・ワークの一部として実際にやっている人がいるんだろうか。サーバ技術者がシェル・スクリプトをワンライナーでたくさん書いているのは分かる。しかし、単純な四則計算を「電卓代わり」と称して、わざわざターミナルを立ち上げて perl や php の処理系で実行するなんてアホが職業的なプログラマにいるとは思えないのだ。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook