Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション8: 標準入出力(リダイレクトとパイプ)の活用で知らなかったことをざっくりまとめてみた

目次

標準入出力(stdio)とは

標準入出力(stdio)とは、 標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)の3つをまとめたものです。

(※)stdioはstandard input outputの略です。

標準入力(stdin)

標準入力とは、プログラムの標準的な入力のことです。キーボードやファイルなどが使われます。

標準出力(stdout)

標準出力とは、プログラムの標準的な出力のことです。ディスプレイやファイルなどが使われます。

標準エラー出力(stderr)

標準エラー出力とは、プログラムのエラーメッセージを出力するためのものです。標準出力と同じく、ディスプレイやファイルなどが使われます。

コマンドは単に標準入力から流れてきた入力を受け取って、コマンドでその入力を処理して、標準入力 or 標準エラー出力に出力します。

標準入出力におけるリダイレクトとは

標準入出力におけるリダイレクトとは、 コマンドの標準入出力を切り替えることです。

標準出力をディスプレイからファイルに切り替えてみる

標準出力をディスプレイからファイルに切り替える場合、>を使用します。

[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb  typescript
[ec2-user@ip-10-0-10-10 repos]$ ls > ls.txt
[ec2-user@ip-10-0-10-10 repos]$ ls
ls.txt  rails  react  react-1  sample.rb  typescript
[ec2-user@ip-10-0-10-10 repos]$ cat ls.txt
ls.txt
rails
react
react-1
sample.rb
typescript

(※) 標準入力を変更(リダイレクト)したい場合、<を使用します。標準エラー出力を切り替える場合、2> を使用します。

cat < /etc/crontab

リダイレクトの書き方

リダイレクトの書き方は、><2> 以外にもあります。 >は指定したファイルが存在しない場合、ファイルを新規作成してそこに出力します。ファイルが既に存在している場合、ファイルの内容を全て上書きしてしまうので、そのような場合は >> を使って ファイルの末尾に追記するようにします。

記号 意味
< file 標準入力をfileに変更
> file 標準出力をfileに変更
2> file 標準エラー出力をfileに変更
>> file 標準出力の出力をfileの末尾に追記
2 >> file 標準エラー出力の出力をfileの末尾に追記
> file 2 > &1 標準出力と標準エラー出力をfileに変更
[ec2-user@ip-10-0-10-10 repos]$ cat sample.rb > ruby.txt
[ec2-user@ip-10-0-10-10 repos]$ ls
ls.txt  rails  react  react-1  ruby.txt  sample.rb  typescript
[ec2-user@ip-10-0-10-10 repos]$ cat ruby.txt
a = 5

puts a
[ec2-user@ip-10-0-10-10 repos]$ cat sample.rb >> ruby.txt
[ec2-user@ip-10-0-10-10 repos]$ cat ruby.txt
a = 5

puts a
a = 5

puts a

パイプラインとは

パイプラインとは、 あるコマンドの標準出力を、別のコマンドの標準入力につなげる機能のことです。 | を使用します。あるコマンドの標準出力を別のコマンドの標準入力につなげるてさらに処理を繰り返すことで、より複雑な処理をすることができます。コマンドはパイプラインで何個でもつなげることができます。

[ec2-user@ip-10-0-10-10 repos]$ ls -l | cat -n
     1  total 12
     2  -rw-rw-r-- 1 ec2-user ec2-user 48 Nov 14 04:33 ls.txt
     3  drwxrwxr-x 3 ec2-user ec2-user 28 Nov 11 14:43 rails
     4  drwxrwxr-x 2 ec2-user ec2-user 23 Nov 11 11:28 react
     5  drwxrwxr-x 3 ec2-user ec2-user 19 Nov 11 10:57 react-1
     6  -rw-rw-r-- 1 ec2-user ec2-user 28 Nov 14 04:53 ruby.txt
     7  -rw-rw-r-- 1 ec2-user ec2-user 14 Nov 14 04:52 sample.rb
     8  drwxrwxr-x 2 ec2-user ec2-user  6 Nov 14 03:12 typescript

パイプラインを使うことで、ディレクトリ配下に特定のファイルが存在するかを表示することもできます。以下ではRubyというファイルを表示してます。

[ec2-user@ip-10-0-10-10 repos]$ ls -l | grep ruby
-rw-rw-r-- 1 ec2-user ec2-user 28 Nov 14 04:53 ruby.txt

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション6: パーミッションとスーパーユーザーで知らなかったことをざっくりまとめてみた

目次

マルチユーザーシステムとは

マルチユーザーシステムとは、 一つのコンピュータを複数人で扱えるようにするための仕組みです。 LinuxがインストールされているサーバーにSSH接続する際にログイン画面が出ると思いますが、それはマルチユーザーシステムのために用意されている仕組みです。

(注) Linux OSはマルチユーザーシステムを採用しています。

ログインは何のために行うのか

ログインを行う理由は、 今そのコンピュータを扱っているのが誰なのかを明確にするためです。ログインがあることで、今誰がどんな操作をしているのかがを管理できます。

アクセス権限とは

マルチユーザーシステムを採用している場合、複数の開発者が一つのコンピュータを扱っているので、自分のファイルを他の誰かが削除したり変更してしまう可能性があります。また削除してはいけないファイルを誰かが削除してしまう恐れもあります。これらのマルチユーザーシステムの問題点を解決するために、パーミッション(アクセス権限)という仕組みが生まれました

パーミッション(アクセス権限)とは、ファイルごとに誰がどんな操作をできるかを定めたものです。 ファイルにパーミッションを設定することで、重要なファイルを削除できなくしたり、自分のファイルを勝手に編集・削除させないようにできます。パーミッションはファイルごとに設定されています。

フールプルーフとは

利用者が賢い人間であることを前提に置くことは、設計的にみるとあまり良い設計とは言えないです。どちらかというと良い設計とは、どんなに愚かな人が使っても正しく動く、間違いようがない設計です。このような設計をフールプルーフと言います。つまり、フールプルーフとは、どんな人が使っても間違えようがなく正しく動く設計のことです。

(※) foolは愚か者、proofは耐えるという意味です。

オーナー(所有者)と所有グループとは

パーミッションを設定する単位があります。オーナー(所有者)と所有グループとその他の人です。オーナーにはこのパーミッション、所有グループにはこのパーミッション、って感じです。

オーナー(所有者)とは

オーナーとは、 ファイルの所有者のことです。Linuxで扱われる全てのファイルにはオーナーが設定されています。 オーナーはファイルの所有者なので、他のユーザーに比べて非常に強い権限(パーミッション)が付与されています。

所有グループとは

所有グループとは、 あるファイルを所有しているグループのことです。ファイルを所有しているのはオーナーだけではなく、所有グループもファイルを所有しています。 所有グループは複数人のユーザーからなります。グループに所属しているユーザー全員に共通のパーミッションが付与されます。所有グループを使うことで、グループごとにパーミッションを付与できるので、ユーザーに同じパーミッションを何回も付与しなくて良くなります。オーナーほどではないが所有グループにもそれな理に強い権限(パーミッション)が与えられることが多いです。

オーナーでもなければ所有グループにも属していないユーザーには、個別にパーミッションが与えられています。基本的にはそういったユーザーはオーナーでも所有者でもないので、弱い権限(パーミッション)が付与されています。

まとめると、Linuxではファイルごとにパーミッションが付与されていて、パーミッションの単位には、オーナー(所有者)、所有グループ、その他のユーザーです。

パーミッションを確認する

ls -lでパーミションを確認できます。drwxrwxr-xの部分がファイルのに付与されたパーミッション(アクセス権限)です。最初の- or dはファイル種別を表しています。-はファイル、dはディレクトリです。シンボックリンクの場合、lになります。最初の文字以降のrwxrwxr-xはオーナー、所有グループ、その他の人の3つずつに意味が分かれています。パーミッションの単位ごとにどんな権限が与えられているかを表します。「rは読み取り」、「wは書き込み」、「xは実行(execute)」です。

また、ec2-user ec2-userの最初のec2-userはそのファイルの所有者(オーナー)を表し、後ろのec2-userはファイルの所有グループの名前を表します。

[ec2-user@ip-10-0-10-10 repos]$ ls -l
total 0
drwxrwxr-x 3 ec2-user ec2-user 28 Nov 11 14:43 rails
drwxrwxr-x 2 ec2-user ec2-user 23 Nov 11 11:28 react
drwxrwxr-x 3 ec2-user ec2-user 19 Nov 11 10:57 react-1
-rw-rw-r-- 1 ec2-user ec2-user  0 Nov 11 15:06 sample5.rb
-rw-rw-r-- 1 ec2-user ec2-user  0 Nov 11 15:05 sample.py
-rw-rw-r-- 1 ec2-user ec2-user  0 Nov 11 14:17 sample.rb
-rw-rw-r-- 1 ec2-user ec2-user  0 Nov 11 15:05 sample.ts

ディレクトリにおけるパーミッション

ディレクトリにおいて「r(読み取り)」、「w(書き込み)」、「x(実行)」とは、以下のような意味を持ちます。

文字 意味
r ディレクトリ配下のファイル・ディレクトリ一覧が取得できる
w ディレクトリ配下のファイル・ディレクトリの作成・削除ができる
x ディレクトリをカレントディレクトリにすることができる

chmodコマンドでファイル・ディレクトリのパーミッションを変更する

新規生成したファイルには「実行権限」が付与されていません。 シェルスクリプトなどでファイルを実行する場合、ファイルに実行権限を付与する必要があります。

[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1
[ec2-user@ip-10-0-10-10 repos]$ touch sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ls -l
total 0
drwxrwxr-x 3 ec2-user ec2-user 28 Nov 11 14:43 rails
drwxrwxr-x 2 ec2-user ec2-user 23 Nov 11 11:28 react
drwxrwxr-x 3 ec2-user ec2-user 19 Nov 11 10:57 react-1
-rw-rw-r-- 1 ec2-user ec2-user  0 Nov 14 03:12 sample.rb

chmodコマンド(チェンジモード)を使用してファイルのパーミッションを変更します。chmodコマンドには「数値モード」と「シンボルモード」の2つの指定方法があります。

シンボルモード

パーミッションの一部だけを変更したい場合、シンボルモードが楽です。シンボルモードでは「誰に」、「何を」、「どうする」かを指定します。

指定するもの 種類
誰に 「u(オーナー)」、「g(グループ)」、「o(その他のユーザー other)」、「a(ugo全て)」
何を 「r(読み取り)」、「w(書き込み)」、「x(実行)」
どうする 「+(権限の追加)」、「-(権限の削除)」、「=(指定した権限と等しくする)

以下のコマンドを実行することで、オーナーとグループにファイルの実行権限を付与します。

// sample.rbの部分は対象のファイル名
chmod ug+x sample.rb

権限を制限したい場合、以下のようなコマンドを実行します。

chmod ug-x sample.rb

数値モード

数値モードでは、「r」を「4」、「w」を「2」、「x」を「1」というように数値が割り当てられています。オーナー、グループ、その他のユーザーごとにr、w、xの数値を足した値を指定します。

例) 「rwx」→「4 + 2 + 1 = 7」、「r-x」→「4 + 1 = 5」

スーパーユーザーとは

スーパーユーザーとは、 管理者権限を持つ特別なユーザーのことです。ユーザー名がrootであることから、「rootユーザー」とも呼ばれます。 管理者権限とは、あらゆる操作が許可された強い権限のことです。スーパーユーザーはファイルのパーミッションの影響を受けずに、全てのファイルに対して読み込み、書き込み、実行が可能です。権限が強いあまり、Linuxの動作に必要なファイルも削除できてしまうので、扱いには細心の注意が必要です。管理者権限でしか実行できないコマンドを実行したい場合、sudoをつけます。

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション5: 調べる・探すコマンドで知らなかったことをざっくりまとめてみた

目次

helpオプション

helpオプションを使用することで、 そのコマンドの簡単な使い方やオプションを見ることができます。 コマンドの後ろにロングオプションで--helpを指定します。

[ec2-user@ip-10-0-10-10 repos]$ cat --help
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s), or standard input, to standard output.

  -A, --show-all           equivalent to -vET
  -b, --number-nonblank    number nonempty output lines, overrides -n
  -e                       equivalent to -vE
  -E, --show-ends          display $ at end of each line
  -n, --number             number all output lines
  -s, --squeeze-blank      suppress repeated empty output lines
  -t                       equivalent to -vT
  -T, --show-tabs          display TAB characters as ^I
  -u                       (ignored)
  -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
      --help     display this help and exit
      --version  output version information and exit

With no FILE, or when FILE is -, read standard input.

Examples:
  cat f - g  Output f's contents, then standard input, then g's contents.
  cat        Copy standard input to standard output.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'cat invocation'
[ec2-user@ip-10-0-10-10 repos]$ 

manコマンド

manコマンドを使うことで、 helpオプションよりそのコマンドの詳細な情報を知ることができます。 manはマニュアルの略です。個人的にはmanコマンドの方が見やすいです。

man コマンド名

特定のファイルやディレクトリを探し出すfindコマンド

findコマンドを実行することで、特定のファイルやディレクトリを探し出すことができます。

以下ではカレントディレクトリ配下の.rbという拡張子のファイルを表示しています。 findコマンドは対象ディレクトリのサブディレクトリも検索対象に含んでいます。

[ec2-user@ip-10-0-10-10 repos]$ find ./ -name "*.rb" -print
./rails/rails-practice/ruby-practice/sample.rb
./react/sample.rb
./react-1/rails/rails-practice/sample.rb
./react-1/rails/rails/rails-practice/sample.rb
./sample.rb
./sample5.rb
[ec2-user@ip-10-0-10-10 repos]$ find ./ -name "*.rb" -print

カレントディレクトリ配下のみを検索対象としたい場合、maxdepthオプションを指定します。depthは深さという意味です。-printは省略可能です。

[ec2-user@ip-10-0-10-10 repos]$ find ./ -maxdepth 1 -name "*.rb" -print
./sample.rb
./sample5.rb

findコマンドは以下の書式で書きます。アクションが-printの場合、アクションを省略できます。

find 検索開始ディレクトリ 検索条件 アクション

(注)パス名展開とワイルドカードは違います。ワイルドカードを使うためには、ダブルクォーテーションで囲みます。記号の意味自体はパス名展開とワイルドカードで違いはありません。

ワイルドカード

記号 意味
* 任意の0文字以上の文字列
? 任意の1文字

ファイル種別で検索する

findコマンドにtypeオプションを指定することで、ファイル種別で検索をかけることもできます。

[ec2-user@ip-10-0-10-10 repos]$ find . -maxdepth 1 -type f
./sample.rb
./sample.py
./sample.ts
./sample5.rb

locateコマンド

findコマンドは検索に時間がかかるという難点があります。locateコマンドではそれを解決しています。findが使えればlocateを使うことはないかなと感じたので、一旦使う時が来たらまた学習しようと思います。

grepコマンド

grepコマンドを実行することで、 指定したファイルの中から特定の文字列を含む行だけを出力します。 grepはgrobal regular expression printの略です。ファイル全体のうち正規表現に一致する行だけを出力するという意味です。grepコマンドは以下のように使用します。

grep 検索対象文字列 ファイル名 or パス
[ec2-user@ip-10-0-10-10 repos]$ cat /etc/crontab -n
     1  SHELL=/bin/bash
     2  PATH=/sbin:/bin:/usr/sbin:/usr/bin
     3  MAILTO=root
     4
     5  # For details see man 4 crontabs
     6
     7  # Example of job definition:
     8  # .---------------- minute (0 - 59)
     9  # |  .------------- hour (0 - 23)
    10  # |  |  .---------- day of month (1 - 31)
    11  # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    12  # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    13  # |  |  |  |  |
    14  # *  *  *  *  * user-name  command to be executed
    15
[ec2-user@ip-10-0-10-10 repos]$ grep bin /etc/crontab -n
1:SHELL=/bin/bash
2:PATH=/sbin:/bin:/usr/sbin:/usr/bin

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

Linux【ワイルドカードと正規表現】の違いと変換,展開の動作 ~ ls, grep, findでの具体例の解説~ | SEの道標

find コマンドで対象ディレクトリ直下のファイルのみを絞り込みたい - Neo's World

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション4: ファイル操作で知らなかったことをざっくりまとめてみた

目次

mkdirコマンド

mkdirコマンドを実行することで、 新しい空のディレクトリを作成することができます。

[ec2-user@ip-10-0-10-10 ~]$ mkdir repos
[ec2-user@ip-10-0-10-10 ~]$ ls
latest-ja.tar.gz  repos  wordpress

mkdirコマンドは複数階層からなるディレクトリの作成には対応していません。

[ec2-user@ip-10-0-10-10 repos]$ mkdir rails/rails-practice
mkdir: cannot create directory ‘rails/rails-practice’: No such file or directory

複数階層からなるディレクトリを作成したい場合、-p オプションを指定します。 pはparents(親)の意味です。つまり、親ディレクトリもまとめてディレクトリを作成するという意味になります。

[ec2-user@ip-10-0-10-10 repos]$ mkdir rails/rails-practice
mkdir: cannot create directory ‘rails/rails-practice’: No such file or directory
[ec2-user@ip-10-0-10-10 repos]$ mkdir -p rails/rails-practice
[ec2-user@ip-10-0-10-10 repos]$ ls
rails
[ec2-user@ip-10-0-10-10 repos]$ cd rails
[ec2-user@ip-10-0-10-10 rails]$ ls
rails-practice
[ec2-user@ip-10-0-10-10 rails]$ 

touchコマンド

touchコマンドを実行することで、カレントディレクトリ配下に新しいファイルを作成することができます。

touch 新規作成するファイル名 or パス

ファイルやディレクトリを削除するコマンド

rmコマンド

rmコマンドでファイルを削除することができます。

rm ファイル名 or パス

rmdirコマンド

rmdirコマンドで 空のディレクトリを削除することができます。

rmdir ディレクトリ名 or パス

空ではないディレクトリを指定するとエラーが起きます。

[ec2-user@ip-10-0-10-10 rails]$ rmdir rails-practice/
rmdir: failed to remove ‘rails-practice/’: Directory not empty
[ec2-user@ip-10-0-10-10 rails]$ 

空ではないディレクトリを削除したい場合、rmコマンドに-rオプションを指定して実行します。 -rはリカーシブ(再帰的な)という意味で、中に入っているファイルやディレクトリも再帰的にまとめて削除します。

[ec2-user@ip-10-0-10-10 rails]$ rm -r rails-practice
[ec2-user@ip-10-0-10-10 rails]$ ls
[ec2-user@ip-10-0-10-10 rails]$ 

catコマンド

catコマンドを実行することで、ファイルの中身を確認できます。ちなみにlessを使うと、スクロール表示させることができます。

テキストファイルとバイナリファイル

Linuxには大きく分けて、2種類のファイルがあります。一つがテキストファイル(人間が読めて編集できるファイル)です。もう一つがバイナリファイル(2進数で書かれているファイル)です。 テキストファイルをコンピュータで実行する場合、バイナリファイルに変換してから実行する必要があるので、実行速度が遅いです。人間がそのファイルを編集しないなら、最初からバイナリファイルで用意しておく方が、早く実行することができます。

cpコマンド

cpコマンドを実行することで、 ファイルやディレクトリをコピーすることができます。 cpはコピーの略です。最初にコピーしたいファイル名を指定して、2番目にどういう名前でコピーするかを指定します。コピーするだけなので、元のファイルやディレクトリは削除されたしません。

cp ファイル名 or パス ファイル名 or パス
[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react
[ec2-user@ip-10-0-10-10 repos]$ ls react
react-practice
[ec2-user@ip-10-0-10-10 repos]$ cp rails/rails-practice/sample.rb react/react-practice/react-sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ls react/react-practice/
react-sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ls rails/rails-practice/
sample.rb

あるディレクトリを別のディレクトリ配下にコピーするのもcpコマンドでできます。その場合、-r オプションをつけます(再帰的)。第二引数はどういう名前でコピーするかを指定するので、気をつけましょう。

[ec2-user@ip-10-0-10-10 react-1]$ cp -r ~/repos/rails rails
[ec2-user@ip-10-0-10-10 react-1]$ ls
rails

(注)cpコマンドの第二引数にディレクトリ名を指定する際に、カレントディレクトリ配下に存在するディレクトリ名を指定すると、カレントディレクトリにディレクトリがコピーされず、同名のディレクトリ配下に元々の名前でディレクトリがコピーされます(ディレクトリの一意性を守るため)。カレントディレクトリには存在しないディレクトリ名でcpコマンドを実行する場合、指定したディレクトリ名でカレントディレクトリ配下にコピーされます。

mvコマンド

mvコマンドを実行することで、 ファイル名を変更したり、ファイルを移動させたりできます。 第一引数には対象のファイル、第二引数には命名したいファイル名 or パスを指定します。mvはmoveの略です。

mv ファイル名 or パス ファイル名 or パス
[ec2-user@ip-10-0-10-10 react]$ ls ../rails/rails-practice/
sample.rb
[ec2-user@ip-10-0-10-10 react]$ mv ../rails/rails-practice/sample.rb ../rails/rails-practice/sample5.rb
[ec2-user@ip-10-0-10-10 react]$ ls
[ec2-user@ip-10-0-10-10 react]$ ls ../rails/rails-practice/
sample5.rb
[ec2-user@ip-10-0-10-10 react]$ 

第二引数の部分にディレクトリを指定すると、そこにファイルが移動します。cpコマンドと違ってmvコマンドの場合、本当にファイルが移動します。

[ec2-user@ip-10-0-10-10 react]$ mv ../rails/rails-practice/sample.rb ./
[ec2-user@ip-10-0-10-10 react]$ ls
sample.rb
[ec2-user@ip-10-0-10-10 react]$ ls ../rails/rails-practice/sample.rb 
ls: cannot access ../rails/rails-practice/sample.rb: No such file or directory
[ec2-user@ip-10-0-10-10 react]$ ls ../rails/rails-practice/ 
[ec2-user@ip-10-0-10-10 react]$ 

(注) mvコマンドには-rオプションは指定しなくて大丈夫です。

パス名展開

パス名展開を使うことで、文字列をパターンで表現することができます。

記号 意味
*(アスタリスク 長さ0以上の文字列にマッチします。
? 任意の1文字

??と書くことで任意の2文字を指定できます。

(注)正規表現とは記号の意味が違うので、気をつけましょう。

リンクとは何か

リンクとは、 ファイルに別名をつける機能のことです。リンクを使うことで、ファイルに別名を付けて一つのファイルを複数の名前で呼び出すことができます。

リンクを使うメリット

リンクを使うメリットは、長いパス名を省略できることです。長いパス名を省略することで、ファイルの指定が簡単になります。また、ファイルを移動させたとしても、プログラムを修正する必要がなくなります。

ハードリンクとシンボリックリング

リンクには大きく分けて2種類のリンクがあります。ハードリンクとシンボリックリンクです。

ハードリンク

ハードリンクとは、 名前と実体を結びつける形でファイルに別名をつける機能です。 ざっくりいうと一つのファイルに複数の名前をつける機能です。 ハードリンクはファイルに対して設定できますが、ディレクトリに対しては設定できません。 以下のコマンドでファイルにハードリンクを設定します。lnはLinkの略語です。

ln ハードリンクをつけたいファイル名 ハードリンク名

以下のように実行すると、指定した名前でハードリンクが作成されています。実体は同じファイルです。

[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ln sample.rb sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb  sample-ruby

ハードリンクを消したい場合、rmコマンドを実行します。 

シンボリックリンク

ハードリンクはディレクトリに対して設定できなかったりして、結構不便です。そのため、実際に使われているリンクはシンボリックリンクです。 シンボリックリンクは、名前と名前を結びつける機能です。 シンボリックリンクによって、元々のファイル名を通じてファイルに別名を付けることができます。シンボリックリンクで指定した名前はファイルの実体とは直接的に紐づいていません。元々のファイル名に日もづけられています。

シンボリックリンクを作成するには、lnコマンドに-sオプションを指定します。sはシンボリックの略です。

ln シンボリックリンクをつけたいファイル名 or パス シンボリックリンク名

ls -Fで確認すると、@がついているものがシンボリックリンクなので、sample-rubyシンボリックリンクであることが分かります。

[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ln -s sample.rb sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb  sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls -F
rails/  react/  react-1/  sample.rb  sample-ruby@
[ec2-user@ip-10-0-10-10 repos]
[ec2-user@ip-10-0-10-10 repos]$ ls -l | grep sample-ruby
lrwxrwxrwx 1 ec2-user ec2-user  9 Nov 11 14:35 sample-ruby -> sample.rb

シンボリックリンクを消したい場合、ハードリンクを削除するときと同じでrmコマンドを実行します。

シンボリックリンクの特徴

  1. ディレクトリに対してもシンボリックリンクを設定できる
  2. 実体がなくてもシンボリックリンクを作成できる。

シンボリックリンクを実際に作ってみる

実際にシンボリックリンクを深い階層のファイルに対して作ってみました。そうすると、カレントディレクトリにシンボリックリンクが作成されました。そのシンボリックリンクvimで開くとsample.rbの内容が表示されたり、catコマンドで指定するとちゃんと中身が表示されたりしました。長いパスを何回も入力してファイルを指定しないといけない場面で、シンボリックリンクを作成すると便利だと感じました。

[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ls rails/rails-practice/ruby-practice/sample.rb
rails/rails-practice/ruby-practice/sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ln -s rails/rails-practice/ruby-practice/sample.rb sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb  sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls sample-ruby
sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls -l
total 0
drwxrwxr-x 3 ec2-user ec2-user 28 Nov 11 10:40 rails
drwxrwxr-x 2 ec2-user ec2-user 23 Nov 11 11:28 react
drwxrwxr-x 3 ec2-user ec2-user 19 Nov 11 10:57 react-1
-rw-rw-r-- 1 ec2-user ec2-user  0 Nov 11 14:17 sample.rb
lrwxrwxrwx 1 ec2-user ec2-user 44 Nov 11 14:42 sample-ruby -> rails/rails-practice/ruby-practice/sample.rb
[ec2-user@ip-10-0-10-10 repos]$ cat sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ vim sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ vim rails
[ec2-user@ip-10-0-10-10 repos]$ vim sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ cat sample-ruby
a = 1

puts a

感想

Vimが使えると、ファイルの中身を見たりファイル内検索したりがコマンドを覚えなくてもできるので、やっぱVimって良いなと感じました。

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

【 ディレクトリごとコピーする 】 | 日経クロステック(xTECH)

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション3: シェルとコマンドラインの基本で知らなかったことをざっくりまとめてみた

目次

シェルとは

シェルとは、 ユーザーが入力したコマンドを解釈して、それを実行するためのソフトウェアのことです。 ソフトウェアということは何らかのプログラムが書かれた一つのファイルです。シェル自体にキーボードやディスプレイは備わっていません。シェルへの入力や結果の出力を表示するためにターミナルエミュレータ(ターミナル)というソフトウェアが使われます。ターミナルエミュレータは入出力装置です。実際のコマンドの実行はシェルが行なっています。

(※)厳密にいうと、シェルはコマンドに対応したファイルを探しているだけです。コマンドの実行はLinuxカーネルが行います。また、多くの場合、ターミナルと呼ばれるものはターミナルエミュレータを指します。

echoコマンドとは

echoコマンドとは、指定した文字列を出力してくれるコマンドのことです。echoは日本語で反響や木霊(こだま)という意味です。

[ec2-user@ip-10-0-10-10 www]$ echo hello world
hello world
[ec2-user@ip-10-0-10-10 www]$ 

また以下のコマンドを実行することで、現在動いているシェルを表示させることができます。bashというシェルが動いていることが分かります。デフォルトで起動するシェルをログインシェルと呼びます。

[ec2-user@ip-10-0-10-10 www]$ echo $SHELL
/bin/bash
[ec2-user@ip-10-0-10-10 www]$

(※)$から始まる変数をシェル変数と呼びます。

プロンプトとコマンドラインの違い

プロンプトとは、[ec2-user@ip-10-0-10-10 www]$の部分です。コマンドラインとはプロンプトの右側のコマンド入力部分のことです。プロンプトは促すという意味です。

[ec2-user@ip-10-0-10-10 www]$ ls
cgi-bin  html
[ec2-user@ip-10-0-10-10 www]$

historyコマンド

historyコマンドで過去に実行したコマンドの一覧を取得できます。それぞれのコマンドには番号が振られていて、!番号でそのコマンドを実行できます。

[ec2-user@ip-10-0-10-10 www]$ history

// 省略

[ec2-user@ip-10-0-10-10 www]$ !78
ls
cgi-bin  html
[ec2-user@ip-10-0-10-10 www]$

lsコマンドのよく使うオプション

Fオプション

F(ラージエフ)オプションを使うことで、ファイル種別を表示してくれます。ファイルなのかディレクトリなのかを判断することができます。ディレクトリには後ろにスラッシュがついていて、シンボリックリンクには@がついています(シンボリックリンクはファイルの一種です)。普通のファイルには何もついていません。このFはclassify(分類する)のfです。

[ec2-user@ip-10-0-10-10 ~]$ ls -F /
bin@  boot/  dev/  etc/  home/  lib@  lib64@  local/  media/  mnt/  opt/  proc/  root/  run/  sbin@  srv/  sys/  tmp/  usr/  var/

aオプション

aオプションは隠しファイルも込みで全て表示します。 .から始まるファイルのことを隠しファイルと呼びます。ファイル名の先頭に.をつけると隠しファイルになります。 aはオールの略です。

[ec2-user@ip-10-0-10-10 wordpress]$ ls -a /
.  ..  .autorelabel  bin  boot  dev  etc  home  lib  lib64  local  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

lオプション

lオプションはロングの略です。長く表示するので、ファイルやディレクトリのより詳細な情報を表示します。

[ec2-user@ip-10-0-10-10 /]$ ls -l
total 16
lrwxrwxrwx   1 root root    7 Oct 12 18:54 bin -> usr/bin
dr-xr-xr-x   4 root root 4096 Nov  5 09:44 boot
drwxr-xr-x  15 root root 2900 Nov 11 07:54 dev
drwxr-xr-x  86 root root 8192 Nov  6 17:32 etc
drwxr-xr-x   3 root root   22 Nov  5 08:10 home
lrwxrwxrwx   1 root root    7 Oct 12 18:54 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Oct 12 18:54 lib64 -> usr/lib64
drwxr-xr-x   2 root root    6 Oct 12 18:53 local
drwxr-xr-x   2 root root    6 Apr  9  2019 media
drwxr-xr-x   2 root root    6 Apr  9  2019 mnt
drwxr-xr-x   4 root root   27 Oct 12 18:57 opt
dr-xr-xr-x 166 root root    0 Nov 11 07:54 proc
dr-xr-x---   3 root root  119 Nov  7 14:20 root
drwxr-xr-x  30 root root 1000 Nov 11 07:58 run
lrwxrwxrwx   1 root root    8 Oct 12 18:54 sbin -> usr/sbin
drwxr-xr-x   2 root root    6 Apr  9  2019 srv
dr-xr-xr-x  13 root root    0 Nov 11 07:54 sys
drwxrwxrwt  10 root root  328 Nov 11 09:39 tmp
drwxr-xr-x  13 root root  155 Oct 12 18:54 usr
drwxr-xr-x  20 root root  280 Nov  5 09:47 var

ロングオプションとショートオプション

オプションには大きく分けて2種類のオプションがあります。ロングオプションとショートオプションです。ショートオプションはハイフンと何らかの一文字からなる短いオプションです。ロングオプションはハイフン2つと英単語からなる長いオプションです。ショートオプションもロングオプションも同じ挙動になります。コマンドによってはどちらかしか用意されていない場合もあります。コマンドにどんなオプションが用意されているかを知りたい場合、以下のマニュアルコマンドを実行します。

man コマンド名

(※)オプションの中には引数を取るオプションもあります。

ls -w30

オプションを複数指定する

オプションを複数指定する場合、スペースを上けて指定するか、英字1文字を連続させて指定します。後者の方が記述量が少ないのでおすすめです。

[ec2-user@ip-10-0-10-10 /]$ ls -a -l

or 

[ec2-user@ip-10-0-10-10 /]$ ls -al

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション2: ファイルとディレクトリで知らなかったことをざっくりまとめてみた

目次

pwdコマンド

pwdコマンドを実行することで、 現在作業しているディレクトリ(カレントディレクトリ)を表示させることができます。 CLIディレクトリやファイルを指定する場合、パスと呼ばれる指定方法を使用します。pwdはプリントワーキングディレクトリの略です。

[ec2-user@ip-10-0-10-10 ~]$ pwd
/home/ec2-user

(※)カレントディレクトリをワーキングディレクトリと呼ぶこともあります。

Linuxにおけるパスとは何か

Linuxにおけるパスとは、 「/usr/bin」のような、あるファイルやディレクトリにたどり着くまでの経路のことです。

ホームディレクトリとは

ホームディレクトリとは、 ユーザがログインした際のカレントディレクトリのことです。 このディレクトリでは、ユーザが自由にファイルやサブディレクトリを作成、保存できます。~で表現されます。

lsコマンド

lsコマンドは、リストの略です。lsコマンドを実行することで、カレントディレクトリ配下のディレクトリやファイルを一覧表示させることができます。

[ec2-user@ip-10-0-10-10 ~]$ ls
latest-ja.tar.gz  wordpress

lsコマンドの後ろにパスを指定することもできます。

[ec2-user@ip-10-0-10-10 rails]$ ls
rails-practice
[ec2-user@ip-10-0-10-10 rails]$ ls ./rails-practice
sample.rb

Linuxにおける絶対パス相対パスの違い

Linuxにおけるパスには、絶対パス相対パスの2種類があります。絶対パスはルートディレクトリ(/)を起点にしたパスです。絶対パスを書くときはまずはルートディレクトリ(/)を書きます。相対パスはカレントディレクトリを起点にしたパスです。 相対パス表記はカレントディレクトリを基点としているので、パスの左側には必ず(./)が書かれます。

(注) 相対パスの ./は省略可能です。 ./user/binをuser/binと書いても問題ありません。また、ルートディレクトリ(/)とは、最上位のディレクトリのことです。

cdコマンド

cdコマンドは、チェンジディレクトリの略です。cdコマンドを実行することで、カレントディレクトリを指定したパスのディレクトリに変更します。cdコマンドに指定するパスは絶対パスでも相対パスでも大丈夫です。

[ec2-user@ip-10-0-10-10 ~]$ cd /var/www
[ec2-user@ip-10-0-10-10 www]$ ls
cgi-bin  html

以上のLinuxコマンドを使うことで、ルートディレクトリにはいろいろなディレクトリが格納されていることがわかります。

[ec2-user@ip-10-0-10-10 www]$ cd /
[ec2-user@ip-10-0-10-10 /]$ pwd
/
[ec2-user@ip-10-0-10-10 /]$ ls
bin  boot  dev  etc  home  lib  lib64  local  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[ec2-user@ip-10-0-10-10 /]$ 

ディレクトリごとにディレクトリの役割が決まっています。例えばdevディレクトリにはデバイスファイルと呼ばれるファイルを格納します。etcディレクトリには設定ファイルを入れるディクトリです。

(※)余談ですが、man hierというコマンドを実行すると、それぞれのディレクトリがどんな役割のディレクトリなのかを確認できます。

ホームディレクトリに移動する2つの方法

ホームディレクトリに移動するためには、cd ~ または、パスを指定しないで cd を実行すれば、移動できます。

一つ前のカレントディレクトリに移動する

一つ前のカレントディレクトリに移動するためには、cd - を実行します。意外と便利です。

[ec2-user@ip-10-0-10-10 ~]$ cd /var/www
[ec2-user@ip-10-0-10-10 www]$ ls
cgi-bin  html
[ec2-user@ip-10-0-10-10 www]$ cd cgi-bin/
[ec2-user@ip-10-0-10-10 cgi-bin]$ ls
[ec2-user@ip-10-0-10-10 cgi-bin]$ cd -
/var/www
[ec2-user@ip-10-0-10-10 www]$ 

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

カレントディレクトリ - Wikipedia

ホームディレクトリ - Wikipedia

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション1: Linuxの基礎知識と環境構築で知らなかったことをざっくりまとめてみた

目次

Linuxとは何か

Linuxという言葉は、2つの意味で使われます。

基本的にはLinuxと言われた時には、Linux OSを指すことが多いです。 Linux OSは、WindowsMac OSと同じOSの一つです。

(※) Linux OSはコストの面や高い安定性の面で、サーバー用途のOSでトップシェアを誇っています。

OSとは何か

OSとは、 コンピュータを動作させるための基本ソフトウェア群です。 ブラウザとかアプリケーションはOSがあることで、動くことができます。 アプリケーションを動かすためにはOSが必要です。

(※)アプリケーション(応用)に対して、OSは基本です。

OSが提供する機能

OSが提供する機能として、以下のようなものがあります。

  • デスクトップ環境(GUIの場合)
  • ファイルシステム
  • ネットワーク通信
  • プロセス間通信
  • プロセス管理
  • メモリ管理
  • バイス管理
  • シェル
  • コマンド

OSとは上記の機能を担うソフトウェア群のことで、私たちが普段当たり前に使っている機能を提供してくれます。

(※)さまざまなことを並行して行えるのは、OSがプロセス管理を行なってくれているからです。

Linuxカーネルとは何か

Linuxカーネルとは、 Linux OSのカーネルです。カーネルとは、OSの中核にあるソフトウェアのことです。 カーネルは、プロセス管理、メモリ管理、デバイス管理などのハードウェア制御やファイルシステムを提供するという役割を担っています。LinuxカーネルLinux OSで使用されます。

(※)Kernelは日本語で「中核」という意味です。

OSはカーネルとそれ以外に分けられる

OSはカーネルとそれ以外に分けられるが、カーネルはOSの一部の機能しか持たないので、その他のOSの機能はカーネル以外のソフトウェアで実現する必要があります。

Linuxカーネルの特徴

Linuxカーネルの特徴は、 オープンソースで開発されていることです。 オープンソースで開発されているので、WindowsMac OSのようにライセンス料を払わずに無料で使用することができます。無料なのに安定性も高いです。

Linuxディストリビューションとは

Linuxディストリビューションとは、 OSとして動かすのに必要なソフトウェア群を、Linuxカーネルとまとめて提供したものです。 それぞれの開発者はLinuxディストリビューションをインストールすることで、すぐにLinux OSとして使用できるようになります。

Linuxカーネルが開発された当初は、開発者はLinuxカーネルをインストールして、周辺のソフトウェアは自分で探して、LinuxカーネルとセットでインストールすることでOSとして使用することができていました。Linuxディストリビューションのおかげでこれらの手間が省けます。

(※) Linuxディストリビューションは、ほとんどLinux OSと同じような意味です。 Linuxカーネルは共通ですが、周辺のソフトウェアがディストリビューションによって微妙に異なってきます。

ディストリビューションの種類

ディストリビューションには大きく分けて2つの種類があります。1つがCentOSのようなRedHat系と、UbuntuのようなDebian系です。現時点でより主流なのはRedHat系だそうです。

普通のPCとサーバー用のコンピュータの違いは何か

  • 操作する際のインターフェースの違い
    普通のPCの場合はGUI サーバー用のコンピュータはディスプレイを持たないので、シェルでコマンドを実行するCLIを使用します。

  • ユーザー数の違い PCは一人のユーザーだけが操作しますが、サーバー用のコンピュータは複数のユーザーがログインして操作を行います。

(※)CLI(コマンドラインインターフェース)とは、 キーボードでコマンドを入力して、文字列として結果を出力するインターフェースのことです。また、マルチユーザーシステムとは、一人のユーザーではなく、複数のユーザーが同時にログインして利用することを前提とするシステムのことです。サーバー用のコンピュータはマルチユーザーシステムを採用しています。

Linux OSがインストールされているマシンを用意する3つの方法

  1. 今持っているパソコンのOSをLinuxに書き換える
    今動いているアプリケーションが動かせなくなってしまうので、この方法はやらない方が良いです。
  2. AWSGCPでEC2インスタンスを起動させてそこにLinux OSをインストールする
  3. 仮想マシンとしてLinux OSがインストールされているマシンを用意する

物理マシン、仮想マシンとは何か

物理マシンとは

物理マシンとは、普通のコンピュータのことです

仮想マシンとは

仮想マシンとは、 物理マシンと同じ機能をソフトウェアで実現したコンピュータのことです。 仮想マシンの実体は物理マシン上のファイルであり、このファイルが物理マシン上で実行されることによって、物理マシンと同じ機能をソフトウェアで実現しています。物理マシンにインストールされているOS上で、仮想化ソフトウェア(Virtual Box等)が動いていて、そのソフトウェアを使うことで、仮想マシンを作成することができます。仮想マシン上にOSをインストールします。

仮想化を知る上で以下の画像が分かりやすかったので、引用させていただきます。

画像引用(サーバ仮想化とは?)

(※)物理マシンが持つOSをホストOS、仮想マシンが持つOSをゲストOSと呼びます。ホストが招待する側、ゲストが招待される側であるため、そのような名前になっています。

終わり

VirtualBoxを使って仮想マシンを立ち上げようとしたのですが、うまくいかなかったので、EC2インスタンスを設置して以降はやります。

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

マルチユーザーシステムとは - コトバンク