Linuxでのテキストファイルへの出力コマンドまとめ
DockerやTerraformなどでLinux環境を立ち上げる際に設定ファイルを自動で作成する必要がある。
以下でよく使うファイル出力コマンドについてまとめる。
1行だけ記述したテキストファイルを作成・追記
1行だけの場合は以下のようにecho
コマンドで出力するのが手っ取り早い。
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
なお、>>
は既存ファイルに追記する形式で出力する。
新規ファイルとして作成したい場合は>
を使う。
echo "gnome-session --session=ubuntu" > ~/.xsession
なお、ダブルクォーテーションで括った際に変数が含まれている場合、自動的に変数展開されてしまうので、変数を含めてファイルに出力したい場合はシングルクォーテーションで囲むこと。
シングルクォーテーションを文字列として出力
シングルクォーテーションを含めてファイルに出力したい場合は以下のように記述する。
echo 'abc'\''de' > ~/temp.txt
abc'de
'\'
で\
をエスケープ文字として認識させ、次の'
を文字として出力する。
2行以上のテキストファイルを作成
複数行をまとめて出力したい場合はcat
コマンドとヒアドキュメントを用いる。
cat > ~/bin/sample.sh << EOF
#!/bin/bash
echo "Hello World."
EOF
echoを複数記述してファイル作成するより可読性が高くなるので2行以上の場合は使うことを推奨。
また、開始を示すキーワードは開始と終了で同じキーワードを使えば何でもよい。
ヒアドキュメントを使う際に変数展開をしない
bashスクリプトなどを自動作成するようなヒアドキュメントを記述しようとすると、
変数を使いたい場合がある。
前述のような記述をしてしまうと変数が自動的に展開されてしまう。
その場合は、開始のキーワードをシングルクォーテーションかダブルクォーテーションで囲む。
cat > ~/bin/sample.sh << "EOF"
#!/bin/bash
OUTPUT_STRING="Hello World."
echo ${OUTPUT_STRING}
EOF
sudoとヒアドキュメントでファイルを作成
sudo
コマンドを組み合わせて使う場合は、cat
とヒアドキュメントではファイルの作成ができない。その場合はtee
コマンドを組み合わせることでroot権限でファイルを作成することができる。
sudo tee /sample.sh << EOF > /dev/null
#!/bin/bash
echo "Hello World."
EOF
> /dev/null
を記述することによってtee
コマンドによる標準出力は捨てられるのでターミナル上には出力されない。
また、既存ファイルに追記したい場合は-a
オプションを用いる。
sudo tee -a /sample.sh << EOF > /dev/null
echo "Hello World2."
EOF
なお、上記の方法で実行した場合は所有者がrootユーザーになってしまうので
ユーザー権限で実行したい場合は別途以下のコマンドを実行して実行権限の付与と所有者の変更をしておく。
sudo chmod +x home/${USER}/bin/sample.sh
sudo chown -R ${USER}:${USER} home/${USER}/bin/sample.sh
ヒアドキュメント以外での出力方法
{}
で囲むと複数コマンドをまとめて実行できる。
{
echo '#!/bin/bash'
echo 'echo Hello World.'
} > ~/bin/sample.sh
echo
を大量に記述する必要が合ったり、シングルクォーテーションやダブルクォーテーションで囲むかで出力結果が変わったりと面倒な点が多いのでヒアドキュメントを使うのを推奨。
本来はテキストファイルへの出力(echo
コマンドの実行)を目的としたような使い方ではないので当然と言えば当然。
Discussion