🦈

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

9 min read 4

はじめに

コロナ下の暇つぶしで始めたプログラミングですが、勉強を初めて2年が経とうとしています。
そして気づけば来春から新卒エンジニア1年目ですが、正直同期のレベル感がわかりません。

興味の湧いた技術を勉強することが多いですが、
社会人になって「こんな基礎もわからないの?」なんて言われたくありません。

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

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

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

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

語句の言い回しや、内容そのものに間違いがある可能性がございます。
なんなりとお申し付けください。

黒い画面の正体

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

ターミナル

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

コンソール

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

シェル

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のログインってどうするんだっけ…)

これまで
mysql ログイン方法 検索

現在
> history | grep mysql (このコマンドや!)
![履歴番号] (実行)
mysql 「ようこそ😊」


こんな些細な変化です。

ただ、これもチリツモだと思っています。
また、理解が増したことでターミナル操への障壁が低くなった気もします。

文字に起こして整理することで、
記憶への定着と知識の再認識、自信にも繋がっていいこと尽くしですね。

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

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

Discussion

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

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

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

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

ログインするとコメントできます