Unix 系オペレーティング システムを初めて使用する多くの人と同様に、私もパイプラインの概念について知りました。コマンド ラインの 1 文字ですべてが変わる方法を次に示します。
パイプ (|) 文字とは何ですか?
他のプログラムからプログラムを構築する
パイプライン文字 (|) は、ある Linux コマンドの出力を別の Linux コマンドの入力に送信します。元々は 1970 年代初頭にベル研究所で開発されました。私はこれを、当時「Mac OS X」と呼ばれていた Unix に関する本の中で紹介しました。この単純な性格がすべてを変えました。
パイプラインの良い例は、プログラムの出力で何らかの文字列を検索することです。システム上のどのプロセスが root に属しているかを調べたいとします。 「ps aux」コマンドを使用してシステム上で実行されているすべてのプロセスを表示し、その出力を grep に送信して「root」を検索します。
ps aux | grep root
このコンセプトはダグ・マキロイによって考案されました。当時、Unix は実際にユーザーフレンドリーであると考えられていました。その理由は、コンピューター カードのデッキを打ち抜いてコンピューター センターのオペレーターに渡し、結果 (および避けられないエラー) を受け取るのを待つのではなく、ターミナルにコマンドを入力するためでした。
後者は「バッチ モード」と呼ばれ、メインフレーム コンピューターが当初から使用されてきた方法です。
パイプラインは、Unix および最新の Linux システムの「標準入出力」という概念を利用します。標準入力はキーボード、標準出力は端末です。エラー メッセージには「標準エラー」もあります。ここもターミナルです。標準入力を「リダイレクト」できます。この概念は、C++ の本を読んでいるときに目にしたことがありましたが、Linux コマンド ラインを使い始めたときに、より理解できました。
> (大なり) 記号を使用すると、後で使用できるように出力をファイルに保存できます。
ps aux > allprocs
または、ファイルの内容を別のプログラムにフィードすることもできます。
cat < some_text.py
70年代の雰囲気コーディング?
このアプローチはシンプルかもしれませんが、一種のマニフェストでした。モノリシックなプログラムを構築するのではなく、より小さなコンポーネントからプログラムを構築することが理想になりました。このアプローチは「ソフトウェア ツール」と呼ばれていました。これは、同じハンマー、釘、鋸、ドリルを使用してさまざまな木工プロジェクトを作成する方法と似ています。
フィルターとして使用できるプログラムを設計することの影響の 1 つは、従来の Unix ユーティリティが大量の出力を生成しないことです。コマンドライン スイッチを使用して追加の入力を追加しない限り、これらは必要最小限のみを提供する傾向があります。
マスターの動作を見ることができます。当時ベル研究所の研究者であったブライアン・カーニハン氏と「K&R」の「K」、または C プログラミング言語デニス・リッチーとの共著で、プログラミング プラットフォームとしての Unix を宣伝する 1982 年のベル研究所の映画でスペル チェッカーを作成しました。全体を通して見る価値はありますが、注目の部分は 5 分あたりから始まります。
ユーティリティの名前は標準的な現代のものとは異なっているように見えますが、このアプローチがいかに強力であったかがわかります。コマンドラインから直接小さなプログラムを作成します。魔法のように見えたに違いありません。 Unix シェル プログラミングは、70 年代後半から 80 年代前半の雰囲気コーディングに似ていたかもしれません。どちらの動きも、プロのプログラマーが複雑さを管理するための方法として宣伝されています。
バイブコーディングやエージェントの使用により、AIがコーディングを処理できるようになります。ソフトウェア ツール手法は、大きなプログラムを小さな塊に分割することでソフトウェアの変更を容易にする試みでした。これは、すべての人にすべてを提供しようとする大規模なプログラムではなく、1 つのことをうまく実行するプログラムを構築するという「Unix 哲学」の重要な要素でした。
パイプライン化の実践例
ケースの交換も簡単
多くのシェル パイプラインはプレーン テキストを処理します。これには、前に説明した grep コマンドなどのテキストの検索だけでなく、テキスト ストリームの変更も含まれます。
良い例としては、テキストの変更が挙げられます。この作品を調査したところ、大文字を小文字に、またはその逆に変更するための組み込みコマンドが存在しないことがわかりました。幸いなことに、独自のパイプラインを作成するのは簡単でした。
たとえば、入力を小文字に変更したい場合は、tr コマンドを使用します。
tr '(:upper:)' '(:lower:)'
これにより、GNU coreutils バージョンの tr を使用して、すべての大文字が小文字に変更されます。デフォルトでは、tr は標準入力を使用するため、シェルでこれを入力するだけです。その後、テキストを入力すると、tr がそれを小文字に変換します。
これは便利ですが、毎回すべてを入力するのは面倒です。これを後で使用するために保存するオプションがあります。最も簡単なオプションは、シェル エイリアスを .zshrc ファイルに保存することです。zsh は私が選んだシェルなので、いつでも利用できるようになります。この機能は非常に小さいようで、ライターとして大文字と小文字を変更できるのは便利なので、これを実行することにしました。
alias lc="tr '(:upper:)' '(:lower:)'" # Set standard input to lowercase
シェル関数を定義することもできます。
lc ()
{
tr '(:upper:)' '(:lower:)'
}
テキストへの変更を元に戻して大文字にすることもできます。
alias uc="tr '(:lower:)' '(:upper:)'" # Uppercase standard input
他のプログラムからの出力を、作成したばかりの新しいコマンドにパイプすることもできます。フォーチュン プログラムのテキストを大文字に変換し、lolcat を使用してカラフルにすることができます。
fortune | uc | lolcat
この場合、それはたまたま次の一節でした。 タオ・テ・チン。
パイプライン処理の力
これらの例は、なぜ Linux がプログラミング コミュニティや私のような愛好家開発者の間でこれほどまでに影響力を持っているかを示すはずです。シンプルなパイプラインを使用すると生産性をすぐに高めることができるからです。
- オペレーティング·システム
-
Ubuntu Linux 22.04 LTS
- CPU
-
第13世代インテル Core i7-1360P
- GPU
-
インテル Iris Xe グラフィックス
- ラム
-
16GB DDR5
- ストレージ
-
512GB SSD
- 重さ
-
2.71ポンド