【もう絶対に忘れない 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: パーミッションとスーパーユーザーで知らなかったことをざっくりまとめてみた
目次
- 目次
- マルチユーザーシステムとは
- アクセス権限とは
- オーナー(所有者)と所有グループとは
- パーミッションを確認する
- chmodコマンドでファイル・ディレクトリのパーミッションを変更する
- スーパーユーザーとは
- 参考記事
マルチユーザーシステムとは
マルチユーザーシステムとは、 一つのコンピュータを複数人で扱えるようにするための仕組みです。 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の道標
【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション4: ファイル操作で知らなかったことをざっくりまとめてみた
目次
- 目次
- mkdirコマンド
- touchコマンド
- ファイルやディレクトリを削除するコマンド
- catコマンド
- テキストファイルとバイナリファイル
- cpコマンド
- mvコマンド
- パス名展開
- リンクとは何か
- ハードリンクとシンボリックリング
- 感想
- 参考記事
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コマンドを実行します。
シンボリックリンクの特徴
シンボリックリンクを実際に作ってみる
実際にシンボリックリンクを深い階層のファイルに対して作ってみました。そうすると、カレントディレクトリにシンボリックリンクが作成されました。そのシンボリックリンクを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
【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション3: シェルとコマンドラインの基本で知らなかったことをざっくりまとめてみた
目次
- 目次
- シェルとは
- echoコマンドとは
- プロンプトとコマンドラインの違い
- historyコマンド
- lsコマンドのよく使うオプション
- ロングオプションとショートオプション
- オプションを複数指定する
- 参考記事
シェルとは
シェルとは、 ユーザーが入力したコマンドを解釈して、それを実行するためのソフトウェアのことです。 ソフトウェアということは何らかのプログラムが書かれた一つのファイルです。シェル自体にキーボードやディスプレイは備わっていません。シェルへの入力や結果の出力を表示するためにターミナルエミュレータ(ターミナル)というソフトウェアが使われます。ターミナルエミュレータは入出力装置です。実際のコマンドの実行はシェルが行なっています。
(※)厳密にいうと、シェルはコマンドに対応したファイルを探しているだけです。コマンドの実行は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コマンド
- Linuxにおけるパスとは何か
- ホームディレクトリとは
- lsコマンド
- Linuxにおける絶対パスと相対パスの違い
- cdコマンド
- ホームディレクトリに移動する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
【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション1: Linuxの基礎知識と環境構築で知らなかったことをざっくりまとめてみた
目次
Linuxとは何か
Linuxという言葉は、2つの意味で使われます。
基本的にはLinuxと言われた時には、Linux OSを指すことが多いです。 Linux OSは、WindowsやMac OSと同じOSの一つです。
(※) Linux OSはコストの面や高い安定性の面で、サーバー用途のOSでトップシェアを誇っています。
OSとは何か
OSとは、 コンピュータを動作させるための基本ソフトウェア群です。 ブラウザとかアプリケーションはOSがあることで、動くことができます。 アプリケーションを動かすためにはOSが必要です。
(※)アプリケーション(応用)に対して、OSは基本です。
OSが提供する機能
OSが提供する機能として、以下のようなものがあります。
OSとは上記の機能を担うソフトウェア群のことで、私たちが普段当たり前に使っている機能を提供してくれます。
(※)さまざまなことを並行して行えるのは、OSがプロセス管理を行なってくれているからです。
Linuxカーネルとは何か
Linuxカーネルとは、 Linux OSのカーネルです。カーネルとは、OSの中核にあるソフトウェアのことです。 カーネルは、プロセス管理、メモリ管理、デバイス管理などのハードウェア制御やファイルシステムを提供するという役割を担っています。LinuxカーネルはLinux OSで使用されます。
(※)Kernelは日本語で「中核」という意味です。
OSはカーネルとそれ以外に分けられる
OSはカーネルとそれ以外に分けられるが、カーネルはOSの一部の機能しか持たないので、その他のOSの機能はカーネル以外のソフトウェアで実現する必要があります。
Linuxカーネルの特徴
Linuxカーネルの特徴は、 オープンソースで開発されていることです。 オープンソースで開発されているので、WindowsやMac 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つの方法
- 今持っているパソコンのOSをLinuxに書き換える
今動いているアプリケーションが動かせなくなってしまうので、この方法はやらない方が良いです。 - AWSやGCPでEC2インスタンスを起動させてそこにLinux OSをインストールする
- 仮想マシンとしてLinux OSがインストールされているマシンを用意する
物理マシン、仮想マシンとは何か
物理マシンとは
物理マシンとは、普通のコンピュータのことです
仮想マシンとは
仮想マシンとは、 物理マシンと同じ機能をソフトウェアで実現したコンピュータのことです。 仮想マシンの実体は物理マシン上のファイルであり、このファイルが物理マシン上で実行されることによって、物理マシンと同じ機能をソフトウェアで実現しています。物理マシンにインストールされているOS上で、仮想化ソフトウェア(Virtual Box等)が動いていて、そのソフトウェアを使うことで、仮想マシンを作成することができます。仮想マシン上にOSをインストールします。
仮想化を知る上で以下の画像が分かりやすかったので、引用させていただきます。
画像引用(サーバ仮想化とは?)
(※)物理マシンが持つOSをホストOS、仮想マシンが持つOSをゲストOSと呼びます。ホストが招待する側、ゲストが招待される側であるため、そのような名前になっています。
終わり
VirtualBoxを使って仮想マシンを立ち上げようとしたのですが、うまくいかなかったので、EC2インスタンスを設置して以降はやります。
参考記事
もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy