Ubuntu日和

【第10回】UbuntuのCLIはそこまで怖くない!(と思う。たぶん)

CLIを使えば5秒ごとにかわいい猫画像がこんな簡単に

 前回までは「デスクトップとしてのUbuntu」の使い方の紹介に終始していた。しかしながらUbuntuを含むLinuxシステムは、CLI(Command Line Interface)を使えるようになると、さらにその利便性が増す。「Ubuntuは初心者にも優しい」という話をしたあとにCLIの話を持ち出すと、なぜか猛烈に拒絶反応を示す人が飛び出してくるが、それはそれとしてUbuntuはCLI 「も」 便利なのだ。実際Windowsも、ここ最近はPowerShellやWindows TerminalにWSLと、CLIな環境も推している。そこで今回は初心者にとってあまりお近づきになりたくないCLIの基本を紹介しよう。

CLIってあれでしょ、PCが壊れたときに表示される黒い画面に白い文字のやつ

 まず最初に「CLIとはなんなのか」そして「CLIを使えるようになるとなぜ便利なのか」、という点から解説しよう。

 Windowsやスマートフォンを含む「一般向けのコンピュータ」は、グラフィカルな画面を使って直感的に操作する。これは視覚的な効果を活用することで、導入・学習コストをできるだけ下げるための措置だ。もちろんドラッグアンドドロップとかスワイプなどの基礎的な操作を覚える必要はあるものの、それさえ把握すれば、ファイルのコピーなんかはとても直感的に行なえるようになる。本連載の読者であれば信じがたい話かもしれないのだが、「新しいガジェットを使い始める前に分厚いマニュアルを読む」行為に快感を覚える人は、実は少数派なのである。

 この視覚的な効果を積極的に活用したコンピュータの操作系を GUI(Graphical User Interface) と呼ぶ。特にPCの場合は、ウィンドウ/アイコン/ボタン/メニュー/カーソルなどの部品をマウス等のポインティングデバイスで操作できる仕組みをまとめてGUIと呼んでいる。本連載の第8回「デスクトップ環境ってなんだろう?」で紹介した「デスクトップ環境」はまさに、PC上のリソースを現実の道具と同じような使い方になるよう操作方法を実装・表現し、「より使いやすいGUI環境」を実現するための仕組みだ。

 デスクトップの操作が直感的に行なえるのは、「その裏でソフトウェアがうまくやってくれている」からにほかならない。そして物語と同じように、現実の世界でもソフトウェアはだいたい反乱を起こす。UI上の見た目の操作と、実際のコンピュータ内部の操作が乖離しすぎると、複雑な処理が必要になり、そのどこかで「なんかうまく動かなくなる」ことが往々にしてあるのだ。これを 「何もしていないのに壊れた」 と言う。

古典的なコンピュータの画面(っぽいもの)

 そこで登場するのが CLI(Command Line Interface) である。GUIと異なり、CLIはGUIを実現するための抽象化層が薄くなっている。まったくないわけではないが、より人間よりもコンピュータの都合に近い操作体系となる。結果的に「何かあった時」に、より細かく面倒を見ることが可能になるというわけだ。GUIだと「わけが分からないから諦める」となってしまうトラブルでも、CLIを使えればより深く調査・対応が可能で、回復にたどり着けることが多い。そもそもトラブルに遭遇しにくいという利点もある。よって、ある程度コンピュータの事情を分かって くると、「CLIで操作したほうが楽」となってしまうわけだ。言い換えると「コンピュータに飼い慣らされた人間」のできあがりだ。

 CLIはCUI(Character User Interface)やTUI(Text-based User Interface)とも表現される。それぞれ厳密には異なるものの、いずれも画面にはおおよそ文字(と場合によっては罫線などの記号文字)のみが表示され、キーボードのみで操作するインターフェースだと考えて差し支えないだろう。ただし、CLIとGUIの間に厳密が決まっているわけではない。

 つまりCLIではキーボードから文字を入力し、その結果が表示され、それを元に次の操作を行なうという流れとなる。言い換えると「すべての操作」が文字化できるわけだ。これは操作方法を記録する上で非常に重要だ。実際、scriptコマンドやttyrec、asciinemaなど、その手のツールには事欠かない。

 コンピュータ系の記事でも操作方法を説明する際に、GUIだと「どこそこにあるなんとかボタンを押して、表示されるなんとかメニューを開き云々」と言葉で説明するか、画像を添付して「ここをクリック!」と説明する必要がある。作業手順のスクリーンショットを撮影し、わざわざ表計算ソフトに貼り付けることを日々行なっている読者もいることだろう。

 それに対してCLIだと「この文字列をコピペして」で終わるのだ。伝えられる情報量は変わらないのに、そのデータ量は一気に減る。結果計算量/消費電力も減るわけで、動作も軽量になる。メモリが2GiBのマシンでWindowsを操作せよと言われると「いっそひとおもいに」と思わなくもないが、Ubuntuの場合は「CLIだけで使うならまあなんとか」と思える。これぞまさにSDGs社会に必要な対応と言えるのではないだろうか。ただし残念ながら、CLIを使ったとしてもその実行結果をなぜか表計算ソフトに貼り付ける仕事がなくなるわけではない。

 GUIでいい感じのアプリを探すか、人力で頑張らないといけない処理も、CLIなら1行で書けるということも多い。いくつかの例をあげてみよう。

便利?なコマンド列いろいろ
ディレクトリにあるファイル「.JPG」な拡張子をすべて「.jpg」に変換する例:
$ for f in *.JPG; do mv $f ${f%.JPG}.jpg; done

複数のログファイルから「foo」と書かれている行の前後10行ずつを表示する例:
$ grep -C10 'foo' *.log

「[YYYY/MM/DD hh:mm:ss.msec] XXXX」なフォーマットから先頭の時刻だけ省いて違いを確認する例:
$ diff -u <(sed 's/^\[[^\]]\+\] //' foo.log) <(sed 's/^\[[^\]]\+\] //' bar.log)

ファイルの中の英字で始まる英数字文字列の登場回数順にソートする例:
$ grep -o '[a-zA-Z][a-zA-Z0-9]\+' README.md | sort | uniq -c | sort -nr

やがてvimになる例:
$ for i in $(compgen -c); do printf "%$(tput cols)s\r$i\r" " "; [ $i = vim ] && eval $i && break; sleep 0.02; done

 もちろん慣れないうちは、何度も期待する結果を得られるようになるまで何度もトライアンドエラーをすることになる。GUIでポチポチ設定したほうが結果的に「はやく終わる」ことも多い。ただしCLIには 「再利用性が高い」 というメリットがある。一度、ちゃんと動くコマンド列を作り込みさえすれば、将来似たようなことをしたいときにそれをそのまま使えるのだ。

 当然のことながら、CLIにとって苦手なことも多い。まず「操作方法が分かりづらい」ことだ。これに関しては「がんばれ」としか言えない。つらいのは最初だけだ。慣れれば楽しくなってくる。まずはちょっとだけ、ちょっとだけお試しで始めてみようか。だめだったらすぐにやめればいいだけだから。

 CLIはGUIよりもできることが多い。これは実は問題にもなりうる。GUIは基本的に初心者を意識した作りになっている。そのため安全機構がきちんと作り込まれていることも多い。「それやられるとコンピュータ的にまずい」行為はそもそもできなくなっているか、できるとしても特権が必要な状態になっているし、実施してみると「本当に実施するか?」と念押しされる。それに対してCLIの場合は、そのハードルがものすごく低くなっている。コマンド一発で、SSDストレージの中身を一瞬で全消去なんてことも可能なのだ。

CLI初心者は形から入ろう

 CLI操作を始めるにあたって必要なのが「端末アプリ」だ。厳密には「端末エミュレータ」と言われているソフトウェアになる。Widnwosで言うところのコマンドプロンプトとか「Windows Terminal」とか「Tera Term」のことだ。

 昔のコンピュータは、シリアルケーブルなどで接続された「端末デバイス」を用意し、そこからリモートにあるホストマシンを管理することがあった。その端末デバイスの挙動をエミュレーションしたソフトウェアが「端末エミュレータ」である。多くの端末エミュレータは、広く使われたVT100の挙動をエミュレーションすることが多い。今ではもう端末デバイス自体が使われなくなり、端末エミュレータも単に「端末(terminal)ソフトウェア」と呼ばれることも多い。

 Ubuntuの場合、最初から「GNOME端末(GNOME Terminal)」がインストールされているので、CLIの操作はこれを使うことが多い。Superキー(Windowsキー)を押して、「terminal」で表示される「端末」がそれだ。「Ctrl + Alt + t」でも起動できるようになっている。最初からタブ機能に対応し、フォントやテーマの変更などにも対応しているため、こだわりがなければまずはこれを使うと良いだろう。

 また、端末は開発において非常に重要な位置を占めるため、デスクトップ環境ごとに用意されている。GNOMEならGNOME端末だし、KDE ApplicationsにはKonsole、XfceにはXfce Terminal、LXQtにはQTerminalなどがある。特にCLIに慣れたユーザーにとっては常に使うツールでもあるため、どの端末ソフトウェアを使うかは生産性にも大きく関わってくるのだ。ほかにもUbuntuで利用可能な、メジャーな端末ソフトウェアをいくつか紹介しておこう。

  • Alacritty:高速性を売りにしている比較的若い端末エミュレータ。YAMLで設定できるのも特徴のひとつ。
  • Kitty:こちらも高速性を売りにしている。Pythonで拡張可能。あと猫。
  • mlterm:多言語対応が強い端末エミュレータ。
  • rxvt-unicode:軽量な端末エミュレータとして人気のrxvtをUnicode対応したもの。
  • Terminator:複数の画面を並列して表示できる端末エミュレータ。
  • Tilix:タイル型にウィンドウを表示できる端末エミュレータ。
  • Yakuake:普段は隠れていて必要なときだけ表示するタイプの端末エミュレータ。
  • xterm:昔からあるX Window Systemの標準端末エミュレータ。

 それぞれに特徴があるが、正直なところ「好きなものを使えば良い」という形で全く問題ない。GNOME端末等の最初から入っている端末を使うでもいいし、フォローしている技術者が使っているものに合わせるのでも良い。普段使う好みの端末エミュレータができれば、もうCLIの初心者を脱却したと言って良いだろう。

 選択にあたって、日本のユーザーであれば「日本語が表示・入力可能であるか」がポイントになってくる。ただし最近のソフトウェアはUTF-8には対応しているため、表示も入力も基本的に問題になることはそこまでない。唯一問題になるのがUnicodeのEast Asian Width」(曖昧幅の文字)問題 だ。

 Unicodeにおいて日本語を含む東アジアの文字をサポートするにあたって、漢字や仮名文字のような慣習的に全角幅(2桁の幅)を検討する必要がある。そこで文字ごとに文字幅の属性を決めようとしたのがEast Asian Width(EAW)だ。ざっくり言うと「これは全角幅」、「これは半角幅」と振り分けていくわけだが(実際はもう少し細かい)、その中に「文脈によって異なる」という文字が存在した。具体的には罫線類や記号類、ギリシャ文字、一部の絵文字などがそれに該当する。東アジア以外の言語だと半角幅だけれども、東アジアだと全角幅が使われていた文字は「曖昧幅(Ambiguous Width)」と指定され、文脈によって幅が異なることになっているのだ。

 やっかいなことに、海外製のソフトウェアはこの曖昧幅の罫線類を独自の仕組みを使って半角幅の前提でレイアウトしていることも多い。そのようなソフトウェアを日本語環境で全角幅として扱うと、レイアウトが崩れて使い物にならなくなる。よって単純に「日本語環境だと曖昧文字幅は全部全角で」というわけにはいかず、文字やソフトウェアに対して柔軟に解決する必要がある。しかしながらそれは面倒なので、とりあえず「曖昧文字幅は全角」という方法で解決することも多い。GNOME端末の場合、右上のハンバーガーメニューから設定の「名前なし」(これは未命名のプロファイル名)を選択し、互換性タブにある「曖昧幅の文字」を「全角」に変更するだけで良い。

GNOME端末で曖昧幅の文字を設定する方法

 ほかの端末エミュレータも、今風のものであればおおよそ曖昧文字幅の設定があるはずだ。もし端末上で「文字幅がなんかおかしい」と気になったら、曖昧幅の文字について思い出すようにしておこう。

どんな凄腕ハッカーも最初はlsを使っていたはず

 マイベストな端末エミュレータが決まったら、ソフトウェアを起動しよう。ようこそ、CLIの世界へ!

 端末が起動すると「bash」プログラムが自動的に実行される。CLIの操作はこのbashプログラム上で行なう。これが「シェル」と呼ばれるものだ。

 Ubuntuを含むLinuxは「カーネル」と呼ばれるコアプログラムの上に、「ユーザーランド」となる各種プログラムが動作するモデルとなっている。このカーネル(核)を殻(シェル)で取り囲むように、ユーザーにインタラクティブな操作環境を提供するのが 「シェルプログラム」 というわけだ。シェルもまたCLI操作の根幹であるので、bash以外にもさまざまなプログラムが存在する。今回はbash前提で説明するが、基本的な使い方についてはほぼ共通だ。

 まず端末エミュレータ、つまりbashを起動した後は次のように表示されているはずだ。

こんにちはCLIの世界
shibata@nuc:~$

 これは「アカウント名@ホスト名:カレントディレクトリ<数式>」からなる プロンプト文字列 だ。プログラムがユーザーに対して何か入力を促している(prompt)ことを意味する。このプロンプト文字列はユーザーが自由に設定できるようになっている。よって説明の際は「</数式>」だけで省略することも多い。シェルプログラムによっては「%」を使うこともあるし、特権ユーザーであることを明示する場合は「#」を使うこともある。CLIの説明において、プロンプトは「ここより後ろの文字列を端末に入力してください」という意味で使われる。 「$」自体は入力しなくて良い 点に気をつけよう。

 試しに「ls」コマンドを実行してみよう。これは現在の場所にあるファイルやディレクトリをリストアップ(list)してくれるコマンドだ。

ファイルのリストアップ
$ ls
benchmark.py  snap  src  ダウンロード  テンプレート  デスクトップ  ドキュメント  ビデオ  ピクチャ  ミュージック  公開

 Windowsで言うところの「フォルダー」は、UbuntuのCLI操作では「ディレクトリ」と呼ぶことが多い。実際のところWindowsのコマンドプロンプトでのls相当は「dir」なので、CLIだとディレクトリなのかもしれない。

 このようにCLIの操作は基本的に「プロンプトが表示される」、「何かコマンドを入力する」、「結果が表示される」、「プロンプトが表示される」の繰り返しになる。こちらの入力した内容はきちんと解釈しようとしてくれるし、どんな内容にも答えてくれる。

 コマンドには複数の文字列を組みわせて 「引数(argument)」 を渡せる。たとえばlsコマンドに「-1」を渡すと、リストを1行ずつ表示する。このようにハイフンで始まるものを「オプション」と呼び、出力方法等の挙動を変えるのに使われる。

1行ずつのリストアップ
$ ls -1
benchmark.py
snap
src
ダウンロード
テンプレート
(以下略)

 オプションにはハイフンの後ろに1文字だけのショートオプションと、複数文字を連結するロングオプションがある。ロングオプションの場合はハイフンを2個つなげるのが一般的だが、歴史的経緯で1個だけのものもある。またショートオプションはハイフンの後ろに連結して指定可能だ。

ドット(.)で始まるファイルは「隠しファイル」だ
隠しファイルも表示するロングオプション「--all」。ショートオプションの場合は「-a」を使う。
$ ls --all
.   .bash_history  .bashrc  .config      .gitconfig  .lesshst  .profile  .sudo_as_admin_successful  benchmark.py  src           テンプレート  ドキュメント  ピクチャ      公開
..  .bash_logout   .cache   .fontconfig  .gnupg      .local    .ssh      .vimrc                     snap          ダウンロード  デスクトップ  ビデオ        ミュージック

ショートオプションは連結して指定できる。以下は「-1 -a」を短くした例。
$ ls -1a
.
..
.bash_history
.bash_logout
.bashrc
(以下略)

 ちなみに「.」は現在のディレクトリを意味し、「..」は1個上のディレクトリを意味する。

 ハイフンで始まらない引数は「パラメータ」と呼び、こちらはコマンドを実行する対象などを指定する場合に使われる。たとえばlsコマンドの場合、ディレクトリ名を指定するとそのディレクトリの中身を表示する。

/etc以下のファイルを順番にリストアップする
$ ls /etc
ModemManager            default              initramfs-tools  network              sensors3.conf
NetworkManager          deluser.conf         inputrc          networkd-dispatcher  services
PackageKit              depmod.d             insserv.conf.d   networks             sgml
(後略)

 オプションとパラメータは組み合わせて指定できるし、大抵のコマンドはどの順番で指定しても良い。また、オプションに対してパラメータが存在するものもある次のコマンドは「30」というディレクトリを表示するのではなく、オプション「-w」(表示幅)のパラメータが30文字という意味になる。

「-w」オプションに対してパラメータを設定する
$ ls -w 30
benchmark.py  ドキュメント
snap          ビデオ
src           ピクチャ
ダウンロード  ミュージック
テンプレート  公開
デスクトップ

 コマンドの実行結果は「パイプ」で別のコマンドに渡したり、「リダイレクト」で任意のファイルに保存することが可能だ。このため単機能のコマンドを複数組み合わせて複雑な処理を実現可能になっている。これはうまい組み合わせが見つかると結構楽しかったりする。特定のタスクをいかに効率よくコマンドを組み合わせて1行で実現できるかを考える、「ワンライナー」と呼ばれる実益も兼ねた高尚な趣味もあるくらいなのだから。

複数のコマンドを連携させるパイプとリダイレクト
lsの結果を「パイプ(|)」に渡して、行数をカウント
$ ls -1 | wc -l
11

/etc以下のファイルの一覧を「リダイレクト(>)」することでを別ファイルに保存
$ ls -1a /etc > etc.list

上書きでなく、追記したければ「>>」とする
$ ls -1a /etc >> etc.list

 ファイルやディレクトリの位置を示すの 「パス」 についても簡単に説明しておこう。Ubuntuを含むUnixは、Windowsと異なり「/(スラッシュ)」をパスの区切りとして使っている。ディレクトリFOOの下にあるファイルBARは「FOO/BAR」となる。ファイルパスの一番上は「/」で 「ルート」 と呼ぶ。すべてのファイルはこの「ルート」からのツリー構造で表現される。Windowsのドライブ識別子のようなものは不要で、SSDもHDDもUSBメモリもこのルートの下のどこかにぶら下がっている。

 ある特定のファイルの位置を示すファイルパスには、主に2種類の表記法がある。 「絶対パス」 「相対パス」 だ。絶対パスはルートからすべて記述する方法で「/home/ubuntu/FOO/BAR」などと書く。相対パスはカレントディレクトリからの相対的な位置を示し、たとえば「/home/shibata」にいるなら、「../ubuntu/FOO/BAR」のようになる。ここで「..」は「1個上のディレクトリ」を意味する。2個上なら「../../」となる。

 なお、ファイル名およびディレクトリ名は 大文字と小文字を別扱いとする(case-sensitive) 。「Foo.txt」と「FOO.txt」は別のファイルだ。ファイル名とディレクトリ名に「/(スラッシュ)」は使えない。それ以外の文字は使えるが「><|:&」あたりはシェルの処理で使うので避けることを強くおすすめする。半角空白や「’"()」あたりもエスケープ処理が必要になるので、できれば避けたほうが無難だ。日本語は問題なく使えるが、Ubuntuの場合はUTF-8となる。Windowsで作ったzipファイル内の名前(cp932)や、Macの濁点処理(UTF-8-MAC/NFD)されたファイル名だと表示がおかしくなる点に注意しておこう。

 ちなみにbashをはじめとする今風のシェルには 「Tab補完」 という機能がある。たとえば「verylongfilename.txt」というファイルが存在したとき「very」を入力した状態でTabキーを押すと、残りの文字列を自動補完してくれる。ただし補完されるのは一意に決まる部分までだ。同じディレクトリに「verylongdirectoryname/」というディレクトリも存在した場合は「verylong」で補完は止まる。その状態ですぐにもう一度Tabを押すと補完候補が表示される。

 このTab補完機能はコマンド名や、一部のコマンド引数でも利用できる。コマンドの誤入力防止や時短に使えるので、積極的に活用していこう。

 もう1つ知っておくと良いのがCtrlキーの扱いだ。UbuntuをはじめとするUnix/Linuxのプログラムは 「シグナル」 と呼ばれるメッセージを受け取ることで特別な挙動を行なうようになっている。一般的なシェルはCtrlキー+1文字で、現在実行中のプロセスにシグナルを送れる。

 代表的なのがプロセスを強制終了する際によく使う「Ctrl-C」だ。これはSIGINTを送るわけだが、コマンドを実行したは良いものの、一向に終了しないプログラムを強制的に終了する際に使う。ちなみにシェル上のCtrlキーは、知らないで打つと意図しない挙動になりやすい。特にはまりやすいものをリストアップしておこう。

  • Ctrl-Z:現在の処理をバックグラウンドに移動しシェルに戻る。もし処理を戻したければfgコマンドを実行しよう。
  • Ctrl-S:現在の処理を一時停止する。シェルでCtrl-Sを押すと文字入力を受け付けなくなるので注意。
  • Ctrl-Q:一時停止した処理を再開する。Ctrl-SでにっちもさっちもいかなくなったらおもむろにCtrl-Qを押すと良い。

 「Ctrl-C」などのCtrlと組み合わせて入力する文字は伝統的に大文字で記述されることが多い。ただし実際に入力する際は「Ctrl-c」と小文字でよく、大文字にするように「Ctrl-Shift-c」と動かない場合もあるので気をつけよう。

Googleが友だちだとすればmanは相棒だ

 CLI生活を初めて最初のうちは、実現したいことを「ぐぐって」、誰かが書いたCLIコマンドを「コピペ」する生活が続くだろう。それ自体は悪いことではない。ただ、実行する前にひと手間かけると、CLIの学習が格段に進む。それが 「manコマンド」 をはじめとするヘルプメッセージだ。何かを実行する前にヘルプメッセージを読んで何をしようとしているか逐一確認することで、そのうちぐぐらなくてもなんとなく「これを使えばいけるんじゃない?」と思えるようになってくる。

 よって、CLIに習熟したいなら面倒でも常にヘルプを参照することを強くおすすめする。ただしインターネット上ではたまに変態的な使い方をしている例もあるため、ヘルプを読んでも何しているか分からなければ、とっとと諦めてしまうことも大事だ。さて、Unixにおいてあるコマンドの操作方法は、おおよそ次の3種類で確認できる。

  • 「man コマンド名」でマニュアルを見る
  • 「info コマンド名」でマニュアルを見る
  • 「コマンド -h」や「コマンド –help」「コマンド -help」「help コマンド」などを実行する

 伝統的にUnix/Linuxのコマンドは 「manページ」 と呼ばれるマニュアルファイルが用意されている。manualのmanだ。「man コマンド名」でコマンドのマニュアルが表示される。マニュアルはSPACEキーやCtrl-Dでスクロールダウン、Ctrl-Uでスクロールアップする。「/」を押したあとに文字列を入力すると検索だ。終了する際は「q」を押す。もちろんmanコマンドのマニュアルも次のように表示できる。

マニュアルを表示するmanコマンドのマニュアルを表示するコマンド
$ man man

 manページには「セクション」という概念があり、同名でも用途や由来がことなるマニュアルは別セクションに所属する。たとえばprintfコマンドならセクション1だが、printf()関数ならセクション3になる。「man 1 printf」「man 3 printf」で表示結果を確認すると良いだろう。「man -a printf」ですべてのセクションを順番に確認できる。

 また、manページはものによっては日本語化されている。ただし若干古い翻訳も含まれることもあるので、英語で確認したい場合は「man -LC apt」と実行すると良い。インストールされていないコマンドのmanページを読みたくなったら、Ubuntuだと「manpages.ubuntu.com」で検索する方法もある。

  「infoコマンド」 は、主にGNUプロジェクトのコマンド群で使われているマニュアルだ。manページよりリッチなビューワを使うことになる。Ctrlキーを組み合わせて使うのが定番ではあるものの、最初のうちはカーソルキーで移動、下線がついているところでエンターキーをおすとジャンプ、lキーでひとつ前に戻る、qキーで終了ぐらいをおぼえておくと良いだろう。大抵の場合はmanページで事足りるのだが、たまにmanページで物足りないときにinfoを読むとしっかり書いてあることもあるので、記憶の片隅にとどめておくと良い。

 最後の例はコマンド内に含まれるヘルプメッセージを表示する代表的な例だ。大抵は「-h」や「–help」オプションで表示される。たまにコマンドの出自の都合でハイフンが1個の「-help」なこともある。bashコマンドの中に組み込まれているコマンド(たとえばcdとかfor)などは、helpコマンドのみ存在し、manページがないことも多い。コマンドによっては「コマンド help サブコマンド」でサブコマンドの情報を表示してくれるものもある。

 このあたりの「公式のマニュアル」を確認する方法に慣れておけば、Webブラウザが表示できなかったり、インターネットに繋げない環境でもなんとかなる。ぐぐっても「いかがでしたか?」としか書いてなくて困ることもなくなる。ぜひおぼえておこう。

最初は単体で使えそうなコマンドから始めよう

 ここからは「Ubuntuに最初から入っている、CLIでまず最初に覚えておくと便利なコマンド」を簡単に列挙しておく。

ls:ディレクトリの中身を表示する

 最初に説明したようにlsコマンドは、ディレクトリの中身を表示する。サイズや時間順にソート、特定のパターンのみ隠すなど何気に高機能なので、一度manページを読んでおくと良いだろう。

典型的なlsコマンドの利用例
現在のディレクトリの内容を表示
$ ls

指定したディレクトリの内容を表示
$ ls /etc

サブディレクトリも含めて表示
$ ls -R /etc

隠しファイル(「.」で始まるファイル)も表示
$ ls -a

所有者や変更日時も含めて詳細表示
$ ls -la

変更日時を昇順にソート(-tだけだと降順)
$ ls -ltr

cd:ディレクトリの移動

 cdコマンドを使うと、現在のディレクトリ(カレントディレクトリ)を移動できる。

典型的なcdコマンドの利用例
カレントディレクトリを「/etc」に移動
$ cd /etc

カレントディレクトリを「自分のホームディレクトリ(/home/ユーザー名/)に移動
$ cd ~

前回cdした場所に戻る
$ cd -

 ディレクトリの移動の履歴を残したいなら、cd以外にもpushd/popdというコマンドもある。

cat/less:ファイルの中身を表示する

 ファイルの中身を直接表示したいならcat(concatenate)が、ページャーでスクロールしながら閲覧したいならlessが使える。

典型的なcat/lessコマンドの利用例
ファイルを1行ずつダンプする
$ cat /etc/os-release

ファイルをページャーで表示する
$ less /etc/os-release

ファイルを1行ずつ「末尾から」ダンプする
$ tac /etc/os-release

ファイルを連結して別ファイルに保存する
$ cat /etc/os-release /etc/lsb-release > osinfo.txt

 バイナリファイルを画面にcatすると、ひどい目にあうので気をつけよう。おもむろに「reset」を入力してエンターを押しておけば回復する場合も多い。それでもダメなら端末エミュレータの再起動だ。

mkdir:ディレクトリを作成する

 mkdirを使うと、任意の名前のディレクトリを作成できる。

典型的なmkdirコマンドの利用例
fooという名前のディレクトリを作成
$ mkdir foo

「-p」を付けるとファイルパス上の存在しないディレクトリも合わせて作成する
$ mkdir -p bar/baz

cp/mv:ファイルをコピー・移動する

 任意のファイルをコピーするならcp(copy)、元のデータをそのまま別の場所に移動したいならmv(move)だ。

典型的なcp/mvコマンドの利用例
ファイルをコピー
$ cp /etc/os-release foo/os.txt

ディレクトリごと別の場所にコピー
$ cp -r foo/ bar/

ファイルを移動
$ mv foo/os.txt bar/

rm/rmdir:ファイルやディレクトリの削除

 rmでファイルを削除できる。rmdirは空のディレクトリの削除だ。どちらも「ゴミ箱」には移動せず、原則として 削除したらも復旧できない ことに注意しよう。

典型的なrm/rmdirコマンドの利用例
指定したファイルの削除
$ rm bar/foo/os.txt

ディレクトリを削除。ディレクトリが空でない場合はエラーとなる
$ rmdir foo/

指定したディレクトリ以下をすべて削除。「-i」で削除するファイルをひとつずつ問い合わせる
$ rm -ri bar

 よく「rm -rf ディレクトリ名」で、無条件で指定したディレクトリを削除する手順が紹介されている。これは「ディレクトリ名」を間違えると、問答無用で消してはいけないファイルを消すという大事故を起こしかねないので実行の際はよくよく注意したい。

ps:プロセスリストの表示

 現在実行中のプロセスを表示するにはpsコマンドを使う。psコマンドのオプションはUnix系(ハイフン1個)とBSD系(ハイフンなし)とGNU系(ハイフン2個)が入り乱れていて分かりにくい。

典型的なpsコマンドの利用例
現在のシェルから起動したプロセスを表示
$ ps

すべてのプロセスを表示
$ ps -ef

プロセスの実行開始順でソート
$ ps -ef --sort=start_time

プロセスのメモリ使用順でソート
$ ps -ef --sort=%mem

sudo:管理者権限で実行する

 Ubutnuは通常のシェルは、シェルを実行したユーザー権限で処理を行なう。このため、たとえばパッケージの追加など管理者権限が必要なコマンドは実行できない。管理者権限で任意のコマンドを実行する方法が、sudoコマンドだ。通常のコマンド列の前に「sudo」を追加するだけだ。

典型的なsudoコマンドの利用例
管理者権限でlsを実行する
$ sudo ls

管理者権限のシェルにログインする
$ sudo -i

指定したユーザーの権限で実行する
$ sudo -u root ls

apt:パッケージの管理

 Ubuntuはパッケージの管理方法としてAPTシステムとsnapシステムを採用している。このうちAPTシステムの方の管理ツールがaptコマンドだ。パッケージの情報表示等なら一般ユーザー権限で行なえるが、インストール等は管理者権限が必要になる。

典型的なaptコマンドの利用例
パッケージを検索
$ apt saerch sushi

パッケージの情報を表示
$ apt show tekka

パッケージのインストール
$ sudo apt install hello

 aptを利用したパッケージ管理システムについては、第4回の「これで脱・初心者。Ubuntuのパッケージ管理入門」も参考にして欲しい。

exit:シェルを終了する

 シェルを終了するにはexitコマンドを使う。GNOME端末を起動していたら、GNOME端末も終了する。

この手ですべてを終わらせよう
$ exit

CLI生活の道のりは険しく遠い

 実際はこれだけでは、CLIを活用するのはかなり厳しいだろう。grepやkill、diffといった頻出コマンドはもちろんのこと、CLI初心者にとって最初に立ちふさがるであろうオプション分かりにくい四天王の「sed・awk・xargs・find」なども、使えるようになりたいところだ。

 シェル自体も環境変数、コマンド置換、標準出力・標準エラー出力・標準入力、ブレース展開などなど、覚えておきたい用語は山ほどある。きっとここまで読んだ読者の中には「初心者向けっていうんだったら、なんでこれ説明しておかないんだよ」と思ったものがあるのではなかろうか。気持ちは分かる。

 しかしながらただでさえ学習コストが高いのに、新しい概念をどんどん投入してしまうとそれだけで追いかけるのが辛くなる。辛くならない人はそのまま突き進んで欲しいところだが、そうでない普通の人は「まずこの処理だけでもCLIでやってみよう」という感じで少しずつ進めていくのが良いだろう。