ウェブアプリの環境構築でApacheのconfファイルやバックエンド用のmodのconfigなどを設定するときによく出てくるLinuxコマンドが読めなくて困ったので勉強しました
1. 入出力制御
コマンドやファイルや文字列の入出力を制御する方法がいくつか用意されているようです
使用例は後で出てくるのでざっとだけ見ていきます
入力リダイレクト
ファイルの内容をコマンドに渡すのが入力リダイレクトです
$ コマンド < ファイル
ヒアドキュメント
1行に収まる文字列なら普通に書けば良いですが、複数行にわたる文字列をコマンドに渡したいときにはENTERを入れた時点でコマンドが実行されてしまって困ります。そこで使うのがヒアドキュメントです
$ コマンド << 区切文字列
<ここに文字列を書く>
区切文字列
出力リダイレクト
echoコマンドやcatコマンドなどの標準出力に書き出す内容をファイルに書き出すようにリダイレクトします。出力リダイレクトではファイルの内容を消去して新たに書き出しますので、これまでに当該ファイル名で保存されていた内容は失われます
$ コマンド > ファイル
追加リダイレクト
ファイルへ書き出すのは出力リダイレクトと同様ですが、追加リダイレクトでは既に書かれている内容に追記していきます。既にあるconfigファイルに追記するケースなどで便利です
$ コマンド >> ファイル
パイプライン
コマンドの結果を受けて次のコマンドを実行します
以下のように書くとコマンド1の結果をコマンド2に渡してくれます
$ コマンド1 | コマンド2
リストを出力するコマンドからgrepに結果を渡して見たいものだけ探すということができます
ファイルに書き込む
1行分書き込む
echoコマンドと出力リダイレクトを組み合わせてファイルに書き込むことができます。ファイルがなかったら新たに作成し、ファイルがあったら上書きされます
echo aaaa > hoge.txt
aaaa
追加リダイレクトすればファイルに書き足すこともできます。ファイルがなかったら新たに作成して記入、ファイルがあったら追記になります
echo bbbb >> hoge.txt
aaaa
bbbb
echoコマンドは標準出力に文字列を出すコマンドですが、出力をリダイレクトして書き出しているというわけですね。これを追加リダイレクトで複数行書いていく事もできます
複数行まとめて書き込む
catを使えば複数行の出力ができます
$ cat << EOF
> hoge
> fuga
> EOF
hoge
fuga
これをファイルにリダイレクトすればファイルにまとめて複数行を書くことができます。EOFが半端なところに入るので初めて見たときは混乱したんですが、「<< EOF」は次の行から記入する文字列をコマンドに渡すという動き方をするので、「cat << EOF」までがcatコマンドで、その出力を「> hoge.txt」でファイルにリダイレクトするという書き方になります
$ cat << EOF > hoge.txt
hoge
fuga
EOF
hoge
fuga
追記リダイレクトもできます
cat << EOF >> hoge.txt
aaaa
bbbb
EOF
hoge
fuga
aaaa
bbbb
sudo権限が必要な書き出し
出力リダイレクトではsudoにすることが出来ないですが、ファイルに書き込むコマンドであるteeにパイプラインで渡せば「sudo tee ファイル名」と書けるので可能になります。apacheのconfファイルに書き込むなど権限が必要なケースは良くあるのでよく使われるやり方だと思います
cat << EOF | sudo tee hoge.txt
aaa
bbb
EOF
aaa
bbb
-a オプションをつければ追記できます
cat << EOF | sudo tee -a hoge.txt
ccc
ddd
EOF
aaa
bbb
ccc
ddd
teeコマンドはファイルに書き込んだ上で標準出力にも出力する、というコマンドなので上記の書き方ではterminalに書き出されて邪魔だという場合は要らない標準出力の方を「> /dev/null」にリダイレクトして捨てれば表示されなくできます
cat << EOF | sudo tee hoge.txt > /dev/null
aaa
bbb
EOF
aaa
bbb
ファイルに対する処理は同じです
ファイルにリンクをつける
ファイルやパスに別名をつけてその名前で呼べるようにできます
以下のように書きます
ln [オプション] <リンク元ファイル名> <リンク名>
ファイルへのハードリンク
ファイルを対象にしたリンクをハードリンクと呼ぶようです
オプションなしでファイルを指定すればその名前で呼べるようになります
ln hoge.txt hoo
$ cat hoo
aaa
bbb
ccc
ddd
ディレクトリへのシンボリックリンク
ディレクトリへのリンクも作れます
-s オプションでシンボリックリンクを設定します
ln -s /etc/apache2/sites-available/ sites-available
$ ls sites-available
000-default.conf default-ssl.conf
長いパスを短く書けるようにしたりするのに使うようです
作ったリンクの一覧を見る
作ったリンクはlsで見られます
ls
hoge.txt hoo sites-available
シンボリックリンクは色が変わって表示されるので分かりやすいです

llで見るとシンボリックリンクは「 -> 」で繋いで表示されるのでこちらも分かりやすいです
$ 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で削除できます
rm hoo
rm sites-available
$ 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
読める! 読めるぞ!
