この先、GitやらDockerを学習するわけですが、その前に学習することを避けて通れないのがLinux です。
Linux は技術として枯れているため、一度習得すると長く使える技術だそうです。確かに独学していたときに、
「こちらはLinux に触れたことがある方なら理解しやすのではないでしょうか」的なフレーズを何度か耳にした記憶があります。
そこで、今回はLinux の勘どころとして、確実に抑えなければならないであろうコマンドをまとめました。
Linux コマンドを覚えにくいと思ってましたが、どんな単語の略なのかを理解すると驚くほど覚えやすくなります。
基本コマンド
【pwd 】 今どこで作業しているか知りたい
Linux で作業を行う際には、現在自分がどのディレクト リにいるのかを把握しておかなければいけません。現在、自分がいるディレクト リのことをワーキングディレクト リ(またはカレントディレクト リ)といいます。
pwd コマンドは、p rint w orking d irectoryの略です。
書き方
$ pwd [オプション]
ここで、[ ]に記述する内容は必須ではありません(以下同じ)。
このコマンドを実行することで現在のディレクト リを表示してくれます。
【cd】 別のディレクト リで作業したい
自分がいるディレクト リとは別のディレクト リで作業を行う場合は、ディレクト リを変更する必要があります。
cdコマンドは、c hange d irectoryの略です。
書き方
$ cd [オプション] [ディレクトリ]
cdコマンドで、オプションはあまり使われません。
また、移動先のディレクト リを指定しない場合は、ホームディレクト リ(デフォルトのワーキングディレクト リ)に戻ります。
【ls】 ファイルやディレクト リの一覧が見たい
ワーキングディレクト リあるいは指定したディレクト リには、どのようなファイルやディレクト リが含まれているか一覧を出力するためのコマンドがlsコマンドです。
このlsコマンドはl is tの略です。
書き方
$ ls [オプション] [ディレクトリまたはファイル名]
ディレクト リまたはファイル名を指定しない場合は、現在ワーキングディレクト リ内のファイルやディレクト リの一覧を表示します。
例1:ディレクト リを指定
$ ls /
例2:半角スペースで区切って複数のディレクト リを指定することもできます
$ ls / /dev
便利なワイルドカード
ワイルドカード (* や ?)を使うと任意の文字として扱われるので非常に便利です。
アスタリスク (*) は任意の文字列として扱われます。
例えば、”*.html"なら拡張子.htmlがつくファイル一覧
クエスチョンマーク (?)は 任意の一文字として扱われます。
例えば$ ls /bin/z???
とすると、/binディレクト リ内のzから始まる4文字のファイルを表示します。
オプションについて
lsに続けてオプションを加えることで表示される内容が変わります。
lsコマンドでは、次のようなオプションが主に使われます。
-a:隠しファイル(設定ファイルなど)も含めたすべてのファイルを表示します。
-l:ファイルの詳細情報を表示します。
-F:ファイル種別を表示します。
【mkdir】ディレクト リを作りたい
新しくディレクト リを作成するには、mkdirコマンドを使います。
このmkdirコマンドは、m ak e dir ectoryの略です。
書き方
$ mkdir [オプション] <作成するディレクトリ名>
< > で囲まれた部分の記述は必須ですので省略できません。
この場合、作成するディレクト リ名は必ず記述する必要があります。
また、作成するディレクト リ名に日本語を使用すると文字化けするおそれがあります。
したがって、作成するディレクト リ名は英語で記述します。
オプションについて
-p:深い階層のディレクト リを一度に作成します。
例)$ mkdir -p test/2024/04
オプションを使用しない場合、testディレクト リを作成して、次に test/2024 ディレクト リを作成して、やっと test/2024/04 ディレクト リを作成と手数が多くなります。
※ 存在しないディレクト リの下にディレクト リを作成しようとするとエラーになります。
【rmdir】ディレクト リを削除したい
ディレクト リを削除したい場合には、rmdirコマンドを使います。
このrmdirコマンドは、r em ove dir ectoryの略です。
書き方
$ rmdir <削除するディレクトリ名>
このコマンドは、削除しようとするディレクト リ内に何もない場合のみ実行できるコマンドです。
ディレクト リ内にファイルやディレクト リが存在するとエラーになります。
実は、後述するrmコマンドでもディレクト リの削除は実行できるので、rmdirコマンドの使用頻度はそれほど高くはないのが現状のようです。
しかしながら、rmdirコマンドを使用すれば、「隠しファイルなどがディレクト リ内に残っていることを知らずに削除してしまった」といった事故を未然に防ぐことができます。
個人の好みや開発チームの意向などでrmコマンドと使い分けるのが良いと思います。
【cat】ファイルの中身を見たい
ファイルの中身を確認するためには、catコマンドを使います。
このcatコマンドは、concat enate(連結の意)の略です。
書き方
$ cat [オプション] <ファイル名>
ファイルの中身を表示したいときに使用します。
オプションについて
コマンドの語源のconcatenateは「連結」という意味ですので、元々は複数のファイルの中身を表示するためのものでした。
ファイル名を半角スペースで区切って記述することで、複数のファイルの内容を表示することができます。
【less】 長いファイルの中身をスクロール表示したい
catコマンドでファイルを表示できるようになりましたが、ファイルの中身が長い場合、画面に収まりきりません。私たちがいつもWebサイトを見るように、スクロールしてファイルの中身を確認できたら便利ですよね。
そんなときに使うコマンドがlessコマンドです。
lessコマンドは何かの略ではなく、元々あったmoreと言うコマンドを使いやすくしたこともあって、moreの逆という意味でlessとなったようです。
書き方
$ less [オプション] <ファイル名>
コマンドを実行すると別のウィンドウが開いて、コマンドを待機した状態になります。
スクロール操作と検索のコマンドは以下の表の通りです。
スクロール操作
キー入力
動作
f
or space
一画面下にスクロール
b
一画面上にスクロール
j
1行下にスクロール
k
1行上にスクロール
q
lessコマンドの終了
検索
キー入力
動作
/
+ <文字列>
下方向に向かって検索
?
+ <文字列>
上方向に向かって検索
n
次の検索結果に移動
N
前の検索結果に移動
【tail】 ファイルの末尾の内容を表示させたい
ファイルの末尾の情報が欲しい場面では、tailコマンドを使います。
ファイルの末尾だから、尻尾を意味するtail わかりやすいですね。
書き方
$ tail [オプション] <ファイル名>
オプションで指定しなければファイルの末尾10行の内容が表示されます。
オプションについて
-n [行数]:表示したい行数を指定します。
例)$ tail -n 5 README.md
: README.mdの末尾5行を表示します。
-f:ファイルの内容が書き換えられるとリアルタイムに表示します。
例)$ tail -f output.log
output.logファイルに追記されるたびに追記内容が表示されます。
tailコマンドを終了するには、control
+ c
を入力します。
Linux の運用作業などでログファイルの監視に良く使われる方法のようです。知識の一つとして留めておきましょう。
【touch】 新しくファイルを作りたい
新しくファイルを作るには、touchコマンドを使います。
書き方
$ touch <ファイル名>
ファイルが存在しない場合は、空のファイルを作成します。
一方、ファイルが存在する場合はタイムスタンプを更新します。
touchコマンドは、元々タイムスタンプを更新するいう働きを持っています。したがって、既存のファイル名を指定した場合は、間違って上書きするのを防いでくれるメリットがあります。
このようなことから新しくファイルを作成する場合には、touchコマンドが使われています。
【rm】 不要なファイルを削除したい
不要なファイルを削除するには、rmコマンドを使います。
rmdirコマンドでも触れましたが、rmコマンドでディレクト リの削除を実行することもできます(詳しくは「オプションについて」を参照してください)。
rmコマンドは、r em oveの略です。
書き方
$ rm [オプション] <削除するファイル名>
rmコマンドは実行すると、即時消去されます。実行後は元に戻せないので注意が必要です。
オプションについて
超重要:-rf オプション
オプションで -rf
を指定してコマンドを実行すると、ディレクト リ内のデータ(隠しファイルも含みます)を強制的に跡形もなく消し去ります。もちろん実行後は元に戻すことはできません。
このオプションを使用する場合には、相当の覚悟が必要です。ご注意ください。
【mv】ファイルを移動させたい / リネームしたい
ファイルやディレクト リを別の場所に移動させたり、リネームする場合にはmvコマンドを使用します。
mvコマンドは、m ov eの略です。
書き方
$ mv [オプション] <移動元> <移動先>
ファイルやディレクト リを移動させるかリネームするかは自動で判別されます。
移動元がファイル名の場合
移動先がファイル名ならファイル名を変更します。
移動先がディレクト リの場合、ファイルを移動します。
移動元がディレクト リの場合
オプションについて
【cp】ファイル・ディレクト リをコピペしたい
mvコマンドを使うと別の場所にファイルやディレクト リを移動できましたが、cpコマンドはコピペするためのコマンドです。
cpコマンドはc op yの略です。
書き方
$ cp [オプション] <コピー元> <コピー先>
コピー先に同じ名前のファイルが存在する場合は上書き保存します。
また、ディレクト リに対してコマンドを実行するにはオプションを指定する必要があります。
オプションについて
-i:上書きする前に確認します。
-r:ディレクト リをコピーする場合に使用します。
このオプションを指定せずにディレクト リをコピーするとエラーになります。
一歩先ゆくためのコマンド
【ln】 リンク機能を使いたい
Linux ではファイルに別名をつけることができます。
この別名をつけることを「リンクを張る」といいます。
リンクを張るコマンドがlnコマンドで、l in kの略です。
また、リンクには「ハードリンク」と「シンボリックリンク 」の2種類があり、次のような特徴があります。
ハードリンク
1つのファイルの実体に複数の名前を付ける機能です。
元のファイルを削除しても消えません。
すべてのハードリンクがなくなったときに削除されます。
シンボリックリンク
リンク先のパス名が書かれた特殊ファイルです
リンク先がファイルの実体です(Windows のショートカットと似ています)
シンボリックリンク を削除しても元ファイルは参照できます。
シンボリックリンク を残したままファイルの実体を削除したり、ファイルを移動すると、ファイルを参照できなくなります。あるべき場所にファイルがなくなり、探せなくなるためです。
このことを「リンクが壊れた」といいます。
このようなリンクを張ることで、ファイルをコピーしたり移動したりすることなく別のディレクト リにあるように扱えるようになります。
このリンクを使う利点は次の2つです。
長くて複雑なパス名を省略して、入力ミスを軽減できる
複数バージョンを共存させて、最新バージョンを区別できる
書き方
$ ln [オプション] <リンク元ファイル名> <リンク名>
オプションを指定しないと、ハードリンクになります。
オプションについて
ハードリンクは色々と制約が多いことから、シンボリックリンク を使うことが多いようです。
【find】 条件を指定してファイルを検索したい
その名の通り探す(ファイルを検索する)ためのコマンドです。
書き方
$ find <検索開始ディレクトリ> <検索条件> <アクション>
このコマンドは、検索開始ディレクト リを起点に検索を開始して、検索条件にヒットしたものについて指定したアクションを実行します。
検索条件について
-name:ファイル名の大文字小文字を区別して、ファイルを検索します。
例)$ find . -name README.md -print
-iname:ファイル名の大文字小文字を区別しないで、ファイルを検索します。
例)$ find . -iname readme.md -print
ワイルドカード (* や ?)が使えます。ただし、検索したいファイル名をシングルクォートで囲む必要があります。
例)$ find . -name '*.html' -print
ファイルの種類で検索することもできます。
-type f(通常ファイル)、-type l(シンボリックリンク )、-type d(ディレクト リ)
ファイルのアクセス権限や所有者の変更
Linux は複数人が一台のコンピューターにログインして操作することが前提で作られています。
Linux はサーバーやスーパーコンピューター などに良く使われています。そういった環境では色んな人がログインして使っているため、それぞれが操作できると消しては行けないものを消されたり、勝手に設定を変えられたりする問題がどうしても起きてしまいます。
そのような問題を避けるために、システムの設定は管理者しかできないようになっていたり、ファイルのアクセス権限はユーザー毎に決められています。
このファイルへのアクセス権限のことをパーミッション といいます。
このパーミッション を理解していないと、サーバーで作業して、ファイルへのアクセス権限がなくてエラーが発生した場合に問題解決できずに詰んでしまうことになります。
まずは、何か適当なファイルのパーミッション を確認してみましょう。
確認するには、$ ls -l <ファイル名>
を使用します。
ここでは /bin/cat ファイルのパーミッション を確認してみます。
アクセス権限と所有者
実行結果の1文字目がファイルタイプを表しています。
ファイルタイプの見方は表のとおりです。
ファイルタイプに続く9文字(rwxr-xr-x)をファイルモードといい、このファイルのパーミッション を表しています。
ファイルモードは3文字毎に1つのブロックとなっていて、「所有者」、「グループ」、「その他のユーザー」のパーミッション を表しています。
パーミッション は、「r」、「w」、「x」の3種類で表現されます。
表示
意味(権限)
r
読み取り(r ead)
w
書き込み(w rite)
x
実行(ex ecute )
このことから、 /bin/cat ファイルは
ファイルタイプは通常ファイルである
所有者は、読み取り・書き込み・実行の権限がある(rwx)
グループとその他のユーザーは、読み取り・実行の権限があるが、書き込み権限はない(r-x)
ということがわかります。
【chmod】ファイルへのアクセス権限を変更したい
$ ls -l
コマンドで表示されたファイルモードを変更して、アクセス権限を変更するにはchmodコマンドを使用します。
このchmodコマンドは、ch ange mod eの略です。
chmodコマンドの書き方は、「シンボルモード」と「数値モード」の2通りの方法があります。
書き方(シンボルモード)
$ chmod [ugoa] [+-=] [rwx] <ファイル名>
例)$ chmod u+w test.txt
記号
意味
u
所有者
g
グループ
o
その他のユーザー
a
すべてのユーザー
記号
意味
+
権限を追加する
-
権限を禁止する
=
指定した権限と等しくする
シンボルモードでは、指定したファイルに対して、どのユーザーに対して(u, g, o, a)、どの権限(r, w, x)をどうするか(+, -, =)がわかりやすいようになっています。
このようにシンボルモードによる変更は相対的な方法です。したがって、パーミッション の一部だけを変更したい場合に便利です。
書き方(数値モード)
$ chmod <8進数の数値> <ファイル名>
例)$ chmod 755 test.txt
パーミッション
数値
読み取り(r)
4
書き込み(w)
2
実行(x)
1
数値モードでは、所有者、グループ、その他のユーザーに与える権限を下表の数値に置き換えて、その値を足し合わせた8進数で表します。
この例では、755となっていますが、これはrwx r-x r-x
を表しています。
つまり、所有者はすべて許可されているので、4+2+1=7、グループとその他のユーザーは読み取りと実行が許可されているので、4+1=5ということになります。
このように数値モードでは、元のパーミッション によらず、新しいパーミッション に変更します。
なお、このコマンドを実行できるのは、ファイルの所有者かrootユーザーに限られます。
【chown】 ファイルの所有者を変更したい
先程の$ ls -l
コマンドの実行結果をもう一度見てみます。
アクセス権限と所有者
ここでは、パーミッション の表示の右側に「root」と表示されています。
これが、ファイルの所有者です(右隣はグループ)。
rootユーザーがこのファイルの所有者ということになります。
ファイルの所有者を変更するには、chownコマンドを使います。
chownコマンドは、ch ange own erの略です。
書き方
$ chown <変更後の所有者名> <ファイル名>
なお、このコマンドを実行できるのはrootユーザーだけです。
プロセスの確認と終了
プロセスについて
Linux では、実行中のプログラムのことをプロセスといいます。
コマンドを実行すると、実行ファイルをメモリに格納して、メモリ上でCPUがプログラムを実行します。
一つ実行すると、新しいプロセスが一つ作られることになり、プロセスID(PID)が付与されます。
【ps】動作中のプロセスを確認したい
現在動作しているプロセスを確認するには、psコマンドを使います。
このpsコマンドは、p rocess s tatusの略です。
書き方
$ ps [オプション]
他のコマンドとは違って、psのオプションには、ハイフン(-)を付けません。
最も使うオプションは、aux
で、全ユーザーのプロセスを詳細情報を合わせて表示します。
a:すべてのユーザーのプロセス
u:詳細情報を合わせて表示
x:psコマンドを実行したユーザーのすべてのプロセス
【kill】プロセス(ジョブ)を終了させたい
間違ったコマンドを実行したり、重たい処理を行ったりしてメモリやCPUを専有してしまうことがあります。
メモリやCPUを開放するためにプロセスやジョブを終了させるコマンドが、killコマンドです。
このkillコマンドは、kill processの略です。
ジョブについて
複数のプロセスを同時に処理している場合、そのまとまりのことをジョブといいます。
ジョブの一覧を表示するには、$ jobs
コマンドを実行します。
コマンドを実行して[ ]内に表示される数字をジョブ番号といいます。
ユーザーが対話的に操作しながら処理が実行されているジョブをフォアグラウンド、その逆をバックグラウンドのジョブといいます。
フォアグラウンドのジョブは control
+c
で終了できますが、バックグラウンドのジョブに対しては、killコマンドを使わないと終了できません。
書き方
$ kill [ オプション] <プロセスID>
$ kill [ オプション] %<ジョブ番号>
正確には、killコマンドはシグナルを送信するコマンドです。
$ kill -<シグナル名> <プロセスID>
デフォルトでは、終了を指示するTERMというシグナルを送信しています。
例) $ kill 4965
と$ kill -TERM 4965
この2つのコマンドは同じ意味です。
状況次第ですが、「SIGKILL」という強制終了のシグナルを使うこともあります。
また、シグナルには番号も割り当てられていて、SIGKILLコマンドには9番が割り当てられています。
例えば、PIDが4965のプロセスを強制終了するには、
$ kill -SIGKILL 4965
または $ kill -9 4965
とします。
この SIGKILL は最終手段として、このようなコマンドがあるということを覚えておきましょう。
イメージ的には、PCをシャットダウンせずに電源を切る行為と同じ ですので、無闇矢鱈と使うものではありませんので、ご注意ください。
Linux の基本的な部分を列挙してみましたが、枯れている技術とはいえ学ぶべきことは多いですね。
ただ、Web上にはLinux に関する情報は非常に多くありますので、気になることがあればすぐにググって調べてみるのと良いと思います。
それでは、また!