Ajouter ou mettre à jour un enregistrement de la configuration dans /etc/environment
Mon /etc/environnement ressemble à ceci:
cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
Je souhaite utiliser une commande (sed, awk, python, etc....) que va faire ressembler à ceci:
cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
JAVA_HOME="/usr/lib/jvm/java-6-sun"
Maintenant, le hic, c'est que je préférerais qu'il soit un 1 liner (dans les domaines de la sed -XYZ /DoMagic//etc/environnement), il doit contenir logique de fusion qui est - soit ajoute un nouvel enregistrement de la configuration ou la mise à jour d'une base existante. Ligne de fond, il doit prévenir le fichier à partir de la recherche comme ceci: (Causés par la connu les créateurs de scripts shell appelant echo >> à chaque invocation)
cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
JAVA_HOME="/usr/lib/jvm/java-5-sun"
JAVA_HOME="/usr/lib/jvm/java-6-sun"
JAVA_HOME="/usr/lib/jvm/java-6-sun"
JAVA_HOME="/usr/lib/jvm/java-6-sun"
Je suppose que c'est un truc de questions, parce que ce que j'essaie d'éviter d'utiliser des scripts personnalisés, tels que
/usr/local/bin/PropUpdate /etc/environment JAVA_HOME "/usr/lib/jvm/java-6-sun"
/usr/local/bin/PropUpdate est le script suivant (écrit pour l'amour d'exemple, peut contenir des bugs. Les commentaires sont appréciés)
#!/bin/bash
# Append/Update a configuration record in a file
#
# Usage example:
# /usr/local/bin/PropUpdate /etc/environment JAVA_HOME "/usr/lib/jvm/java-6-sun"
#
# Author Maxim Veksler <[email protected]>
# Version 0.5-2010-07-27
EXPECTED_ARGS=3
E_BADARGS=3
E_BADFILE=4
if [[ $# -ne ${EXPECTED_ARGS} ]]; then
echo "Usage: `basename $0` /path/to/config.conf ParameterName newValueText" >&2
exit $E_BADARGS
fi
CONFIGURATION_FILE="$1"
CONFIGURATION_PARAMETER="$2"
CONFIGURATION_VALUE="$3"
if [[ ! -e "${CONFIGURATION_FILE}" ]]; then
echo "Configuration file ${CONFIGURATION_FILE} does not exist" >&2
exit $E_BADFILE
fi
if [[ ! -w "${CONFIGURATION_FILE}" ]]; then
echo "Can't modify ${CONFIGURATION_FILE}" >&2
exit $E_BADFILE
fi
#########################################
## Decide what parameter we are adding ##
#########################################
__param_found=0
# First check CONFIGURATION_PARAMETER supplied by use that contains "="
if [[ ${CONFIGURATION_PARAMETER} == *=* ]]; then
# It should exist in the file, plain
if grep -qE "^${CONFIGURATION_PARAMETER}" "${CONFIGURATION_FILE}"; then
__param_found=1
SUFFIX_REGEX='[[:space:]]*'
fi
else
# OK, sophisticated user, did not send "=" with the parameter...
if grep -qE "^${CONFIGURATION_PARAMETER}[[:space:]]*=" "${CONFIGURATION_FILE}"; then
# Let's check if such configuration with Parameter + "=" exists
__param_found=1
SUFFIX_REGEX='[[:space:]]*=[[:space:]]*'
elif grep -qE "^${CONFIGURATION_PARAMETER}[[:space:]]+" "${CONFIGURATION_FILE}"; then
# If such parameter exists, at all
__param_found=1
SUFFIX_REGEX='[[:space:]]\+'
fi
fi
if [[ $__param_found == 1 ]]; then
#echo sed -i "s|^\(${CONFIGURATION_PARAMETER}${SUFFIX_REGEX}\).*$|${CONFIGURATION_VALUE}|g" "${CONFIGURATION_FILE}"
sed -i "s|^\(${CONFIGURATION_PARAMETER}${SUFFIX_REGEX}\).*$|${CONFIGURATION_VALUE}|g" "${CONFIGURATION_FILE}"
else
if [[ ${CONFIGURATION_PARAMETER} == *=* ]]; then
# Configuration parameter contains "=" in it's name, good just append
echo "${CONFIGURATION_PARAMETER}${CONFIGURATION_VALUE}" >> "${CONFIGURATION_FILE}"
else
# Try to guess if this file is a "param = value" or "param value" type of file.
if grep -qE "^[[:alnum:]]+[[:space:]]*=" "${CONFIGURATION_FILE}"; then
# Seems like a "param = value" type of file
echo "${CONFIGURATION_PARAMETER}=${CONFIGURATION_VALUE}" >> "${CONFIGURATION_FILE}"
else
# Seems like a "param value" type of file
echo "${CONFIGURATION_PARAMETER} ${CONFIGURATION_VALUE}" >> "${CONFIGURATION_FILE}"
fi
fi
fi
#cat $CONFIGURATION_FILE
Merci,
Maxim.
-- Mise à jour: en fait j'ai plutôt aimé ce script, donc j'ai amélioré un peu. Il semble maintenant être prêt pour la production. Profitez de.
veuillez écrire cela comme une réponse afin que je puisse l'accepter. C'est l'outil que je cherchais.
OriginalL'auteur Maxim Veksler | 2010-07-25
Vous devez vous connecter pour publier un commentaire.
Au lieu d'essayer d'analyser
/etc/environment
fichier, vous pouvez créer un fichier avec votre propre nom dans/etc/profile.d/
, comme je l'ai décrit dans ma réponse à une question pertinente. Ensuite, vous pouvez simplement copier lors de l'installation, car il contient seulement votre contenu. Sans parler qu'il va rendre vos scripts plus courte.OriginalL'auteur P Shved
La
grep
commande retourne 0 (vrai) si le modèle est trouvé dans le fichier. Ainsi, le dessus de lit:vérifier si JAVA_HOME est définie dans le fichier
OU set JAVA_HOME dans le fichier
Comme vous pouvez le voir, si vous appelez ce one-liner à plusieurs reprises, à la suite d'invocations ne pas ajouter dans le fichier parce que grep renvoie true avant de tenter d'ajouter le fichier.
JAVA_HOME="`find /usr/lib/jvm/ -name \\*-sun | sort -n | head -1`"
Ou vous pourriez
grep -q 'JAVA_HOME="/usr/lib/jvm/java-6-sun"'
. . . avec les scripts shell, et de nombreux fichiers de configuration, la dernière définition clobbers toutes les définitions précédentes. Soit vous "serait plutôt d'être un 1 liner" comme vous l'avez indiqué dans votre question, auquel cas vous évaluer le code de retour de la commande grep, ou que vous voulez réellement généralisée de système de gestion de configuration comme celle offerte par cfengine ou de marionnettes. (Je suis sacrément sûr que Ubuntu s'occupe de ces banales détails de la configuration, ainsi qu'elle le devrait.)OriginalL'auteur
Dans mon système Ubuntu, mon JAVA_HOME ressemble à ceci:
En regardant ce fichier avec
ls -l /usr/lib/jvm/default-java
j'ai remarqué ceci:En d'autres termes, le chemin d'accès dans le doux lien est la seule chose que vous avez à changer.
Pour voir la liste des environnements Java installés, j'ai utilisé cette
ls -l ...
commande:Alors maintenant, je peux passer à un autre défaut:
Et la variable JAVA_HOME va exécuter Java 7 d'Oracle.
OriginalL'auteur Alexis Wilke