※当サイトの記事には、広告・プロモーションが含まれます。

Linuxのシェルの処理の結果をターミナル(端末)とファイルの両方に出力するには

gigazine.net

2023年11月7日にパナマシティ西部のチャメ地区の高速道路で発生したこの事件は、弁護士兼大学教授のケネス・ダーリントン容疑者によって起こされたものです。

道路を封鎖していた環境保護運動の参加者が渋滞に怒ったドライバーに射殺されてしまう事件が発生 - GIGAZINE

生物多様性に富んだジャングルが存在するチャメ地区では、カナダに本拠を置く鉱山会社「First Quantum Minerals」が、この地域最大の銅鉱山を20年以上採掘することを認める大規模な契約を地元当局と結ぼうとしていました。一部の環境保護活動家は、この契約に対して抗議活動を展開し、ダーリントン容疑者による銃撃事件発生までの3週間に渡り、高速道路の封鎖を行ってきました。

道路を封鎖していた環境保護運動の参加者が渋滞に怒ったドライバーに射殺されてしまう事件が発生 - GIGAZINE

海外メディアのNew York Postによると、この道路封鎖によって、食料や燃料、医薬品の輸送に影響が出ているだけでなく、企業は毎日最大8000万ドル(約120億円)もの損失が発生し、付近の学校は1週間以上閉鎖されているとのことです。

道路を封鎖していた環境保護運動の参加者が渋滞に怒ったドライバーに射殺されてしまう事件が発生 - GIGAZINE

⇧ う~む、上記のような書きっぷりだと、「大企業の巨悪」対「環境保護活動家」というような構図を連想してしまうのだが...

銅鉱山の採掘が行われた場合、どの程度、ジャングルの生態系に影響を与えるのかが分からんので何とも言えんけど...

ただ、法に携わっていた人間が、法的な手続きをうっちゃってるところがなぁ...

法の存在意義って何なんでしょうね、それともパナマだと、正当防衛に該当しないケースでも殺人は許容されるんですかね?

何やら、

note.com

被害者の方は、デモに参加していた教育関係者、及び、教育関係者のご家族なのですが、日本語の報道では「環境活動家」となっていたのです。

⚠️パナマのデモに関する報道が、現地の報道と全く違う文脈になっていてギョッとしたので、居住者として見聞きしていることを書き留めました🇵🇦|フェルメンタール🌈✨発酵したパン生地のようなブログ

ちゃんと確かめたくて、この件に関する記事は、テレビ(TVN)、大手新聞社(La prensa、Estrella de Panam、Panama America、Meteo Libre他)、SNSで読めるもの(Mi diario、Trafico Panama、Praxis他)など、できうる限り目を通してみましたが、やはり、被害者について、「環境活動家」「環境抗議者」を示す文言はどこにも見当たりません。

⚠️パナマのデモに関する報道が、現地の報道と全く違う文脈になっていてギョッとしたので、居住者として見聞きしていることを書き留めました🇵🇦|フェルメンタール🌈✨発酵したパン生地のようなブログ

⇧ これまでの情報を見る限り、被害者も加害者も共にホワイトカラーらしいので、論理的な思考を求められる労働に従事していたと思うのだけど、話し合いで解決できないところが現実と理想のギャップを見せつけられますな。

事件の関係者が、弁護士兼大学教授と教育関係者ってところがなぁ...人を教育する人間がなぁ...

日本で過去に「五・一五事件」で、

しかし、孫の犬養道子はこれらの証言を否定しており、著書『花々と星々と』にて、現場に居た母親の証言を引用する形で、祖父の発言を次のように述懐している。

五・一五事件 - Wikipedia

『まあ、せくな』ゆっくりと、祖父は議会の野次を押さえる時と同じしぐさで手を振った。『撃つのはいつでも撃てる。あっちへ行って話を聞こう。ついて来い』 そして、日本間に誘導して、床の間を背に中央の卓を前に座り、煙草盆をひきよせると一本を手に取り、ぐるりと拳銃を擬して立つ若者にもすすめてから、『まあ靴でもぬげや、話を聞こう』

五・一五事件 - Wikipedia

⇧ という有名な逸話がありましたが、武装した人間との話し合いによる解決の成功率ってどのぐらいなのか気になりますな。

Linuxのリダイレクトとは

Wikipediaさんによりますと、

コンピューティングにおいて、リダイレクト英語Redirect)とはリダイレクションを行うこと。リダイレクションとは、様々なシェルを含むほとんどのコマンドラインインタプリタに共通の機能であり、標準ストリームをユーザで指定した位置に変更する機能のこと。

リダイレクト (CLI) - Wikipedia

プログラムはdup2(2)システムコールまたはより柔軟でレベルの高い類似物であるfreopen(3)およびpopen(3)によってリダイレクトする。

リダイレクト (CLI) - Wikipedia

⇧ という説明があり、

標準のファイルハンドルへの/からのリダイレクト

オリジナルのBourne Shellからの系統であるシェルにおいて、文字の直前にある数(ファイル記述子)を置くことによって最初の二回の行動はさらに修正される。これは、どのストリームがリダイレクションのために使用されるかに影響する。Unixの標準I/Oストリームは以下のとおりである:

リダイレクト (CLI) - Wikipedia

⇧ インプットが1種類、アウトプットが2種類となっている。

数(ファイル記述子」は「ファイル記述子(FD:File Descriptor)」ということで、

ファイル記述子(ファイルきじゅつし、英語file descriptor)とは、コンピュータプログラミングにおいてファイルへの参照を抽象化したキーである。ファイルディスクリプタあるいはFDとも呼ばれる。UNIX系システムでテキストターミナルを含むファイルストリームを参照する際に用いられる。

ファイル記述子 - Wikipedia

MS-DOSMicrosoft Windowsでは、「ファイルハンドル」がほぼ相当するが、技術的には異なるオブジェクトである。

ファイル記述子 - Wikipedia

⇧ とあるので、0、1、2、という番号が、「ファイル記述子(FD:File Descriptor)」ってことになるんかね?

シェルのリダイレクトについて、

christina04.hatenablog.com

⇧ 上記サイト様がまとめて下さってます。

Linuxのシェルの処理の結果をターミナル(端末)とファイルの両方に出力するには

そもそもとして、シェルとは?

シェル (英語shell) とは、コンピュータプログラムの一種で、ユーザーへのインタフェースを提供するものを指す。オペレーティングシステム(OS)を持つ高機能なコンピュータにおいて、その機能への容易なアクセスを提供する。

シェル - Wikipedia

他にも、この用語はゆるやかに応用されることもあり、特定のコンポーネントの周辺に構築された任意のソフトウェアを含むこともある。例えば、ウェブブラウザ電子メールクライアントHTMLレンダリングエンジンの「シェル」といわれることがある。コンピュータシステムとユーザーの間にある「殻」であることから、このように呼ばれる。

シェル - Wikipedia

⇧ う~む、分かり辛い...

概要

コマンドラインシェルとグラフィカルシェルの2種類の形態へ大別される:

シェル - Wikipedia

⇧ とありますと。

で、Linuxにおけるシェルの立ち位置はと言うと、

www.javatpoint.com

⇧ 上図のようなイメージの構成になってるらしく、「殻」ってのは、このイメージから来てるんであろうと。

で、ややこしいのが、

eng-entrance.com

qiita.com

www.kanzennirikaisita.com

⇧ 上記サイト様にありますように、シェルで実行された処理は、「ターミナル(端末)」に「標準出力(stdout)」として表示されるってことらしい。

「ターミナル(端末)」としては、Windowsとかだと、「Tera Term」とかがメジャーなんかな。

脱線しましたが、「標準出力(stdout)」は特に何も指定しなければ、シェルを実行している「ターミナル(端末)」上に出力されますと。

ネット上の情報によりますと、

4thsight.xyz

⇧ 通常のリダイレクトの使用方法については、上記のようなパターンがある模様。

で、処理の結果を、シェルとファイルの両方に出力するには、

qiita.com

www.server-memo.net

qiita.com

⇧ teeコマンドを使っておくのが無難ということでしょうかね。

エラーも含めたい場合は、

linux.just4fun.biz

zenn.dev

⇧ 上記サイト様によりますと、明示的に「ファイル記述子(FD:File Descriptor)」を指定しておく必要があるっていうことですね。

あとは、

qiita.com

tee を使う主目的は、標準出力経由でコンソール等にデータを出力させつつ、同一内容を別途ファイルに保存することですが、プロセス置換を使うことで「リアルタイムに」データを加工する用途に転換させられるのです。

Linuxでのプロセス置換 #Linux - Qiita

⇧「プロセス置換」なるものと組み合わせる利用方法もあるようです。

ネット上の情報を漁った限りでは、

  • ターミナル(端末)
  • ファイル

の両方に出力する場合に、teeコマンド以外で実現する方法が見つけられず...

ちなみに、

devops-blog.virtualtech.jp

標準入力の内容をファイルに書き出す tee コマンドに対し、パイプに書き出すのが pee コマンドです*1

*1:これは「pipeのtee」の略であり、決しておしっこではないと思います。たぶん。

今更だけどpeeコマンドが便利だった話 - とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

ちなみに pee は、Ubuntuでは moreutils パッケージに含まれています。このパッケージには色々と便利なコマンドが含まれているので、興味があったら見てみてください。筆者のお勧めは vidir vipe sponge です。

今更だけどpeeコマンドが便利だった話 - とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

⇧ 上記サイト様によりますと、peeコマンドなるものがあるようです。

というわけで、シェルとファイルの両方に出力するには、teeコマンドを使えば良いということでしょうかね。

teeコマンドのマニュアルページの説明によると、

man7.org

DESCRIPTION

Copy standard input to each FILE, and also to standard output.

https://man7.org/linux/man-pages/man1/tee.1.html

⇧ とあって、「標準入力(stdin)」を、

  • ファイル
  • 「標準出力(stdout)」

にコピーするという説明なので、「標準出力(stdout)」はどこに表示するのかって説明が不足してるってことなんかね?

「標準出力(stdout)」の出力先は、利用している「ターミナル(端末)」によって変わってくるということだと思うけど、「標準出力(stdout)」を表示用の媒体として何某かの「ターミナル(端末)」が必要ってことになるかと。

毎度モヤモヤ感が半端ない...

今回はこのへんで。