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