コマンドライン(端末、シェル)の初歩的な使い方

概念

端末とシェル

コマンドラインは「端末」と「シェル」というふたつのプログラムから成り立っています。

「端末」はコマンドラインを表示したり操作するためのソフトウェアです。 「シェル」はコマンドを入力したり、プログラムの出力を返したりするためのソフトウェアです。

「端末」の中で「シェル」が動いている、というようなイメージになります。

ファイルパス

Windowsの場合、ファイルシステムルートは\ではじまります。 これは環境によりバックスラッシュ、あるいは日本円マーク(さらに環境によってはそれ以外、主にシステムのネイティブ言語の通貨)で表示されます。

さらにその前にドライブレターがつきます。これはファイルシステムごとにつけられています。 システムファイルシステムは通常C:になっています。

ですから、システムの先頭はC:\です。ユーザーディレクトリは標準でC:\Users\ユーザー名になっています。 追加のドライブは通常Cよりも後のアルファベットが使われます。 正式には大文字に限られていますが、ドライブレターは大文字小文字を区別しません。

MacやLinuxほかUnixライクなシステムにおいてはルートファイルシステムは/ではじまります。 Windowsのようにファイルシステムごとの先頭という考え方はなく、異なるファイルシステムが併用されている場合、任意の場所にマウントされています。 そのため、常にパスは/ではじまります。

Windowsの場合はドライブレター、または\からはじまるもの、Unixライクなシステムでは/からはじまるものは絶対パスになり、どの位置を起点にしても同一の場所を示すことができます。

これらではじまらないものは相対パスとなり、現在位置を起点としてファイルの位置を示します。 通常はファイル、あるいはディレクトリの名前からはじまりますが、特殊なものとして...があります。

.はカレントディレクトリを示します。ファイル名からはじめてもカレントディレクトリからはじまりますから通常は必要ありませんが、明示する必要があるときや、あるいはカレントディレクトリそのものを示すために使用します。

..はペアレントディレクトリを示します。つまり一階層上がります。 Windowsでは..\..、Unixでは../..のように表すことでさらにもうひとつ上の階層をあらわすことができます。

カレントディレクトリ

全てのプロセスには「現在どのディレクトリにいるか」というカレントディレクトリが設定されています。 これは相対パスがどのディレクトリを起点とするかを意味します。

これはシェルにおいても同様ですが、シェルは対話的なプログラムであるため、ユーザーは任意のタイミングで操作のためにカレントディレクトリを変更することができます。

シェルでカレントディレクトリを変更するにはWindows, Unix(Mac, Linux)のいずれでもcdコマンドを使用します。

コマンドの引数に変更したいディレクトリを記述します。

> cd C:\Users\Mimir
> cd /home/mimir

Windows

cmd.exe

Windowsでは基本的なシェルとしてcmd.exeというプログラムがあります。 そのプログラムはWindowsにとってシェルと端末の両方を兼ねています。

Windowsの検索機能でcmdで検索するか、Windows+Rキーで「コマンドを指定して実行」でcmdを実行します。

ほとんどの場合Windowsの標準のコマンドライン環境としてはこちらを使います。

PowerShell

PowerShellはWindowsの新しいシェルです。プログラムはpowershell.exeです。

Windowsの検索機能でpowershellで検索するか、Windows+Rキーで「コマンドを指定して実行」でpowershellを実行します。 この場合、cmdと同様に端末とシェルを兼ねた状態で起動します。 ただし、このとき起動するシェルはcmdと同じものであり、色が違うだけです。cmd上からpowershellを実行してシェルをPowerShellに変更することもできます。

cmdとPowerShellの大きな違いは組み込みコマンドです。 ただし、PowerShellの組み込みコマンドは綴りが長く、コマンド探索が遅いため応答が悪いことから普段はあまり使いません。

Git for Windows

Git for Windowsは分散型バージョン管理システムGitのWindows版です。

ここでこのソフトウェアについて言及するのはMSYS2+minttyによるBash環境が「Git Bash」としてインストールされるためです。

もちろん、MSYS2をインストールするという方法もあるのですが、ここでわざわざGit for Windowsと言っている理由は、Git for Windowsは初期設定でWindowsにとってパスの通った実行可能なプログラムに対してパスを通すためです。

もちろん、技術があればMSYS2をインストールして作り込めばいいだけなのですが、これは初心者向けの記事ですし、できるだけハードルを下げるという意味でGit for Windowsの利用を推奨します。 任意の場所で右クリックから “Git Bash Here” を選べばそこをカレントディレクトリとしてBash(mintty)を開けるためより扱いやすいでしょう。 Windowsの場合書きにくいパスが多いので、これは大きいはずです。

Mac

MacはDockの中にTerminal(端末)があることでしょう。

これを起動するとMac純正の端末が起動します。 標準のシェルはBashです。

Linux

Linuxでは様々な端末アプリケーションがあります。 たとえば次のようなものです。

一般的には標準のシェルはBashですが、Gentoo系統のディストリビューションではZshになっています。

また、LinuxではないUnixシステムでは場合によってはashなどが標準シェルであることもあるでしょう。

基本

コマンドの入力

基本的にシェルにおいてはコマンドを入力可能であることを示し、コマンド入力を促すコマンドプロンプトが表示されます。

cmd.exeでは標準では>がプロンプトマークです。 Powershellでも同様です。

Bashでは一般ユーザーを示すプロンプトマークは$で、rootは#です。 Zshでは一般ユーザープロンプトマークは%で、rootは#です。

シェルの入出力を例示する際は慣例としてプロンプトマークだけを表示します。 プロンプトはカスタマイズ可能ですから、実際の表示は異なる場合もあります。

次の例は実際に私が使用しているLinux上で使用しているZshのプロンプトです (Powerlevel9kを使用し、テーマをカスタマイズしています)。

Linux Zsh Powerlevel9k (カスタマイズされたテーマ)

コマンド

コマンドは1ワードで書かれた先頭の文字列です。

$ command

直接コマンドとして指定できるものは実行パスディレクトリに含まれているものだけです。 Windowsの場合標準でカレントディレクトリを含みますが、Linuxでは通常含みません。

Linuxにおいては/bin, /usr/binなどの決められたディレクトリに集約されており、基本的にはほとんどの実行可能なプログラムがコマンドとして実行可能な形になっています。

一方、WindowsではC:\Program Files以下にばらばらに配置されます。 このため、コマンドとして実行可能になっているものはまちまちです。

実行パスに含まれていない実行可能なファイルはファイルを指定することで実行できます。 ディレクトリセパレータ(Windowsでは\, Unixでは/)を含む場合、コマンドは実行パスを探索するのではなく、ファイルパスであると理解されます。

例えば次のようにします。

> C:\"Program Files"\"Mozilla Firefox"\Firefox
$ ./configure
$ /usr/bin/vendor_perl/spamc

ワードはひとつ以上のホワイトスペースで分割されます。 Windowsの場合、ファイル名にスペースを含むものが多いため、ファイルパスを"(ダブルクォート)で囲むことを忘れないようにしてください。

引数とクォート

コマンドに値を渡す場合、ホワイトスペースで区切って与えます。

次の場合、ABというふたつの値をechoコマンドに渡します。

$ echo A B

スペースを含む値を引数として渡したい場合はダブルクォートで囲みます。

> echo "Hello GUYS"

Windowsのコマンドプロンプトではダブルクォートの中にダブルクォートを含めるには""と書きます。

> echo "He say ""IS""."

また、\も特殊な解釈をされます。

Bashではダブルクォートの中では\, $, !が特殊な意味を持つものと解釈され、"はクォートの終端であるとみなします。

Bashでダブルクォートにかえてシングルクォート(')を使うことでこれらの特殊な意味を打ち消すことができます。

オプション

オプションはプログラムの挙動を変更するフラグです。

Windowsの場合/に続いてフラグ文字を書きます。

> dir /s

Unixでは-に続いてフラグ文字を書く、あるいは--に続いてオプション名を書くのが一般的です。ただし、その例外となるものもあります。

$ ls -l
$ ls --full-time
$ ps aux

Windows上でもUnix文化から生まれたプログラムはUnixスタイルのオプションを使用するものも多くあります。 現在はむしろそのほうが一般的です。

オプションは場合によってはそのオプションに対する特別な値を取ります。 Unixスタイルのショートオプションの場合、次の引数として書きます。 Unixスタイルのロングオプション(GNUロングオプション)の場合は、それにつづいて=を書き、値を書くか、次の引数として値を書きます。

$ pandoc infile.md -o outfile.html
$ systemctl --user --on-calender=12:30 claws-mail --send
$ yad --notification --command "somescript"

リダイレクトとパイプ

>を使うとコマンドのコマンドの出力(標準出力への出力)を指定したファイルに保存します。

> dir > dirfile.txt

<を使うとコマンドの入力(標準入力からの入力)をファイルから入力します。

$ tr a-z A-Z < abcfile

|を使うとコマンドの標準出力への出力を次のコマンドの標準入力として入力します。

$ curl 'http://example.com/example.html' | grep hello
«