コマンドラインの基礎
仮想環境の準備
オンラインの bash インタプリタを利用すると、本コースで例として提供されている全てのコマンドを実行することができます。これは、様々な Linux コマンドの実際の体験に役立ちます。
REPL は Linux コマンドを実行するための bash インタプリタの一つです。本コースで説明するコマンドは、REPL 上で実行したものです。
コマンドって何?
コマンドは、特定の作業を実行するようOS に指示を与えるプログラムです。プログラムは Linux 内においてはファイルとして保存されます。つまり、コマンドはディスク上のどこかに格納されているファイルでもあります。
コマンドはユーザーからの入力として追加の引数を受け取る場合もあります。これらの引数は、コマンドライン引数と呼ばれます。コマンドの使い方を知っておくことは重要です。Linux でヘルプを得る方法はたくさんあります。ほぼ全てのコマンドには何らか形式のドキュメントと、ヘルプを見るためのコマンドライン引数 -h
または --help
があり、ちょうどよい量のドキュメントを見ることができます。しかし、Linux で最も一般的なドキュメンテーションのシステムは、マニュアルページ、略して man
ページと呼ばれるものです。
--help
を使用してls
コマンドのドキュメントを見る実例:
簡単な実例を見るためのコマンド (日本語版オリジナル)
この項目は日本語版オリジナルのコンテンツです。元の linkedin/school-of-sre には存在しない内容です。
日本語話者にとって、man
コマンドは大抵の場合には詳しすぎ、-h
や --help
も、実例が無く分かりにくい場合があります。
ここでおすすめなのは tldr
パッケージによって追加される tldr
コマンドなどの、よく使われる実例をシンプルに表示してくれるコマンドです。本コマンドを活用するには、どのコマンドでどのようなことができるかを知っている必要がありますが、コマンド名を知っていて、細かいオプションを忘れてしまった場合に有用です。このようなコマンドには、tldr
の他に、などがあります。これらは一般的な Linux ディストリビューションに最初からは入っていないため、それぞれ、apt
や yum
コマンドを使用して自分でインストールする必要があります。
tldr
を使用して find
コマンドの実例を見る:
コマンドのオプションについて詳しく知る必要がある場合は、man
を参照すると良いでしょう。
ファイルシステムの構造
Linux のファイルシステムは最上位の「ルート (/
で示される)」ディレクトリ (フォルダ) の下にディレクトリ・ファイルが連なる階層構造 (木構造・ツリー構造) になっています。ルートディレクトリ直下にあるディレクトリには、システムに関連するファイルが格納されます。これら下位のディレクトリには、システムファイル、アプリケーションファイル、ユーザー関連のファイルが格納されます。
bin | 最もよく使用されるコマンドの実行可能プログラムファイルは、bin ディレクトリに格納されています。
sbin | システム管理に利用するプログラムが格納されています。
home | ユーザー関連のファイルおよびディレクトリが格納されています。
lib | 全てのライブラリファイルが格納されています。
etc | 全てのシステム構成ファイルが格納されます。
proc | システム上で実行中のプロセスに関連するファイルが格納されています。
dev | システム上のデバイスに関連するファイルが格納されています。
mnt | システムにマウントされたデバイスに関するファイルが格納されています。
tmp | システム上の一時ファイルを格納するために使用されます。
usr | システム上のアプリケーションプログラムを格納するために使用されます。
ファイルシステム内を移動する
ファイルシステム内の移動のため頻繁に使用される3つの基本的なコマンドを紹介します:
-
ls
-
pwd
-
cd
ここからは各コマンドの機能と使い方について説明します。各コマンド例をオンラインの bash シェルで実行し、練習することもできます。
pwd (print working directory: 現在のディレクトリのパスを表示)
どの瞬間にも、私たちはどこか特定のディレクトリに立っています。現在立っているディレクトリの名前を取得するには、Linux で pwd
コマンドを実行します。
次に、cd
コマンドを使用して別のディレクトリに移動し、移動後の作業ディレクトリを表示します。
cd (change directory: ディレクトリを移動)
cd
コマンドを使用すると作業ディレクトリを変更することができます。次の例のように、あるディレクトリから別のディレクトリへと移動することができます。次の例では、cd
コマンドを用いてルートディレクトリから移動しました。
ls (list files and directories: ファイルとディレクトリのリスト表示)
ls
コマンドは、ディレクトリの内容を表示するために使用します。指定したディレクトリに存在する全てのファイルとフォルダが一覧表示されます。シェルにおいて、単に ls
と入力すると、現在のディレクトリに存在するファイルとフォルダーが一覧表示されます。(隠しファイル・隠しフォルダを含めた全てのファイル・ディレクトリを表示するには -a
オプションを使用する必要があります。)
ls
コマンドの引数としてディレクトリ名を指定することもできます。指定されたディレクトリにあるファイル・ディレクトリが表示されます。
ファイルを操作する
ファイルの操作のため頻繁に使用される5つの基本コマンドを紹介します:
-
touch
-
mkdir
-
cp
-
mv
-
rm
ここからは各コマンドの機能と使い方について説明します。各コマンド例をオンラインの bash シェルで実行し、練習することもできます。
touch (create new file: 新しいファイルを作成)
touch
コマンドを使用すると、空の新規ファイルを作成することができます。touch
コマンドは、他の用途 (ファイルのタイムスタンプの更新など) でも多く使用されますが、ここでは、新規ファイルの作成における使用例のみについて説明します。
touch
コマンドの一般的な構文:
touch <file_name>
mkdir (create new directories: 新しいディレクトリを作成)
mkdir
コマンドは、ディレクトリの作成に使用されます。ls
コマンドを使用することによって、新しいディレクトリが作成されたことの確認ができます。
mkdir
コマンドの一般的な構文:
mkdir <directory_name>
rm (delete files and directories: ファイル・ディレクトリを削除)
rm
コマンドを使用すると、ファイルとディレクトリを削除することができます。このコマンドは、ファイルとディレクトリを完全に削除しますので注意してください。ファイルやディレクトリに対して rm
コマンドを実行した場合、復元はほとんど不可能です。注意して実行してください。
rm
コマンドの一般的な構文:
rm <file_name>
例を使って rm
コマンドを理解してみましょう。touch
コマンドと mkdir
コマンドで作成したファイルとディレクトリの削除を行っています。
cp (copy files and directories: ファイル・ディレクトリをコピー)
cp
コマンドは、ファイルとディレクトリを別の場所にコピーするために使用されます。cp
コマンドは、元のファイルやディレクトリを変更しません。cp
コマンドが正常に実行されると、元のファイル・ディレクトリとそのコピーの両方が別々に存在することになります。
cp
コマンドの一般的な構文:
cp <source_path> <destination_path>
現在は /home/runner
ディレクトリにいます。mkdir
コマンドを使用して、test_directory
という名前の新規ディレクトリを作成した後、_test_runner.py
ファイルを、先程作成したディレクトリにコピーします。
元の _test_runner.py
ファイルには何も起こらず、現在のディレクトリに引き続き存在したままです。この元のファイルのコピーが test_directory
内に作成されました。
cp
コマンドを使用すると、ディレクトリ全体をある場所から別の場所へコピーすることもできます。例を使って理解してみましょう。
ここでも mkdir
コマンドを使用して、another_directory
という新しいディレクトリを作成しました。次に、cp
コマンドと追加の引数 -r
を使用して、test_directory
をコピーしています。
mv (move files and directories: ファイル・ディレクトリを移動)
mv
コマンドは、ファイル・ディレクトリを他の場所へ移動するため、また、ファイル・ディレクトリの名前を変更するために使用します。ファイルの移動とコピーは大きく異なります。ファイル・ディレクトリを移動すると、コピー元のファイルは失われます。
mv
コマンドの一般的な構文:
mv <source_path> <destination_path>
以下の例では、mv
コマンドを使用して _test_runner.py
ファイルを test_directory
に移動しています。この場合、移動先の test_directory
に同名のファイルが既に存在しているので、mv
コマンドはこれを置き換えました。
mv
コマンドが正常に実行された後、元のファイルが削除されていることに注意してください。
また、mv
コマンドを使用しても、別の場所にディレクトリを移動することができます。この場合、cp
コマンドの使用時に利用した -r
フラグを使う必要はありません。mv
コマンドの使用後、元のディレクトリが消えていることに注意してください。
mv
コマンドの使い方の一つとして、ファイル・ディレクトリ名の変更があります。使い方を見てみましょう。
以下の例ではまず、test_directory
に移動しました。次に、mv
コマンドを使用して、_test_runner.py
ファイルの名前を test.py
に変更しています。
ファイルを閲覧する
ファイルの閲覧のため頻繁に使用される5つの基本コマンドを紹介します:
-
cat
-
head
-
tail
-
more
-
less
ここからは各コマンドの機能と使い方について説明します。各コマンド例をオンラインの bash シェルで実行し、練習することもできます。
以下で用いるため、numbers.txt
という新しいファイルを作成し、このファイルに1から100 までの数字を挿入します。各数字は1行ずつ記載されています。
上記のコマンドの意味について今は気にする必要はありません。これは高度なコマンドで、数値を生成するために使用されるコマンドとリダイレクト演算子を使用して、番号をファイルにプッシュしました。I/O リダイレクションについては、後のセクションで説明します。
cat
cat
コマンドの最も簡単な使い方は、ファイルの内容を表示することです。このコマンドは非常に便利で、多くの目的で使用することができます。他のユースケースについては、後で説明します。
上記コマンドを実行すると、1から100までの数字が画面に表示されます。すべての番号を確認するには、上にスクロールする必要があります。
head
head
コマンドは、デフォルトではファイルの最初の10行を表示します。ファイルの上から必要な行数を表示するため、追加の引数を用いることもできます。以下の例では、head
コマンドを使用し、ファイル最初の10行のみが表示されています。
ファイル最初の10行だけではなく、ファイル先頭から見たい行数を指定する場合は、-n
引数を用いて行数を指定します。
tail
tail
コマンドは、デフォルトではファイルの最後の10行を表示します。ファイルの末尾から必要な行数を表示するため、追加の引数を用いることもできます。以下の例では、tail
コマンドを使用し、ファイル最後の10行のみが表示されています。
ファイル末尾の10行だけではなく、ファイル末尾から見たい行数を指定する場合は、-n
引数を用いて行数を指定します。
上記の例では、-n
オプションを使用しファイル最後の5行のみを表示しています。
more
more
コマンドはファイルの内容またはコマンドの出力を表示し、ファイルが大きい場合 (ログファイルなど) は一度に一画面ずつ表示します。また、ファイル内での前方への移動と限定的な後方への移動が可能です。
more
コマンドはファイルを現在の画面に収まるだけ表示し、ユーザー入力によりスクロールされるのを待ちます。前方へのスクロールは、Enter キーで1行進み、Space キーで1画面分出力が進みます。
less
less
コマンドは、more
コマンドの改良版です。less
コマンドはファイルまたはコマンド出力の内容を1ページずつ表示します。これにより、ファイル内での前方・後方への自由な移動が可能となり、検索オプションもあります。矢印キーにより、1行分ずつ前後に進むことができます。Space キーを押すと1ページ分進み、b キーを押すと1ページ分前に戻ります。また、g キー、G (g + Shift) キーにより、ファイルの先頭と末尾へ瞬時に移動することも可能です。
Echo コマンド
echo
コマンドはシェルで使用される最も単純なコマンドのひとつです。このコマンドは、他のプログラミング言語における
文字列操作のコマンド
上記のセクションでは、ファイルの内容を表示する方法について説明しました。多くの場合、次の操作を行うことにも興味があるでしょう。
-
特定の単語が含まれる行のみを表示する
-
ファイル内の特定の単語を別の単語に置き換える
-
何かしらの順序に行を並び替える
文字列操作のため頻繁に使用される5つの基本コマンドを紹介します:
-
grep
-
sed
-
sort
ここからは各コマンドの機能と使い方について説明します。各コマンド例をオンラインの bash シェルで実行し、練習することもできます。
以下で用いるため、numbers.txt
という新しいファイルを作成し、このファイルに1から10 までの数字を挿入します。各数字は1行ずつ記載されています。
grep
grep
コマンドを最も単純な使い方で使用した場合、テキストファイル内の特定の単語の検索に使用することができます。ファイル内の、入力した内容を含む全ての行が表示されます。検索する単語は、grep
コマンドへの入力として指定します。
grep
コマンドの一般的な構文:
grep <word_to_search> <file_name>
以下の例では、ファイルから文字列「1」を検索しようとしています。grep
コマンドは、この文字列が見つかった行を出力しています。
sed
sed
コマンドを最も単純な使い方で使用した場合、ファイル内の文字列置換に使用することができます。
文字列の置換を行う場合の sed
コマンドの一般的な構文:
sed 's/<text_to_replace>/<replacement_text>/' <file_name>
sed
コマンドを使用して、ファイル内の「1」を「3」に置き換えてみましょう。
上記の使用例では、置き換えられた後の内容が表示されるだけで、元のファイルは変更されません。元のファイルに対して変更を行うためには、追加の引数 -i
を用いる必要があります。
sort
sort
コマンドを使用すると、引数として与えられた内容を並び替えることができます。デフォルトでは、昇順に並び替えられます。
並び替える前の内容を確認してみましょう。
次に、sort
コマンドを使用してファイルの内容をソートします。デフォルトでの sort
コマンドは、行を辞書順に並び替えます。
上記の使用例では、置き換えられた後の内容が表示されるだけで、元のファイルは変更されません。
I/O リダイレクション (パイプ)
プログラムによって開かれた各ファイルには、ファイルディスクリプタと呼ばれる識別子が割り当てられます。ファイルディスクリプタは、システムにおいて開かれているファイルの一意な識別子です。また、プログラムは常に stdin (標準入力: キーボード)、stdout (標準出力: 画面)、stderr (標準エラー出力: 画面に出力されるエラーメッセージ) の3つのデフォルトファイルを開きます。これらのファイルは、リダイレクトすることができます。
Everything is a file in linux - https://unix.stackexchange.com/questions/225537/everything-is-a-file
日本語における参考文献:
百日半狂乱 - Linuxターミナル、コマンドtips その3: stdin, stderr, stdout, リダイレクト, パイプ https://doi-t.hatenablog.com/entry/2015/03/29/225239
これまでは、コマンドの全ての出力を標準出力である画面に表示していました。いくつかの特殊な演算子を使用すると、コマンドの出力先をファイルや他のコマンドへとリダイレクトすることができます。 I/O リダイレクトは非常に強力な機能です。
次の例では、>
演算子を使用して、ls
コマンドの出力を output.txt
ファイルにリダイレクトしています。
次の例では、echo
コマンドの出力をファイルにリダイレクトしています。
コマンドの出力を別のコマンドへの入力としてリダイレクトすることもできます。これは、パイプと呼ばれる機能を使用すれば可能です。
次の例では、cat
コマンドの出力をパイプ (|
) 演算子を使用して、grep
コマンドへの入力として渡しています。
In the below example, we have passed the output of cat command as an input to grep command using pipe(|) operator.
次の例では、パイプ (|
) 演算子を使用して、sort
コマンドの出力を uniq
コマンドへ入力として渡しています。uniq
コマンドは、入力からユニーク (一意) な数字のみを出力します。
I/O redirection - https://tldp.org/LDP/abs/html/io-redirection.html
日本語における参考文献:
Riichiro Saito - 入出力の切り換え(I/O redirection) https://flex.phys.tohoku.ac.jp/texi/sh/node6.html