Linux
 Computer >> コンピューター >  >> システム >> Linux

Linuxでターミナルの出力をファイルに保存する5つの方法

Linuxでターミナルの出力をファイルに保存する5つの方法

ターミナルはLinuxシステムの中核を担う存在です。Webブラウザのような大規模なプログラムから、テキストエディタのようなシンプルなツールまで、Linux上で動作するすべてのプログラムは、その裏でターミナルのコマンドラインによって実行されています。そのため、OSの仕組みを深く理解したいなら、ターミナルを正しく使いこなせるようになることが重要な第一歩となります。

そんなLinuxのターミナル作業中に、「コマンドの出力結果をファイルとして保存したい」と思う場面は少なくありません。保存したファイルは、別の処理の入力データとして使ったり、ターミナルの操作ログとして記録したりできます。本記事では、ターミナルの出力をファイルに保存する5つの方法をわかりやすく解説します。

1. 出力保存機能を持つターミナルを使う

もっとも手軽なのは、出力をファイルに保存できる機能を標準搭載したターミナルを使う方法です。たとえば、KDEデスクトップ環境に標準で付属する「Konsole」には、ターミナルの出力をそのままファイルに書き出す機能があります。

使い方は簡単です。メニューバーの「ファイル」をクリックし、「出力を名前を付けて保存」を選択します。

Linuxでターミナルの出力をファイルに保存する5つの方法

すると保存用のダイアログが開くので、好きな場所にファイルを保存できます。

GNOME Terminalでも同様のことが可能です。ターミナル画面上で右クリックし、「Copy Output as HTML(出力をHTMLとしてコピー)」を選択しましょう。これでターミナルのテキストがクリップボードにコピーされるので、任意のテキストエディタに貼り付けるだけでOKです。

Linuxでターミナルの出力をファイルに保存する5つの方法

2. 出力リダイレクトを使う

次に紹介するのは、UNIXシェルに組み込まれたリダイレクト演算子を活用する方法です。これはLinuxの標準機能で、プログラムのテキスト出力をファイルへ振り分けることができます。主な演算子は以下の3種類です。

  • > : ファイルを新規作成、または既存ファイルの内容を出力結果で上書きします。プログラムの現在の結果を同じファイルに書き出して確認したい場合に便利です。
  • >> : 同じくファイルを作成しますが、既存の内容は残したまま末尾に追記します。プログラムの結果を1つのファイルに継続的に記録したい場合に役立ちます。
  • 2> : プログラムが出力するエラーメッセージをファイルに書き出す特殊な演算子です。デバッグ時に、プログラムがクラッシュする前に遭遇した問題を確認するのに非常に有用です。
Linuxでターミナルの出力をファイルに保存する5つの方法

これらの演算子は、コマンドの末尾に追加する形で使用します。以下の例を見てみましょう。

echo "maketecheasier" > hello.txt

この例では、echoコマンドに「maketecheasier」という文字列を出力させ、その後に>演算子とファイル名を指定しています。これにより、UNIXシェルは画面に表示する代わりに、出力を「hello.txt」というファイルに書き込みます。

Linuxでターミナルの出力をファイルに保存する5つの方法

3. teeコマンドを使う

リダイレクト以外にも、teeというGNUユーティリティを使ってコマンドの出力を保存できます。teeは標準入力を読み込んで、画面への表示とファイルへの書き込みを同時に行える便利なプログラムです。UNIXパイプと組み合わせて使います。

以下の例をご覧ください。

echo "maketecheasier" | tee hello.txt
Linuxでターミナルの出力をファイルに保存する5つの方法

ここではリダイレクトの代わりに、パイプ(|)で出力をteeに渡しています。

補足: パイプとは、あるプログラムの出力を別のプログラムの入力として渡す仕組みのことです。標準入出力を使用している限り、複数のプログラムをつなぎ合わせて処理を連結できます。

4. scriptコマンドでセッション全体を記録する

ターミナルから出力を取り出すもう一つの方法が、Linuxに標準搭載されているscriptコマンドです。このコマンドは、ターミナルに入力した内容とその出力をすべて記録します。

scriptを使えば、ターミナルセッションのログを解析可能なテキスト形式で保存できます。エラーログをオンラインで共有し、他の人からサポートを受ける際などに非常に便利です。

使い方は以下のコマンドを実行するだけです。

script filename.txt
Linuxでターミナルの出力をファイルに保存する5つの方法

これでスクリプト環境が起動し、あとは通常どおりコマンドを実行するだけです。ただし注意点として、scriptはそのセッション内でのすべての操作を記録します。実際の記録例は以下のとおりです。

Script started on 2022-03-27 18:02:29+08:00 [TERM="rxvt-unicode-256color" TTY="/dev/pts/2" COLUMNS="77" LINES="22"]
[?2004h[[1;31m balaraw:[1;35m~ [0m]$ ls
[?2004l
[0m[01;34mDesktop[0m    [01;34mDownloads[0m  [01;34mmail[0m  [01;34mNews[0m  [01;34mpods[0m  [01;34mdocuments[0m  [00;32mhello.txt[0m  [01;34mMail[0m  [01;34mpics[0m  [01;34mtmp[0m   [01;34mvids[0m
[?2004h[[1;31m balaraw:[1;35m~ [0m]$ exit
[?2004l
exit
 
Script done on 2022-03-27 18:03:19+08:00 [COMMAND_EXIT_CODE="0"]

scriptは押されたキー操作や制御文字まですべて記録します。筆者の場合、TabキーやBackspaceキーといった「目に見えない」キー入力までログに含まれていました。

記録を終了するには、exitと入力します。これでscriptプログラムが終了し、セッション全体のログが指定したファイルに書き込まれます。

Linuxでターミナルの出力をファイルに保存する5つの方法

5. フレームバッファからキャプチャする

最後に紹介するのは、Linuxのフレームバッファから直接ターミナル出力を取得する方法です。テレタイプ(TTY)コンソール上で直接作業しており、プログラムの出力をキャプチャしたい場合に有効です。

フレームバッファデバイスをキャプチャするには、テレタイプ上で以下のコマンドを実行します。

cat /dev/fb0 > capture.raw
Linuxでターミナルの出力をファイルに保存する5つの方法

ただしこの方法には注意が必要です。フレームバッファをこの方法でキャプチャすると、生のバイト列(raw bytes)がそのままファイルに書き出されます。このファイルを閲覧するには、画像編集ソフトで読み込み、色深度やビット深度を手動で調整する必要があります。時間がかかるうえ、間違った設定になりやすいのが難点です。

そこで活躍するのが、fbgrabのようなサードパーティ製ツールです。fbgrabはフレームバッファデバイスから現在のテレタイプ画面を取得し、PPMまたはPNG形式の画像として保存してくれます。

インストールも比較的簡単です。Debian系・Ubuntu系のディストリビューションではaptを使いましょう。

sudo apt install fbgrab

Arch Linuxの場合はpacmanでインストールします。

sudo pacman -S fbgrab
Linuxでターミナルの出力をファイルに保存する5つの方法

fbgrab / fbcatでターミナル出力をキャプチャする

インストールが完了したら、Ctrl+Shift+Alt+F3を押してテレタイプに切り替え、fbcatまたはfbgrabを実行します。

fbcatはシンプルなプログラムで、現在のフレームバッファ画面をPPM画像として保存します。PPMは低レベルのraw画像フォーマットなので、画像編集ソフトで読み込んでPNGなどに変換する必要があります。低ビット深度のディスプレイを正しくキャプチャしたい場合に特に有用です。

fbcatでキャプチャするには、以下のコマンドを実行します。

fbcat > capture.ppm
Linuxでターミナルの出力をファイルに保存する5つの方法

これで現在表示中の画面が取得され、「capture.ppm」というファイルに出力されます。

一方のfbgrabはより高機能なプログラムで、高ビット深度のディスプレイのキャプチャに対応しています。基本的にはテレタイプ画面の撮影に使うことになるでしょう。デフォルトでPNG形式での保存に対応しており、キャプチャ対象のテレタイプ番号を指定することもできます。

fbgrabでキャプチャするには、以下のコマンドを実行します。

sudo fbgrab -c 3 capture.png
Linuxでターミナルの出力をファイルに保存する5つの方法

このコマンドは3番目のテレタイプ画面を取得し、「capture.png」というファイルに保存します。

Linuxターミナルに関するその他のガイドにもぜひ目を通してみてください。たとえば、コマンドラインからメールを送信する方法を解説した記事も参考になります。

よくある質問(FAQ)

Q1. fbgrabが動かない! 画像が真っ黒・空白になる

これはfbgrabが、システムが実際に使用しているものとは異なるフレームバッファデバイスを参照している可能性があります。「/dev」フォルダの一覧を表示して、現在使用中のフレームバッファデバイスを確認しましょう。

ls /dev

一覧の中から「/dev/fbX」というデバイスを探してください。通常、Linuxは「/dev/fb0」をフレームバッファとして使用します。しかしシステムが「/dev/fb1」など別のフレームバッファを使っている場合は、以下のように-dオプションでデバイス番号を指定すれば、そちらから取得するように設定できます。

fbgrab -d 1 capture.png

Q2. プログラムへの入力として書いたファイルの内容を取得することはできる?

はい、可能です。前述の3つの演算子に加えて、<演算子を使えばファイルからデータを読み込み、それをプログラムの入力として扱えます。

この方法なら、テキストを表示するために他のプログラム(catなど)に頼る必要もありません。以下の例を比較してみましょう。

[1] cat test.txt | program
[2] program < test.txt
  • 1つ目の例では、まずcatがtest.txtを読み込み、その出力をパイプ(|)経由でprogramに渡しています。
  • 2つ目の例では、programを直接呼び出し、<演算子によって直後の引数(test.txt)を入力として受け取っています。

Q3. scriptコマンドで特定のコマンドの出力だけを記録することはできる?

はい、単一のコマンドだけを記録対象にすることも可能です。トラブルシューティング時に、特定のプログラムの出力だけをキャプチャしたい場合にとても便利です。以下のコマンドで実現できます。

script -c "your-command" test.txt

-cフラグを付けると、scriptは指定されたコマンド(your-command)のみを実行し、その出力を「test.txt」というテキストファイルに書き込みます。

  1. LinuxターミナルでFFmpegを使って動画ファイルサイズを圧縮する方法

    パソコンのストレージやクラウドサービスに動画を保存していると、容量不足に悩まされることがあります。ファイルサイズを小さくできれば、大きなファイルも増え続ける動画コレクションも簡単に管理できます。ただし、その方法によって圧縮効果は大きく異なります。 動画ファイルのサイズを最適化できるツールは数多く存在します。しかし、VLC、Cinelerra、Blenderといった有名ツールの多くは、UIの裏側で「FFmpeg」というコマンドラインユーティリティという共通のエンジンを利用しています。この記事では、LinuxターミナルからFFmpegを使って動画ファイルサイズを縮小する方法をご紹介します。 FF

  2. Linuxターミナルを電卓として使う方法【bc・calc・qalc徹底解説】

    派手なGUIアプリよりも、Linuxターミナルのシンプルさが好きという方は多いのではないでしょうか。ちょっとした計算をしたいときに、わざわざ電卓アプリを立ち上げる必要はありません。すでにシステムにインストールされている(はずの)ツールを使えば、ターミナル上でそのまま計算ができます。 この記事では、ディストリビューションを問わず使える、Linuxターミナルを電卓として活用する方法を詳しく解説します。 GNU bcで計算する bcは「basic calculator(基本電卓)」の略です。bcプログラム自体は1970年代のUnixに起源を持つ由緒あるツールで、GNU bcはその現代的で機能強化さ