最低限知っておこう +α なLinuxコマンド
はじめに
コロナ下の暇つぶしで始めたプログラミングですが、勉強をはじめて 2 年が経とうとしています。
気づけば来春から新卒エンジニアで、同期のレベルが気になったりもします。
興味の湧いたキラキラした技術を学習する一方で、
基礎が定着していないことを指摘され「こんなこともわからないの?」
と言われてしまうのは避けたいところです。
エンジニアとして働くにあたって、先端のプログラミング言語だけではなく、
基礎から改めて学び直すことで堅実な土台を形成したいと思います。
今回学習するテーマについては roadmap.sh を参考に、
普段からよく使う Linux コマンドについてまとめました。
cat
とかps
、kill
は使っていても、
less
、ps aux | grep 〇〇
、kill
とkill -9
の違いといった、
たまに見かけるけど、たぶん正しくは理解していないと思うものの中で、
覚えておいたら便利だなと感じたものをピックアップしています。
黒い画面の正体
日常的になんとなく使用していたターミナル
、コンソール
、シェル
という言葉についてきちんと理解したい。
ターミナル - Terminal
単語の意味としては、「端末」を表す(Terminal)。
UNIX
と接続する端末装置が由来で、現在では仮想化されたソフトウェアとなって利用されています。つまりGUI
上でCUI
の操作を行うことができるアプリケーションであり、ターミナルから直接命令を実行しているわけではないということ。
コンソール - Console
コンピュータ本体と直結されており制御を行うための装置となる。(?)
この説明を聞いて直感的にキーボードが思い浮かびましたが、本来の意味ではキーボードもコンソールの 1 つなのだそう。デバイスの進化などから現代では意味が変わってきており、コマンド入力ができる黒い画面を指すことが多い。
シェル - Shell
OS のカーネル(核)に命令を伝えてくれるプログラムの一種で、ユーザーとカーネルとの間のお伺いを立てる仲介役的存在です。
ターミナルやコンソールから入力されたコマンドを解釈してカーネルに処理を依頼し、その結果やメッセージなどを画面に表示するのがこちらの役割。
そして、ただ単にカーネルに入力指示を伝えるだけでなく、さまざまな機能を詰め込み入力を便利にしていった過程でbash
やzsh
が生まれました。
結局なに?
どれも本質的な意味はすべて異なりますが、「ローカルの OS に対してコマンドを入力する」という点においてはどの呼び方でも問題ないように感じます。
「それコンソールじゃなくてターミナルね」なんて言っていたら窓際社員待ったなしです。
前置きが長くなりましたが、以下、「最低限知っておきたい Linux コマンド +α」の紹介です。
man
困ったときのman
。
ほとんどのコマンドのマニュアルを参照できます。
ハンズオンの記事を読んでいて、「そのコマンド、オプション多すぎん?一個一個説明してよ…。」と感じたことありますよね。
man
コマンドはちゃんと引数まで説明をくれます。
$ man コマンド名 // コマンド名のマニュアルを表示
使用例
$ man ls
NAME
ls – list directory contents
SYNOPSIS
ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when] [-D format] [file ...]
DESCRIPTION
For each operand that names a file of a type other than directory, ls displays its name as well as any requested, associated information. For each operand that names a file of type dir...
tips
説明を日本語化してさらに使いやすくしています。
text 操作関連
ファイルの記述内容や、ある文字列を含むファイルを表示させたりするコマンドです。
tail
やgrep
は個人的に使う機会が多いのですが、単体で使うことはあまりありません。
後述するパイプ(|)や他のコマンドとの組み合わせ使用することが多いです。
コマンド名 | 操作内容 |
---|---|
cat | ファイル内容の表示 |
less | ファイル内容を一画面に表示、上下矢印キーによるスクロールも可能 |
_ | _ |
head | ファイル内容の先頭 10 行を表示 |
head -5 | ファイル内容の先頭 5 行を表示 |
tail | ファイル内容の末尾 10 行を表示 |
tail -5 | ファイル内容の末尾 5 行を表示 |
_ | _ |
grep | ファイル内容から文字列を検索 |
grep -i | 大文字と小文字を区別せず検索 |
grep -v | 一致しないものを検索 |
grep -n | 検索結果に行番号も表示 |
grep -l | 検索結果にファイル名のみ表示 |
grep -r | 指定したディレクトリ以下すべての階層から検索 |
grep -L | 文字列を含まないファイルを表示 |
_ | _ |
find | grep と違い、ファイルやディレクトリについて、ファイルタイプ、日付、タイムスタンプ、ファイルサイズ、所有者などで検索 |
_ | _ |
diff | ファイルを比較し、差分を確認 |
使用例
$ head -3 sample.html test.html //半角空白によりファイルを複数指定できる
$ head -3 *.html //ワイルドカードを用いることも可能
==> sample.html <==
<div>
<div>
<p>
==> test.html <==
test
test
test
$ tail -f debug.log
// -fオプションで監視し続けることが可能
$ grep -lr php // カレントディレクトリ以下において、 "php" の文字を含むファイルをファイル名のみで表示
./php/functions.php
./php/wp-config.php
./php/content-single.php
./php/content-none.php
$ diff diff1.html diff2.html > diff.html
// "diff1.html" と "diff2.html" の記述内容を比較し、差分を "diff.html" に出力
偶に見かけるps | grep ...
とかの縦棒「|」、あれなに?
「|」は「パイプ」と言い、パイプ前の出力結果を、
パイプ後のコマンドに渡す橋渡し役となるコマンドです。
たとえば以下コマンドでは、ps aux
というプロセスを確認するコマンドを使用した結果をgrep mysql
として、mysql
のプロセスのみを表示させています。
$ ps aux | grep mysql
7ofu 48311 0.0 0.0 34165624 2948 s000 S+ 9:20PM 0:00.03 mysql -u root -px
alias
コマンドを別名として設定できます。
正直紹介するか悩むレベルで普段使用することはないのですが、意外と環境によって勝手に alias が登録されていることがありますので、気づきを得てもらうという目的も含め紹介します。
私の場合新しく alias を登録するためにコマンドを使用することは少なく、過去に記事等で alias を大量に登録してしまい、その確認で$ alias
として参照する程度です。
$ alias [別名]='[本来の名前]'
上記の方法では、一時的に alias を登録しているだけで、再起動等でリセットされます。
永続的に登録しておくためには、ログインシェルの設定ファイルに記述する必要があります。
永続的に alias を設定する方法
-
vi ~/.zshrc (.bash_profile)
でファイルを開く - 以下使用例を参考に
alias
を記述する -
source ~/.zshrc
で変更を反映
使用例
$ alias // 設定した alias の一覧を表示
-='cd -'
...=../..
....=../../..
-省略-
$ alias g='git' // コマンド "git" を "g" という alias として設定
$ g status
fatal: not a git repository (or any of the parent directories): .git
history
コマンド履歴の内容や使用した日時の確認に加え、履歴をファイルに書き込んだり、ファイルからコマンドを読み込むことができます。
Rails アプリの自動デプロイや、コンテナ環境での作業の際に少しお世話になった記憶があります。
$ history // コマンドの履歴を表示
使用例
$ history -5 // 直近5つのコマンドの表示
3213 2021-11-27 16:10 history 3000
3214 2021-11-27 16:10 history
3215 2021-11-27 16:15 history -r his.txt
3216 2021-11-27 16:25 ls
3217 2021-11-27 16:26 history tail -5
$ history | grep chmod // これまでに使用した "chmod" を表示
1273 2021-08-16 15:33 sudo chmod 777 /var/lib/mysql/mysql.sock
2017 2021-08-16 15:33 chmod +x deploy.sh
$ history -w [ファイル名]
// 記録されているコマンド履歴をファイルに書き込む
$ history -r [ファイル名]
// ファイルに書き込まれているコマンド履歴を端末に読み込む
tips
- コマンドの履歴は
~/.zsh_history (bash_history)
から確認できます。 -
![履歴番号]
で、history
で確認した履歴のコマンドを実行でき、
↑↓
(前後のコマンド)!!
(直前のコマンド)と使い分けることで入力効率が上がります。
change ( chmod, chown, chgrp )
ファイル(ディレクトリ)の permission の変更や、ファイルの所有者の変更ができます。
Permission denied.
というエラーが出た際に利用する場面が思い浮かびます。
$ chmod [permission] [ファイル|ディレクトリ]
$ chown [所有者|所有者:グループ] [ファイル|ディレクトリ]
$ chgrp [グループ] [ファイル|ディレクトリ]
使用例
$ chmod 777 sample.txt
// (change mode) アクセス権の変更
// 数字については後述
$ chmod -R 777 sample
// ディレクトリごと permission を変更
$ chown root sample.txt
// (change owner) 所有者の変更
$ chgrp staff sample.txt
// (change group) グループの変更
tips
permission
(アクセス権)について
ホームディレクトリで$ ls -l(長いフォーマットで表示する)
を実行すると以下のように出力されます。
$ ls -l
drwx------@ 6 7ofu staff 192 7 12 17:26 Applications
-rwxr-xr-- 1 7ofu staff 0 11 28 15:02 sample.txt
lrwx------ 1 7ofu staff 20 11 26 12:31 sample@gmail.com - Google Drive...
この先頭のdrwx------
や-rwxr-xr--
が permission の正体です。
以下の表を参照することで、コマンドの意味、
ファイル(ディレクトリ)のアクセス権や所有者、グループが理解できます。
記号 | 意味 | 数字 |
---|---|---|
1 文字目 | ファイル種別 | |
d | ディレクトリ | |
- | ファイル | |
l | シンボリックリンク | |
_ | _ | _ |
2~4 文字目 | 所有者 | |
5~7 文字目 | グループ | |
8~10 文字目 | その他 | |
r | 読み取り権限 | 4 |
w | 書き込み権限 | 2 |
x | 実行権限 | 1 |
つまり-rwxr-xr--
は、
この「ファイル」について、
所有者は「すべて」の権限を持ち、
グループは「読み取りと実行」の権限を持ち、
それ以外は「読み取り」の権限を持つことを意味します。
また表の数字
に関しては、上記の数字を使った permission の変更の際に使用でき、
数字の合計所有者から順に記述します。
761
= rwxrw---x
ps
動作しているプロセス(処理)を表示するコマンドです。
ps aux | grep mysql
を何回も実行した記憶が、、、。
$ ps // 現在動作しているプロセスを表示
使用例
$ ps a
PID TT STAT TIME COMMAND
2264 s000 Ss 0:00.02 login -fp 7ofu
2265 s000 S+ 0:07.14 -zsh
$ ps au
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
7ofu 41974 0.9 0.0 34190040 6036 s001 S 2:51PM 0:05.17 -zsh
root 46907 0.0 0.0 34123416 1212 s001 R+ 8:27PM 0:00.00 ps au
$ ps aul
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND UID PPID CPU PRI NI WCHAN
7ofu 41974 0.6 0.0 34190040 6036 s001 S 2:51PM 0:05.50 -zsh 501 41973 0 31 0 -
root 47123 0.0 0.0 34133660 1284 s001 R+ 8:34PM 0:00.00 ps aul 0 41974 0 31 0 -
$ ps aux | grep mysql // とりあえず mysql についてのプロセス情報全部表示
7ofu 750 0.0 0.0 34571108 ...
7ofu 635 0.0 0.0 34144736 ...
tips
オプション一覧
文字 | 内容 |
---|---|
a | 自分以外のユーザー名についても表示 |
u | ユーザー名や CPU 利用率など表示 |
x | 制御端末のないプロセスも表示 |
r | 実行中のプロセスのみ表示 |
h | ヘッダーを非表示 |
l | プロセス状態等詳細を表示 |
f | プロセスの階層表示 |
e | 実行コマンド名と環境変数も表示 |
ps とよく一緒に使う kill
kill
は、指定したプロセス ID のプロセスを終了するコマンドです。
ps
で PID を確認し、 kill でプロセスを終了という流れはもはやセット。
$ kill [プロセスID]
よく見かける、 kill -9 とは?
解決方法の記事の中で、「kill -9 [プロセスID]
で強制終了しましょう。」とかよく見かけますし、実際よくわからず使っていました。
kill [プロセスID]
と何が違うのでしょう?
-9
は、シグナルという複数ある命令の内、「プロセスの強制終了」を意味するKILL
を数値でオプションとして指定することを意味します。
オプションを指定しないデフォルトでは、内部的に数値-15
のTERM
、
つまりプロセスの終了(Terminate)を命令しています。
他にもシグナルはいくつかありますが、ここでは紹介する必要はないものがほとんどでした。
気になる方は、kill -l
によって使用可能なシグナルと数値を教えてくます。
最後に
今回の「最低限知っておこう +α な Linux コマンド」ですが、
調べてみることによってこれまであった何気ないストレスが減りました。
(mysql のログインってどうするんだっけ…)
これまで
Google: mysql ログイン方法
現在
$ history | grep mysql
(このコマンドや!)
![履歴番号]
mysql 「ようこそ😊」
みたいな、些細なものです。
ただ、これもチリツモだと思っています。
今後も roadmap.sh に沿って学習を進め、
Zenn にまとめたいと思います。
一緒に学習を進めていきましょう。
いいね・フォローよろしくお願いします!
Discussion
アクセス権についてrとwの説明が逆になっています
修正いたしました!
ご指摘ありがとうございます🙇♂️
ttyを実行して出てきたものが何か調べたほうが、ちゃんとした理解ができる気がします。
そしてinfoを使いましょう。
tty, infoどちらも存じ上げませんでした。
これらについて新たに勉強し、追記したいと思います。
ご指摘ありがとうございました!