POSIX 環境の使い方

コマンドラインの起動

WSL の起動方法 で紹介している方法で WSL 上の Ubuntu を起動しましょう。 explorer.exe で開いているフォルダを作業ディレクトリに設定済みの状態で開くには Linux シェルをここに開く または コンテキストメニューへ WSL Ubuntu Here の登録 で紹介している方法を使うと便利です。

コマンド

コマンドラインでは、 コマンド待ち受け状態の shell にコマンドを与えることで命令を行います。

コマンドは一般に リスト 36 のような書式で与えます。

コマンド名は例えば helpls 等、shell のビルトインコマンドや コマンド検索対象のディレクトリに置かれたプログラムのファイル名となります。

パラメータは各コマンドの動作を切り替えるオプションや コマンドに処理させるファイル等を与えます。

リスト 36 一般的なコマンドの書式
コマンド名 [パラメータ]...

コマンドの使い方を説明される時 パラメータが大括弧で [FILE] のように囲まれている場合は、 そのパラメータが省略可能であることを意味します。

括弧なしで FILE のように示された場合は、 そのパラメータが必須であることを意味します。

パラメータの末尾に FILE...[FILE]... のように ... が付与されている場合、 直前のパラメータを任意の回数繰り返す事が出来ることを意味します。

空白を含むパラメータはダブルクォーテーション " ... " またはシングルクォーテーション ' ... ' で括る必要があります。 両者の違いは、クオートされたパラメータ内の変数が展開されるか否かです(シェル変数と環境変数 で後述します)。

コマンドには様々な種類のものがありますが、 例えば、インターネットからファイルをダウンロードするコマンド wgetcurl を使ってファイルをダウンロードするには リスト 37リスト 38 のようにします。

リスト 37 wget による hello.py の取得
wget https://ds0n.cc.yamaguchi-u.ac.jp/~okadalab/hello.py
リスト 38 curl による hello.py の取得
curl -OLR https://ds0n.cc.yamaguchi-u.ac.jp/~okadalab/hello.py

コマンドの調べ方

ヘルプ

POSIX 用のコマンドの多くはオプションとして -h または --help を与えると、 そのコマンドの使い方を説明したヘルプを表示する機能を備えます(例: リスト 39, リスト 40)。

Shell のビルトインコマンドの場合は help コマンドでも使い方を調べることができます(例: リスト 41, リスト 42)。

リスト 39 help コマンドのヘルプ表示
help --help
リスト 40 help コマンドのヘルプ表示結果
$ help --help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

    Displays brief summaries of builtin commands.  If PATTERN is
    specified, gives detailed help on all commands matching PATTERN,
    otherwise the list of help topics is printed.

    Options:
      -d        output short description for each topic
      -m        display usage in pseudo-manpage format
      -s        output only a short usage synopsis for each topic matching
                PATTERN

    Arguments:
      PATTERN   Pattern specifying a help topic

    Exit Status:
    Returns success unless PATTERN is not found or an invalid option is given.
リスト 41 help コマンドによる help コマンドのヘルプ表示
help help
リスト 42 help コマンドによる help コマンドのヘルプ表示結果
$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

    Displays brief summaries of builtin commands.  If PATTERN is
    specified, gives detailed help on all commands matching PATTERN,
    otherwise the list of help topics is printed.

    Options:
      -d        output short description for each topic
      -m        display usage in pseudo-manpage format
      -s        output only a short usage synopsis for each topic matching
                PATTERN

    Arguments:
      PATTERN   Pattern specifying a help topic

    Exit Status:
    Returns success unless PATTERN is not found or an invalid option is given.

man page

POSIX 用のコマンドの多くには man page と呼ばれる 以下の 8 セクションに分類されたマニュアル (manual: 取扱説明書) も用意されています。

  1. ユーザーコマンド

  2. システムコール

  3. C ライブラリ関数

  4. スペシャルファイル

  5. ファイルフォーマット

  6. ゲームプログラム

  7. 概要、慣習やその他

  8. 管理コマンドと特権コマンド

これは /usr/share/man 以下のディレクトリ格納されていており、 man コマンド(リスト 43)により検索や閲覧が可能です。

リスト 43 man コマンド
man [man options] [[section] page ...] ...
man -k [apropos options] regexp ...
man -K [man options] [section] term ...
man -f [whatis options] page ...
man -l [man options] file ...
man -w|-W [man options] page ...

例えば man コマンド自体の man page を見たい場合は man man と入力します(リスト 44)。

リスト 44 man コマンドの man page を表示するコマンド
man man

man page の閲覧中はカーソルキーの上下や PageUp , PageDown , j , k 等のキーで上下にスクロールします。 また、 / に続けて 正規表現 を入力して ENTER キーを叩くことで検索も出来、 n, N キーで上下の該当箇所にジャンプすることも出来ます。

終了は q キーです。

man コマンドの実行時に幾つかのオプションで動作を変更でき、 -f オプションを用いるとコマンドの概要が記録されている whatis データベースの完全マッチ検索(whatis コマンド相当)、 -k オプションを持ちると whatis データベースの 正規表現 検索 (apropos コマンド相当) の動作をします。

なお、WSL に Ubuntu をインストールしただけの状態では、日本語の man page や日本語の設定が行われていません。 WSL の Ubuntu で日本語の man page を利用したい場合は、 リスト 45 のコマンドを実行してください(要パスワード)。 実行が完了したら、一旦 WSL のウインドウを閉じて、WSL を開き直すと日本語マニュアルが利用可能になります。

リスト 45 日本語 man page の設定
function setup_manpages_ja () {
sudo apt update
sudo apt install -y manpages-ja{,-dev}
sudo locale-gen --lang ja_JP.UTF-8
sudo update-locale LANG=ja_JP.UTF-8
}
setup_manpages_ja

英語に戻したい場合は、リスト 46 を実行して WSL を開き直しましょう。

リスト 46 英語の man page に戻す設定
sudo update-locale LANG=C.UTF-8

英語と日本語の man page を使い分けたい場合は、 コマンドの前に環境変数 LANG の設定を与えて、使いたい ロケール を指定します (リスト 47, リスト 48)。

リスト 47 英語の man page を引くコマンド
LANG=C man man
リスト 48 日本語の man page を引くコマンド
LANG=ja_JP.UTF-8 man man

一時的に切り替えたい場合は環境変数 LANG に使いたい ロケール を指定します (リスト 49, リスト 50)。

リスト 49 英語のケールに切り替えるコマンド
LANG=C.UTF-8
リスト 50 日本語のロケールに切り替えるコマンド
LANG=ja_JP.UTF-8

man page を日本語に翻訳・公開している JM ProjectUbuntu manuals 及び Ubuntu manpages から日本語マニュアルを検索する 方法も 知っておくと良いでしょう。

info

info コマンド(リスト 51)を用いると、 texinfo 形式のより詳しいマニュアルを確認出来る場合もあります。

これらのドキュメントは /usr/share/info/ 以下のディレクトリに格納されています。

リスト 51 info コマンド
info [OPTION]... [MENU-ITEM...]

ファイルとディレクトリとフォルダ

ファイルはデータを格納する仕組みです。 今日、多くの OS では テキストや画像、音声等様々な形式のデータをファイルとして保存しています。

ディレクトリはファイルを整理するための仕組みであり、複数のファイルを格納するための特殊なファイルです。 ディレクトリの中にディレクトリを作ることで親子関係のある階層構造を作ることも出来ます。

Windows でフォルダと呼ばれているファイルが、POSIX ではディレクトリと呼ばれます。 両者は基本的に同じ仕組みです。

作業ディレクトリ

コマンドラインには、作業ディレクトリという概念があります。 コマンドにファイルやディレクトリを与える際には、 ルートディレクトリ (root directory) を起点とする 絶対パス (absolute path) または 作業ディレクトリ (current directory, working directory) を起点とする 相対パス (relative path) で位置を指し示します。

コマンドラインで作業するには、まず、目的のファイルがあるディレクトリに移動する必要があります。

作業ディレクトリを変更するには cd (change directory) コマンド(リスト 52)に、 移動先のディレクトリを 絶対パス または 相対パス として与えてください。 親ディレクトリへ移動する際は、親ディレクトリを意味する記号 .. を用います。

現在の作業ディレクトリを調べるには pwd (print working directory) コマンド (リスト 53)を使います。

リスト 52 cd コマンド
cd [OPTION]... [DIR]
リスト 53 pwd コマンド
pwd [OPTION]...

POSIX 環境では、ホームディレクトリ (HOME directory) は 通常 /home/USERNAME に作成されます(USERNAME は各自のユーザー名になります)。

Ubuntu は初期設定ではコマンドラインの入力待ちの行に USERNAME@HOSTNAME:~$ ような表示が行われますが、 末尾の $ は一般ユーザー権限で実行中を意味し、 その前の : との間の部分が現在の作業ディレクトリを意味します。 ~ はホームディレクトリを意味する短縮表記です。

cd コマンドはパラメータなしで実行、またはパラメータとして ~ を与えて実行すると 作業ディレクトリをホームディレクトリに変更します。

リスト 54 ホームディレクトリに移動するコマンド1
cd
リスト 55 ホームディレクトリに移動するコマンド2
cd ~

また、パラメータとして - を与えた場合、 cd コマンドで設定された、1 つ前の作業ディレクトリに戻ります。

リスト 56 作業ディレクトリを 1 つ前の作業ディレクトリに戻すコマンド
cd -

ファイル操作

POSIX では cat, cp, ls, mkdir, mv, rm, rmdir 等のファイル操作用コマンドを利用可能です。 それぞれ、ファイルの表示、コピー、一覧、移動、削除を行います。

表 1 にファイル操作コマンドの概要を示します。

表 1 ファイル操作コマンドの概要

用途

コマンド

表示

cat [OPTION]... [FILE]...

コピー

cp [OPTION]... SRC DST
cp [OPTION]... SRC... DIR
cp [OPTION]... -t DIR SRC...

一覧

ls [OPTION]... [FILE]...

ディレクトリ作成

mkdir [OPTION]... [DIR]...

移動

mv [OPTION]... [-T] SRC DST
mv [OPTION]... SRC... DIR
mv [OPTION]... -t DIR SRC...

削除

rm [OPTION]... [FILE]...

ディレクトリ削除

rmdir [OPTION]... [DIR]...

テキストファイルの表示

テキストファイルの表示は cat (concatenate)コマンドを用います。 何らかのテキストファイルの(例えば hello.py)を cat コマンドで表示するには、 ファイルを保存しているフォルダで リスト 57 を実行します(リスト 58)。

リスト 57 cat コマンドで hello.py を表示
cat hello.py
リスト 58 cat コマンドで hello.py を表示結果
$ cat hello.py
#!/usr/bin/env python3
print("hello, world")

ファイルのコピー

ファイルのコピーは cp (copy)コマンドを用います。 表 1 では SRC がコピー元(source)ファイル、DST がコピー先(destination)ファイルです。

hello.pyhello2.py にコピーしたい場合は リスト 59 のようにします (リスト 60)。 -v オプションはなくても問題ありませんが、実行結果の詳細を表示するために付与しています。

リスト 59 hello.py を hello2.py にコピーするコマンド
cp -v hello.py hello2.py
リスト 60 hello.py を hello2.py にコピーするコマンド実行結果
$ cp -v hello.py hello2.py
'hello.py' -> 'hello2.py'

ファイルを複数与えた場合は、それらのファイルをディレクトリにコピーするコマンドになります。

オプションを与えることで、同名のファイルがあった時の振る舞い等を変更できます。詳細は man page で確認してください。

ファイルの一覧

ファイルの一覧は ls (list)コマンドを用います(リスト 61, リスト 62)。

リスト 61 ファイルを一覧するコマンド
ls
リスト 62 ファイルを一覧するコマンド実行結果
$ ls
hello.py  hello2.py

オプションを与えることで、読み込み、書き込み、実行フラグや、所有者、 ファイル更新日時等の詳細情報付きで一覧することも出来ます。

ディレクトリの作成

ディレクトリの作成は mkdir (make directory)コマンドを用います。

例えば、IP2023 というディレクトリを作成したい場合は リスト 63 のようにします (リスト 64)。 -v オプションはなくても問題ありませんが、実行結果の詳細を表示するために付与しています。

リスト 63 IP2023 というディレクトリを作成するコマンド
mkdir -v IP2023
リスト 64 IP2023 というディレクトリを作成するコマンド実行結果
$ mkdir -v IP2023
mkdir: created directory 'IP2023'

ファイルの移動

ファイルのコピーは mv (move)コマンドを用います。 SRC が移動元(source)ファイル、DST が移動先(destination)ファイルです。

hello2.pyhello3.py に移動したい場合は リスト 65 のようにします (リスト 66)。 -v オプションはなくても問題ありませんが、実行結果の詳細を表示するために付与しています。

リスト 65 hello2.py を hello3.py に移動するコマンド
mv -v hello2.py hello3.py
リスト 66 hello2.py を hello3.py に移動するコマンド実行結果
$ mv -v hello2.py hello3.py
renamed 'hello2.py' -> 'hello3.py'

ファイルを複数与えた場合は、それらのファイルをディレクトリに移動するコマンドになります。

オプションを与えることで、同名のファイルがあった時の振る舞い等を変更できます。詳細は man page で確認してください。

ファイルの削除

ファイルの削除は rm (remove)コマンドを用います。

hello3.py 削除したい場合は リスト 67 のようにします (リスト 68)。 -v オプションはなくても問題ありませんが、実行結果の詳細を表示するために付与しています。

リスト 67 hello3.py に削除するコマンド
rm -v hello3.py
リスト 68 hello3.py に削除するコマンド実行結果
$ rm -v hello3.py
removed 'hello3.py'

オプションを与えることで、ファイルが含まれるディレクトリを再帰的に削除したり、削除の際に確認を行ったりと、振る舞いの変更ができます。 詳細は man page で確認してください。

ディレクトリの削除

ディレクトリの削除は rmdir (remove directory)コマンドを用います(例: リスト 69)。

IP2023 削除したい場合は リスト 69 のようにします (リスト 70)。 -v オプションはなくても問題ありませんが、実行結果の詳細を表示するために付与しています。

リスト 69 IP2023 というディレクトリを削除するコマンド
rmdir -v IP2023
リスト 70 IP2023 というディレクトリを削除するコマンド実行結果
$ rmdir -v IP2023
rmdir: removing directory, 'IP2023'

rmdir は空のディレクトリしか削除できません。ディレクトリに含まれるファイルごと削除したい場合は rm コマンドに -r オプションを与えます。

所有者とモードビット

POSIX ではファイルには所有者の情報と、ファイルを公開するグループの情報が設定されている他、 モードビット (mode bit) と呼ばれる ファイルの読み込み、書き込み、実行に関する権限が設定されています。 これらの情報は ls コマンドに -l オプションを与えると 確認出来ます(リスト 71, リスト 72)。

リスト 71 ファイルを詳細付きで一覧するコマンド
ls -l
リスト 72 ファイルを詳細付きで一覧するコマンド実行結果
$ ls -l
total 0
-rw-r--r-- 1 USERNAME GROUPNAME  45  5月 22 21:38 hello.py

ここで、USERNAME GROUPNAME となっているのが所有者とグループです。 -rw-r--r-- となっている部分はファイルの属性で、右側9文字がモードビットとなります。 これを 3 文字ずつに分割して rx-r--r-- とすると、 それぞれ user, group, other に対する権限を意味します。 rwx が読み込み(r: read)、書き込み(w: write)、実行(x: execute)属性となります。

所有者は chown コマンドで変更できます。

所有者を他のユーザーに変更する場合、通常は sudo を付与して super user 権限で変更する必要があります。

モードビットは chmod コマンドを用いると変更出来ます。 例えば x 属性を付与する場合は +x、解除する場合は -x のように指定します。

rwx をの ON, OFF を 1, 0 に対応させて 3 bit の数値として r を 4、w を 2、x を 1 扱いすることで、 user, group, other の属性をそれぞれ 8 進表記した 1 桁の数として与えることも出来ます。 これは -rwxr--r-- なら 744 となります。

例えば hello.py に実行属性を付与するには リスト 73 のようにします (リスト 74)。

リスト 73 hello.py に実行属性を付与するコマンド
chmod -v +x hello.py
リスト 74 hello.py に実行属性を付与するコマンド実行結果
$ chmod -v +x hello.py
mode of 'hello.py' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)

$ ls -l
total 0
-rwxr-xr-x 1 USERNAME GROUPNAME  45  5月 22 21:38 hello.py

パイプライン

POSIX では、複数のコマンドの入出力をパイプラインと呼ばれる仕組みで繋ぐことで、 単純な機能のコマンドを複数合わせて使う事が可能です。

パイプラインはコマンドとコマンドの間を | で繋ぎます。

例えば、 ls コマンドの出力を ファイルのバイト数・単語数・行数を表示する wc コマンドの入力に渡すには リスト 75 のようにします(リスト 76)。

リスト 75 ls の結果を wc で集計するコマンド
ls -l | wc
リスト 76 ls の結果を wc で集計するコマンド実行結果
$ ls -l | wc
      2      11      68

リダイレクト

POSIX では、キーボードの代わりにファイルから入力をしたり、 画面の代わりにファイルに出力するリダイレクトの機能が利用出来ます。

ファイルからコマンドに入力するには < FILENAME、 コマンドからファイルに出力するには > FILENAME を使います。

例えば、 ls コマンドの出力をファイル a.txt にリダイレクトし、 wc コマンドの入力としてファイル a.txt の内容をリダイレクトするには、 リスト 77リスト 78 のようにします (リスト 79)。

リスト 77 ls の結果を a.txt にリダイレクトするコマンド
ls -l > a.txt
リスト 78 a.txt を wc にリダイレクトするコマンド
wc < a.txt
リスト 79 ls の結果を a.txt にリダイレクトし、a.txt を wc にリダイレクトした結果
$ ls -l > a.txt
$ wc < a.txt
      2      11      68

ここで上記の a.txt の内容は リスト 80 次の通りです。

リスト 80 a.txt の内容
$ cat a.txt
total 0
-rwxr-xr-x 1 USERNAME GROUPNAME  45  5月 22 21:38 hello.py

コマンドラインの編集 (履歴と補完)

近代的な shell ではコマンドラインの履歴や補完の機能が充実しています。

カーソルの上下キーを押してみると、ここまでで入力したコマンドの履歴を順に表示することが可能です。 また、カーソルキーの左右でテキストカーソルを動かし、以前実行したコマンドを修正して実行することも出来ます。

history コマンドを用いると、それら実行済みコマンドの一覧を得ることも出来ます。

history コマンドで得られた履歴一覧にはインデックス番号がついています。 ! に続けてインデックス番号を入力し [ENTER] キーを叩くことで任意の履歴を実行することも出来ます。

ファイル名やディレクトリ名の入力の際には、[TAB] キーを押すことで、入力候補の表示や補完を行ってくれます。

[CTRL]+[a]、[CTRL]+[e] で行頭・行末、[CTRL]+[←]、[CTRL]+[→] で前後の単語の境界へ移動等、 様々なショートカットキーも設定されています。 編集の際に使えるショートカットキーついては bash man page の Readline コマンド名 の箇所に説明があります。

コメント

# から行末まではコメントとして扱われます。

シェル変数と環境変数

Shell では一時的に値を記録するための変数を利用できます (リスト 81リスト 82)。

リスト 81 シェル変数への代入
name=[value]
リスト 82 シェル変数の参照
$name

空白を含むパラメータはダブルクォーテーション " ... " またはシングルクォーテーション ' ... ' で括る必要があり、 両者の違いは、クオートされたパラメータ内の変数が展開されるか否かであると 作業ディレクトリ で述べました。 実際の違いを比べておきましょう (リスト 83リスト 84)。 ダブルクォーテーション " ... " 内では、 バックスラッシュ \ を用いると環境変数の参照を意味する $ のような特殊文字の 意味を打ち消すことができる他、 エスケープシーケンスと呼ばれる機能で改行などの制御記号を入力することも出来ます。 詳細は bash man page の クオート の部分を参照してください。 echo コマンドでは -e オプションを用いることで、 パラメータ中でバックスラッシュによって記述されたエスケープ文字を有効化出来ます。

リスト 83 シェル変数の使用例
x=hello
y=world
echo "$x, $y"
echo '$x, $y'
echo "$x, \$y"
echo -e "$x, \n$y"
リスト 84 シェル変数の使用例実行結果
$ x=hello
$ y=world
$ echo "$x, $y"
hello, world
$ echo '$x, $y'
$x, $y
hello, $y
$ echo -e "$x, \n$y"
hello,
world

Shell で使用する変数のうち、 export または declare -x コマンドで指定された変数は、 環境変数扱いされてて shell から起動した子プロセスからも参照できるようにるようになります。

環境変数は親プロセスから子プロセスに情報を伝達する手段として利用できます。

PATH

POSIX 環境において重要な環境変数の一つに PATH があります。 この変数には、コマンド実行時に実行ファイルを検索するためのパスが : 区切りで列挙してあります。 Windows にも同名で同様の環境変数 PATH がありますがこちらは ; 区切りとなっています。

リスト 85 コマンドを実行して環境変数 PATH の内容を確認してみましょう。

リスト 85 環境変数 PATH の確認コマンド
echo $PATH

tr コマンドを用いると、 文字の置換や削除が行えます。 : を改行に置き換えて見易く表示するには リスト 86 のようにします。

リスト 86 環境変数 PATH の改行区切りで確認するコマンド
echo $PATH | tr : "\n"

コマンドは、環境変数 PATH で指定されたパスを順に検索されます。 bash の builtin コマンド type を用いると、 実行ファイル検索パスの中のどのコマンドが実行対象になっているかを 確認出来ます (リスト 87)。

リスト 87 実行ファイル検索パスからどの echo コマンドが実行されるか調べるコマンド
type -a echo