🗒️

Linuxでのテキストファイルへの出力コマンドまとめ

2024/04/13に公開

DockerやTerraformなどでLinux環境を立ち上げる際に設定ファイルを自動で作成する必要がある。
以下でよく使うファイル出力コマンドについてまとめる。


1行だけ記述したテキストファイルを作成・追記

1行だけの場合は以下のようにechoコマンドで出力するのが手っ取り早い。

echo 'export PATH=$PATH:~/bin' >> ~/.bashrc

なお、>>は既存ファイルに追記する形式で出力する。
新規ファイルとして作成したい場合は>を使う。

echo "gnome-session --session=ubuntu" > ~/.xsession

なお、ダブルクォーテーションで括った際に変数が含まれている場合、自動的に変数展開されてしまうので、変数を含めてファイルに出力したい場合はシングルクォーテーションで囲むこと。

シングルクォーテーションを文字列として出力

シングルクォーテーションを含めてファイルに出力したい場合は以下のように記述する。

echo 'abc'\''de' > ~/temp.txt
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コマンドの実行)を目的としたような使い方ではないので当然と言えば当然。


reference

Discussion