web-dev-qa-db-fra.com

Existe-t-il un meilleur moyen de créer un fichier en bash que d’utiliser touch and echo?

J'ai créé un script bash qui a installé certaines applications et écrit un fichier .conf. Je voulais que mon script bash crée le fichier pour moi afin que je puisse simplement exécuter le fichier et tout configurer. y avait-il une meilleure façon de s'y prendre que cela ou je l'ai fait de la meilleure façon possible. je me demandais simplement quelles autres options j'avais.

Note: le fichier fonctionne

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

En ce qui concerne votre script, vous pouvez utiliser la redirection > vers un fichier. Vous demandez si le fichier n'existe pas (ce qui devrait être mieux exprimé par if ! [ -e ~/.conf/file/path ];]), il n'est donc pas nécessaire d'utiliser l'opérateur append dans ce cas particulier (même si cela fonctionne correctement).

En ce qui concerne l’impression d’une longue configuration multiligne dans le fichier, Panther a déjà fait allusion à l’utilisation de ici docs dans son commentaire sous réponse de Thomas . C'est une technique fréquente que j'utilise personnellement pour écrire des "messages d'aide" ou des informations sur les options dans mes scripts.

Vous pouvez facilement faire quelque chose comme ça:

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$ 

Vous pouvez également créer une fonction spécifique, write_config() pour rendre votre script plus idiomatique, pour ainsi dire:

#!/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

Il suffit de faire echo "text" >> /path/to/file si le fichier n'existe pas.

La bonne chose à propos de la redirection de texte et des ajouts est que si votre sortie est un chemin de fichier et que le fichier n'existe pas déjà, il créera le fichier, que > ou >> soit utilisé. . Pas besoin de touch le fichier du tout, généralement. (Cependant, si vous êtes sûr que le fichier n'existe pas, utilisez simplement > au lieu de >>; >> pour l'ajouter à un fichier, mais si le fichier n'existe pas, alors ...)

5
Thomas Ward

Si la "longue liste de configuration" est si longue qu'elle gêne la lisibilité de votre script Shell, pourquoi ne pas la placer simplement dans un fichier séparé qui l'accompagne? Ensuite, tout ce que vous devez faire dans le script Shell est de copier ce fichier dans la destination.

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