web-dev-qa-db-ja.com

タッチとエコーを使用する以外に、bashでファイルを作成するより良い方法はありますか?

いくつかのアプリケーションをインストールするbashスクリプトを作成し、.confファイルを作成しました。ファイルを実行してすべてセットアップできるように、bashスクリプトでファイルを作成したかったのです。これよりも良い方法があるのか​​、それとも可能な限り最善の方法でやったのか。他にどんな選択肢があったのか疑問に思っています。

注:ファイルは機能します

if [ ! -e ~/.conf/file/path ]; then
   touch ~/.conf/file/path
   echo "
    long
    conf
    list
    here
    ..." >> ~/.conf/file/path
fi
4

スクリプトに関する限り、>ファイルへのリダイレクトを使用できます。ファイルが存在しないかどうかを尋ねています(if ! [ -e ~/.conf/file/path ];として表現する必要があります)。したがって、この特定のケースではappend演算子を使用する必要はありません(正常に機能していても)。

長い複数行の設定をファイルに出力することに関して、Pantherはすでに ここでdocscomment の下で Thomas's answer の下で使用することを示唆しています。これは、スクリプトに「ヘルプメッセージ」またはオプション情報を書き込むために個人的に使用する頻繁な手法です。

次のようなことを簡単に行うことができます。

bash-4.3$ cat > out.txt  <<EOF
> parameter1="value 1"
> parameter2="value 2"
> EOF
bash-4.3$ cat out.txt
parameter1="value 1"
parameter2="value 2"
bash-4.3$ 

または、特定の関数write_config()を作成して、スクリプトをより慣用的にすることもできます。

#!/usr/bin/env bash
# note usage of $HOME variable instead of ~
my_config="$HOME/my_conf_file.txt"
# declare all functions at the top
config_exists()[[ -e "$my_config" ]]

write_config(){
    cat > "$my_config" <<EOF
parameter1="value 1"
parameter2="varlue 2"
EOF
}

if ! config_exists;
then
    echo "config doesn't exist"
    write_config
fi
2

ファイルが存在しない場合は、echo "text" >> /path/to/fileを実行します。

テキストのリダイレクトと追加の素晴らしい点は、出力がファイルパスであり、ファイルがまだ存在しない場合、>または>>が使用されているかどうかに関係なく、ファイルを作成することです。 。通常、ファイルをtouchする必要はありません。 (ただし、ファイルが存在しないことが確実な場合は、>の代わりに>>を使用してください。>>はファイルに追加するものですが、ファイルが存在しない場合は、 ...)

5
Thomas Ward

「長いconfリスト」が長すぎてシェルスクリプトの読みやすさが妨げられている場合は、スクリプトに付随する別のファイルに配置するだけではどうでしょうか。その後、シェルスクリプトで行う必要があるのは、そのファイルを宛先にコピーすることだけです。

if [ ! -e ~/.conf/file/path ]; then
   cp /path/to/mytemplate ~/.conf/file/path
fi
0
thomasrutter