ウェブアプリの環境構築でよく出てくるLinuxコマンドメモ



ウェブアプリの環境構築でApacheのconfファイルやバックエンド用のmodのconfigなどを設定するときによく出てくるLinuxコマンドが読めなくて困ったので勉強しました


## 1. 入出力制御


コマンドやファイルや文字列の入出力を制御する方法がいくつか用意されているようです
使用例は後で出てくるのでざっとだけ見ていきます


### 入力リダイレクト


ファイルの内容をコマンドに渡すのが入力リダイレクトです


```terminal:terminal
$ コマンド < ファイル
```


### ヒアドキュメント


１行に収まる文字列なら普通に書けば良いですが、複数行にわたる文字列をコマンドに渡したいときにはENTERを入れた時点でコマンドが実行されてしまって困ります。そこで使うのがヒアドキュメントです


```terminal:terminal
$ コマンド << 区切文字列
＜ここに文字列を書く＞
区切文字列
```


### 出力リダイレクト


echoコマンドやcatコマンドなどの標準出力に書き出す内容をファイルに書き出すようにリダイレクトします。出力リダイレクトではファイルの内容を消去して新たに書き出しますので、これまでに当該ファイル名で保存されていた内容は失われます


```terminal:terminal
$ コマンド > ファイル
```


### 追加リダイレクト


ファイルへ書き出すのは出力リダイレクトと同様ですが、追加リダイレクトでは既に書かれている内容に追記していきます。既にあるconfigファイルに追記するケースなどで便利です


```terminal:terminal
$ コマンド >> ファイル
```


### パイプライン


コマンドの結果を受けて次のコマンドを実行します
以下のように書くとコマンド１の結果をコマンド２に渡してくれます


```terminal:terminal
$ コマンド１ | コマンド２
```


リストを出力するコマンドからgrepに結果を渡して見たいものだけ探すということができます


## ファイルに書き込む


### 1行分書き込む


echoコマンドと出力リダイレクトを組み合わせてファイルに書き込むことができます。ファイルがなかったら新たに作成し、ファイルがあったら上書きされます


```terminal:terminal
echo aaaa > hoge.txt
```


```terminal:hoge.txt
aaaa
```


追加リダイレクトすればファイルに書き足すこともできます。ファイルがなかったら新たに作成して記入、ファイルがあったら追記になります


```terminal:terminal
echo bbbb >> hoge.txt
```


```terminal:hoge.txt
aaaa
bbbb
```


echoコマンドは標準出力に文字列を出すコマンドですが、出力をリダイレクトして書き出しているというわけですね。これを追加リダイレクトで複数行書いていく事もできます


### 複数行まとめて書き込む


catを使えば複数行の出力ができます


```terminal:terminal
$ cat << EOF
> hoge
> fuga
> EOF
hoge
fuga
```


これをファイルにリダイレクトすればファイルにまとめて複数行を書くことができます。EOFが半端なところに入るので初めて見たときは混乱したんですが、「<< EOF」は次の行から記入する文字列をコマンドに渡すという動き方をするので、「cat << EOF」までがcatコマンドで、その出力を「> hoge.txt」でファイルにリダイレクトするという書き方になります


```terminal:terminal
$ cat << EOF > hoge.txt
hoge
fuga
EOF
```


```terminal:hoge.txt
hoge
fuga
```


追記リダイレクトもできます


```terminal:terminal
cat << EOF >> hoge.txt
aaaa
bbbb
EOF
```


```terminal:hoge.txt
hoge
fuga
aaaa
bbbb
```


### sudo権限が必要な書き出し


出力リダイレクトではsudoにすることが出来ないですが、ファイルに書き込むコマンドであるteeにパイプラインで渡せば「sudo tee ファイル名」と書けるので可能になります。apacheのconfファイルに書き込むなど権限が必要なケースは良くあるのでよく使われるやり方だと思います


```terminal:terminal
cat << EOF | sudo tee hoge.txt
aaa
bbb
EOF
```


```terminal:hoge.txt
aaa
bbb
```


-a オプションをつければ追記できます


```terminal:terminal
cat << EOF | sudo tee -a hoge.txt
ccc
ddd
EOF
```


```terminal:hoge.txt
aaa
bbb
ccc
ddd
```


teeコマンドはファイルに書き込んだ上で標準出力にも出力する、というコマンドなので上記の書き方ではterminalに書き出されて邪魔だという場合は要らない標準出力の方を「> /dev/null」にリダイレクトして捨てれば表示されなくできます


```terminal:terminal
cat << EOF | sudo tee hoge.txt > /dev/null
aaa
bbb
EOF
```


```terminal:hoge.txt
aaa
bbb
```


ファイルに対する処理は同じです


## ファイルにリンクをつける


ファイルやパスに別名をつけてその名前で呼べるようにできます
以下のように書きます


```terminal:書き方
ln [オプション] <リンク元ファイル名> <リンク名>
```


### ファイルへのハードリンク


ファイルを対象にしたリンクをハードリンクと呼ぶようです
オプションなしでファイルを指定すればその名前で呼べるようになります


```terminal:terminal
ln hoge.txt hoo
```


```terminal:terminal
$ cat hoo
aaa
bbb
ccc
ddd
```


### ディレクトリへのシンボリックリンク


ディレクトリへのリンクも作れます
-s オプションでシンボリックリンクを設定します


```terminal:terminal
ln -s  /etc/apache2/sites-available/ sites-available
```


```terminal:terminal
$ ls sites-available
000-default.conf  default-ssl.conf
```


長いパスを短く書けるようにしたりするのに使うようです


### 作ったリンクの一覧を見る


作ったリンクはlsで見られます


```terminal:terminal
ls
hoge.txt  hoo  sites-available
```


シンボリックリンクは色が変わって表示されるので分かりやすいです


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/4a2a054c-ea20-d7a4-da45-83c12ab20596.png" width=45%>


llで見るとシンボリックリンクは「 -> 」で繋いで表示されるのでこちらも分かりやすいです


```terminal:terminal
$ ll
total 16
drwxr-xr-x 1 root root 4096 Jan 27 05:15 ./
drwxr-xr-x 1 root root 4096 Jan 25 11:04 ../
-rw-r--r-- 2 root root   16 Jan 27 01:41 hoge.txt
-rw-r--r-- 2 root root   16 Jan 27 01:41 hoo
lrwxrwxrwx 1 root root   28 Jan 27 05:05 sites-available -> /etc/apache2/sites-available/
```


### リンクの削除


リンクはrmで削除できます


```terminal:terminal
rm hoo
rm sites-available
```


```terminal:terminal
$ ls
hoge.txt
```


無事削除できました


rmでなくunlinkでもシンボリックリンクを削除することはできますが、消しちゃダメなコマンドも消せちゃうみたいなのでunlinkはやめておいた方が良さげです
https://qiita.com/ko1nksm/items/dccd33cbdf52412568f1


## まとめ


```
cat << EOF | sudo tee /etc/httpd/conf.d/wsgi.conf > /dev/null
WSGIScriptAlias /myapp /var/www/cgi-bin/myapp.wsgi
EOF
```

読める！ 読めるぞ！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/fda1a043-3ae8-52d2-f7b6-895512725480.jpeg" width=50%>