🐚

最低限知っておこう +α なLinuxコマンド

2021/11/28に公開
4

はじめに

コロナ下の暇つぶしで始めたプログラミングですが、勉強をはじめて 2 年が経とうとしています。
気づけば来春から新卒エンジニアで、同期のレベルが気になったりもします。

興味の湧いたキラキラした技術を学習する一方で、
基礎が定着していないことを指摘され「こんなこともわからないの?」
と言われてしまうのは避けたいところです。

エンジニアとして働くにあたって、先端のプログラミング言語だけではなく、
基礎から改めて学び直すことで堅実な土台を形成したいと思います。

今回学習するテーマについては roadmap.sh を参考に、
普段からよく使う Linux コマンドについてまとめました。

catとかpskillは使っていても、
lessps aux | grep 〇〇killkill -9の違いといった、

たまに見かけるけど、たぶん正しくは理解していないと思うものの中で、
覚えておいたら便利だなと感じたものをピックアップしています。

黒い画面の正体

日常的になんとなく使用していたターミナルコンソールシェル
という言葉についてきちんと理解したい。

ターミナル - Terminal

単語の意味としては、「端末」を表す(Terminal)。
UNIXと接続する端末装置が由来で、現在では仮想化されたソフトウェアとなって利用されています。つまりGUI上でCUIの操作を行うことができるアプリケーションであり、ターミナルから直接命令を実行しているわけではないということ。

コンソール - Console

コンピュータ本体と直結されており制御を行うための装置となる。(?)
この説明を聞いて直感的にキーボードが思い浮かびましたが、本来の意味ではキーボードもコンソールの 1 つなのだそう。デバイスの進化などから現代では意味が変わってきており、コマンド入力ができる黒い画面を指すことが多い。

シェル - Shell

OS のカーネル(核)に命令を伝えてくれるプログラムの一種で、ユーザーとカーネルとの間のお伺いを立てる仲介役的存在です。
ターミナルやコンソールから入力されたコマンドを解釈してカーネルに処理を依頼し、その結果やメッセージなどを画面に表示するのがこちらの役割。

そして、ただ単にカーネルに入力指示を伝えるだけでなく、さまざまな機能を詰め込み入力を便利にしていった過程でbashzshが生まれました。

結局なに?

どれも本質的な意味はすべて異なりますが、「ローカルの 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

説明を日本語化してさらに使いやすくしています。

参考:man コマンドの表示を日本語化した話

text 操作関連

ファイルの記述内容や、ある文字列を含むファイルを表示させたりするコマンドです。

tailgrepは個人的に使う機会が多いのですが、単体で使うことはあまりありません。
後述するパイプ(|)や他のコマンドとの組み合わせ使用することが多いです。

コマンド名 操作内容
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 を設定する方法

  1. vi ~/.zshrc (.bash_profile)でファイルを開く
  2. 以下使用例を参考にaliasを記述する
  3. 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

参考:【Linux】エイリアスの設定方法
:::

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を数値でオプションとして指定することを意味します。

オプションを指定しないデフォルトでは、内部的に数値-15TERM
つまりプロセスの終了(Terminate)を命令しています。

他にもシグナルはいくつかありますが、ここでは紹介する必要はないものがほとんどでした。
気になる方は、kill -lによって使用可能なシグナルと数値を教えてくます。

最後に

今回の「最低限知っておこう +α な Linux コマンド」ですが、
調べてみることによってこれまであった何気ないストレスが減りました。

(mysql のログインってどうするんだっけ…)
これまで
Google: mysql ログイン方法

現在
$ history | grep mysql(このコマンドや!)
![履歴番号]
mysql 「ようこそ😊」
みたいな、些細なものです。
ただ、これもチリツモだと思っています。

今後も roadmap.sh に沿って学習を進め、
Zenn にまとめたいと思います。

一緒に学習を進めていきましょう。
いいねフォローよろしくお願いします!

GitHubで編集を提案

Discussion

mildcoffeemildcoffee

アクセス権についてrとwの説明が逆になっています

futofuto

修正いたしました!
ご指摘ありがとうございます🙇‍♂️

i774i774

ttyを実行して出てきたものが何か調べたほうが、ちゃんとした理解ができる気がします。
そしてinfoを使いましょう。

futofuto

tty, infoどちらも存じ上げませんでした。
これらについて新たに勉強し、追記したいと思います。
ご指摘ありがとうございました!