terminalの画像

pubDate: 2024-03-04

author: sakakibara

linux

コマンド

linxuの基本コマンド

linuxにはPOSIXに準拠してるコマンドを中心に様々なコマンドがある。 その中でもかなり使用頻度が高いと思われるものが以下だ。
manを読めば良くない?
そういう意見もあるだろう。 だが、基礎的の中でも以外と見落としがちなオプションもあると思う。 そういった以外なオプションも併せて紹介していこうと思う。

cd : change directory

ディレクトリを移動する。

cd
cd -
cd [-L|-P] [directory]

世界でもっともタイプされた2文字だと思う。

commanddescription
cd -直前にいたディレクトリに移動する。直前にいたディレクトリはOLDPWDという環境変数に格納される。
cd -L directorydirecotyがシンボリックリンクの場合、実態に移動する。
cd -P directorydirecotyがシンボリックリンクの場合、そのディレクトリへ移動する。

cd -を知らない人は以外といるのではないだろうか? 少し違うが、popd, pushdというコマンドがある。 これは移動したディレクトリをスタックに貯めるというものである。 昔このコマンドを使おうと考えていた時期があったが、実際、4文字のコマンドを打つ苦痛がやる気を上回り、使うことをやめてしまった。

pwd : print working directory

作業ディレクトリを表示する。

pwd
pwd [option]

いまどこ? カレントディレクトリ・作業ディレクトリをprintする。

commanddescription
pwd -L環境変数PWDを使用する。
pwd -Pシンボリックリンクを除く。

PWDはカレントディレクトリのパスが格納された環境変数である。
ディレクトリA, B, C, Dがあるとする。Cの下にDがあり、そのファイルにシンボリックリンクEが貼られているとする。

Terminal window
A
├── B
├── C
│   └── D
└── E -> C/D

この場合Eを経由してCへ移動するとする。その場合のPWD(pwd)は

A/E

となる。 ここでpwd -Pとすると、

A/C/D

となる。

ls : list

ファイル・ディレクトリの要素を表示する。

ls
ls [options] [file]

世界でもっともタイプされた2文字だと思う。 オプションが多すぎる。lsを読まなければプログラマを名乗るべきではないという考えがある。実は以外と実装するのが難しいコマンドとしても知られている。

commanddescription
ls -aall、つまりすべて表示する。隠しファイルも表示する。
ls -llong, 多くの情報を表示する
ls --hideパターンマッチしたファイルは表示しない。

オプションが多すぎてすべてを追うのは難しい。この2つをよく利用する。とは言っても、オプションを指定しているわけではなく、linuxディストリビューションによってはla=ls -a, ll=ls -lのようにaliasが指定されてある。なお、--colorというオプション もあり、これを指定することで色がつき、テンションが上がる。

mkdir : make directory

ディレクトリを作成する。

mkdir
mkdir [option] directory

意外と-pコマンドを使用する。

commanddescription
mkdir -p directory作成したいディレクトリの親のディレクトリが存在しなければ作成する。
mkdir -m directory作成と同時にfile modeを設定する。

rmdir : remove direcotry

ディレクトリを削除する。空ならね。

rmdir
rmdir [option] directory

じつはこれに近いコマンドがMS-DOSにも実装されている。

commanddescription
rmdir -p親のディレクトリまで削除します。rmdir -p a/brmdir a/b aと同じ

実際にはディレクトリの中にファイルが入っているまま削除する場合が多いため、このコマンドはほとんど使用しない。
本当は中身を削除して、ディレクトリが空であることを確認した上でrmdirで削除したほうが安全なのかもしれない。

cat : concatenate files

ファイルを連結する。

cat
cat [option] [file]

おや?と思った方も多いだろう。 catコマンドというとファイルの中身を見るコマンドとして知られるからだ。

commanddescription
cat -n file1 file2ファイルを繋げて行番号を表示する
cat -b file1 file2ファイルを繋げて行番号を表示する(空行以外)
cat -E file1 file2ファイルを繋げて行末文字を表示する
cat -catの入力として標準入力を使う

このコマンドの本質は引数を与えられた複数のファイルを結合して標準出力に流すことにある。 ファイルの中身を見るという使い方は目的のファイルと0個のファイルを結合して標準出力に流すという処理に相当する。

この他に重要な使い方としてヒアドキュメントを利用した書き方がある。

cat
cat - << EOF > file
> Alice was beginning to get very tired of sitting by her sister
> on the bank, and of having nothing to do: once or twice she had
> peeped into the book her sister was reading, but it had no
> pictures or conversations in it, `and what is the use of a book,'
> thought Alice `without pictures or conversation?'
> EOF

指定した文字(EOF)が出てくるまでを入力とする書き方でshell scriptの中などで意外と使用される。

more : more display

もっと表示する。

more
more [option] file
commanddescription
more -p filemoreしたあとにスクリーントップまでスクロールします。
more -n number filen字行頭から表示します

次のlessが優秀過ぎて完全に下位互換です。

less : opposite more

moreとは違う。

less
less [option]
commanddescription
less -N file行番号を表示
less -X filelessで表示した内容をターミナルに残す。

moreとは異なり、後ろに戻ることができる。また、moreとはことなり、一度にすべて読み込んでいるわけではないので大きなファイルを開く際に有効。そして何よりvi likeなキーバインドで操作できるのでvi like キーバインドに慣れている人にとってはかなり使いやすい。
特に、砂漠のような環境では必ずしもターミナルがスクロールできるとは限らない。 そもそもスクロールという概念がGUIシステムがなければ成り立たないものだからだ。 そんなとき、lessコマンドがデフォルトで入っていることに深く感謝する日がくるだろう。 そして、ちょっとしたファイルを開くのにVScodeなどを使用していた過去の自分に後悔するのだ。 less..お前がいたのにな。ずっと傍で見守っててくれたんだな。と。

tail : dispaly last file

ファイルの尻尾だけ見せる。

tail
tail [option] [file]
commanddescription
tail -n 10 fileファイルの末尾20行を表示する。
tail -f file増えていくファイルを追跡(follow)表示する。

tail意外にもheadというコマンドがある。 tailと同じコマンドで効果は逆となる。

特にtail -f fileが面白い。 指定したファイルが書き込まれるとそれを追跡して表示してくれる。
どうもログを追跡表示する際に使用するらいしい。

touch : update timestamp

タイムスタンプを更新する。

touch
touch [option] file

え、このコマンドって空のファイルを作るコマンドじゃないんですか? そう思った人も多いだろう。

commanddescription
touch -a fileアクセス時刻を変更する。
touch -m file更新時刻を変更する。

昔、恩師からアクセス時刻や更新時刻を変更するということを教えてもらった。 そもそもファイルのアクセス時刻や更新時刻とはなんだろうか。 ファイルには以下のタイムスタンプがある。

timestampmeandescription
atimeaccessファイルを読み込んだ際に更新される。 ctimeの更新でも更新される。
ctimechangeファイルの内容を変更した際に更新される。 mtimeの更新でも更新される。
mtimemodifyファイルの内容を変更した際に更新される。

rm : remove file or directory

ファイル or ディレクトリを削除する。

rm
rm [option] [file]
commanddescription
rm -r file再帰的に削除する。つまり、中にディレクトリがあろうが削除する。
rm -f file強制的に削除する。問答無用

世の中に絶望し、自暴自棄になっていた俺はrm -rfを使うことになんの躊躇いもなかった。
ある日、何かの間違いで’~‘というファイル名のファイルを作ってしまった。

“チッ、舐めたツラしたファイルだな。消してやる。“

俺はホームレスになっていた。

mv : move file

ファイルを移動(名前の変更)をする。

mv
man [option] source dest
commanddescription
mv -f source dest同じ名前のファイルがあっても強制的に移動させる。
mv -S=hoge source dest同じ名前のファイルあったら末尾に文字列(hoge)を追加する。
mv -b=never source dest同じ名前のファイルがあったらバックアップ(~)を指定する

基礎的なコマンドほど実力が問われる。

ここで取り上げたコマンドは基本的に同じコマンドがあった際にどのように振る舞うかだ。 いちいち他の名前にしたディレクトリを作成してからmvをするのでは手間がかかる。 そこで、上記のようなコマンドを使用する。 基本的にalias mv=mv --backup=neverのようにエイリアスを指定して使用する。

また、たまにスクリプトで見かけるのがブレース展開である。12 簡単に言ってしまえばカッコ{}を外延的に展開する。
そして展開した文字列には分配法則のような規則が適応される。
まぁ、そんな感じ。

mv
mv hoge{,.suffix}

この場合hoge.suffixというファイルが生成される。

cp : copy file or direcotry

ファイルをコピーする。

cp
cp [option] source dest

mvと似たようなコマンド(—backup, -S, -f)も一応ある。

commanddescription
cp -r source dest再帰的にコピーする。
cp -a source destアクセス権も含めて再帰的にコピーする。
cp -s source destシンボリックリンクを作成する。

最後のコマンドを見て、嘘だろ。lnの立場なくなるやんけ。と思った方もいるだろう。 ここで作成したシンボリックリンクはカレントディレクトリに作成される。

リンクを作成する。

ln
ln [option] target link_name

linuxはファイル・ディレクトリ・リンクの3つの原子で構成されている。
というかそもそもファイルって何?
我々調査隊はファイルシステムの奥地 へと向かった…

commanddescription
ln -s target link_nameシンボリックリンクを貼る
ln -f target link_name既にリンクがあったら削除する。

引数を特に使用しないならハードリンクになる。 とはいってもあまりハードリンクを使用したことがない。

find : find file

ファイルを探す。

find
find [option] [starting-point(path)...] [expression]

これもオプションが多い。unixの哲学はどうした。kissはどうした。

commanddescription
find path -maxdepth 2 -name 'file_name_reg'最大深さ2でpathからスタートしてfile_name_regでマッチするファイルを探しパスを表示する。
find path -mindepth 3 -path 'path_name_reg'最小深さ3でpathからスタートしてpath_name_regでマッチするパスを探してパスを表示する。
find path -type f -path 'path_name_reg' -printfpathからpath_name_regにマッチするパスを探し、ファイルを集め、表示する。

findコマンドのexpressionにワイルドカードなどを使用する場合はシングルクォート(ダブルクオート)で囲む必要がある。shellが展開してしまい複数のexpressionが渡されてしまうためである。 たとえば、

Terminal window
find . -name *.txt

だと、実質

Terminal window
find . -name a.txt b.txt c.txt

のようにfindコマンドを呼び出していることと同じになる。

findコマンドはtypeオプションを使用することでファイルの種類を指定することができる。これはファイルやディレクトリ以外にもブロックファイルやキャラクタファイル, ソケットなども指定することができる。 また、-printfオプションのようにファイルを実行することができる。 -exec rmのようにするとfind見つけたファイルを削除することができる。

chmod : change mode

mode を変更する。

chmod
chmod [option] [mode] file

chmodコマンドはファイルの権限を変更するコマンドである。 ファイルにはアクセス権限という概念があり、だれがそのファイルにアクセスできるかを制御することができる。 どのアクセス権限が設定されているかはls -lコマンドで確認することができる。

Terminal window
drwxr-xr-x 2 sakakibara sakakibara 4096 Mar 4 18:31 B
drwxr-xr-x 3 sakakibara sakakibara 4096 Mar 4 18:35 C
lrwxrwxrwx 1 sakakibara sakakibara 3 Mar 4 18:35 E -> C/D

上記の例で、Bというディレクトリはユーザーsakakibaraが所有しており、グループsakakibaraに属している。

drwxr-xr-x

rwxが3つあるが、それぞれ前からユーザ(ファイルの所有者)、グループ、その他に関するアクセス権限を表す。 ファイルBはsakakibaraは読み書き実行ができ、sakakibaraに属しているユーザは読み込みと実行ができるが書き込みはできない。 その他のユーザーは実行しかできない。 ということを表している。

777とはユーザ、グループ、その他それぞれのrwxを8進数で表した数である。 それぞれ次のように対応している。

例えば、ユーザーが読み書き実行が可能ならば 4+2+1=74 + 2 + 1 = 7 となり、 グループが読み込みと実行が可能ならば 4+0+1=54 + 0 + 1 = 5 その他のグループは何もできないならば 0+0+0=00 + 0 + 0 = 0 となり、750となる。

chown : change ownership

ownershipを変更する。

chown
chown [option] [owner]:[group] file
commanddescription
chown user:group fileユーザーとグループを変更する。
chown -R user:group file再帰的にユーザーとグループを変更する。

ファイルの所有者がどのユーザーか、どのグループかを変更するコマンドである。 たとえば、ls -l

drwxr-xr-x 2 sakakibara sakakibara 4096 Mar 4 18:31 B
drwxr-xr-x 3 sakakibara sakakibara 4096 Mar 4 18:35 C
lrwxrwxrwx 1 sakakibara sakakibara 3 Mar 4 18:35 E -> C/D

であるならば、chow root:root BとすることでBの所有者をrootに変更することができる。

drwxr-xr-x 2 root root 4096 Mar 4 18:31 B
drwxr-xr-x 3 sakakibara sakakibara 4096 Mar 4 18:35 C
lrwxrwxrwx 1 sakakibara sakakibara 3 Mar 4 18:35 E -> C/D

ps : show processes

プロセスを見る。

ps
ps [optinos]

プロセスを見るコマンドである。 次のコマンドと合わせて使用することが多い。 なぜか制御端末があるプロセスかどうかについての情報が多い。

commanddescription
ps -A全てのプロセスを表示する。
ps a制御端末を持つプロセスを表示する。
ps x制御端末を持たないプロセスを表示する。
ps uプロセスのユーザーも含め表示する。
ps -C zshコマンド名でプロセスを表示する。

ps auxのようにするとより詳細な情報を表示することができる。

kill : kill jobs

ジョブを殺す。

kill
kill [-signal] pid|name
commanddescription
kill pidpidのプロセスを消す。kill -s TERM pidと同じ
kill -lシグナルの一覧を表示する。
kill -l SIGNALシグナルの番号を表示する。
kill -s SIGNAL pidシグナルを指定してプロセスに送る。
kill $jobジョブを消す。

ジョブはシェルによって管理されるプロセスの集まりである。 コマンドによって生じる複数のプロセス群をまとめて管理するために使用される。これによって単一のコマンド(だが、複数のプロセスを生成する)ものを一つのものとして(ジョブとして)管理することができる。

[番外編] 知っておいたほうがよいコマンド

zgrep

圧縮ファイルに対するgrep

zgrep
zgrep [option] [-e] pattern filename

オプションはgrepで使用されているものを引き継ぎます。

[番外編] コマンド・メタ

man & whatis & apropose

このコマンドって何?

whatis & apropose
whatis -w "*ls*"
apropos user

[番外編] おもしろコマンド

pv

パイプ先の処理時間を表示する

at

指定した時刻にプログラムを走らせる

export

変数を環境変数に出荷する おまえ、コマンドだったのか。シンタックスだと思ってた。

script

tmpwatch

tee

watch

yes

sar

taskset

readelf

file

pstree

nohup

disown

strings

参考

Footnotes

  1. zshのブレース展開

  2. zshのブレース展開解説