Hinzufügen oder aktualisieren einer Konfiguration Eintrag in /etc/environment
Meine /etc/environment sieht wie folgt aus:
cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
Möchte ich mit einem Befehl (sed, awk, python, was auch immer....) damit wird es wie folgt Aussehen:
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"
Nun der Haken ist, eher würde ich es eine 1-liner (in den Bereichen der sed -XYZ /DoMagic//etc/environment), die es enthalten muss Zusammenführungs-Logik, die ist - entweder fügt eine neue Konfiguration aufnehmen oder einen vorhandenen Eintrag aktualisieren. Bottom line, Sie sollten verhindern, dass die Datei so Aussehen: (Verursacht durch erfahrene shell-skriptschreiber Aufruf von echo >> bei jedem Aufruf)
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"
Ich denke, dies ist ein trick, Fragen, weil das, was ich versuche zu vermeiden, verwenden von benutzerdefinierten Skripts, wie
/usr/local/bin/PropUpdate /etc/environment JAVA_HOME "/usr/lib/jvm/java-6-sun"
/usr/local/bin/PropUpdate ist das folgende Skript (geschrieben für den sake des Beispiels, kann bugs enthalten. Kommentare sind geschätzt)
#!/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}\).*$|\1${CONFIGURATION_VALUE}|g" "${CONFIGURATION_FILE}"
sed -i "s|^\(${CONFIGURATION_PARAMETER}${SUFFIX_REGEX}\).*$|\1${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
Danke,
Maxim.
-- Update: ich habe tatsächlich irgendwie gefiel das Skript, so habe ich verbessert es ein bisschen. Es scheint nun die Produktion bereit. Genießen.
bitte schreiben Sie das als Antwort, so kann ich es akzeptieren. Das ist das tool, das ich suchte.
InformationsquelleAutor Maxim Veksler | 2010-07-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt zu versuchen, zu analysieren
/etc/environment
- Datei, könnten Sie stattdessen erstellen Sie eine Datei mit Ihrem eigenen Namen in/etc/profile.d/
, wie ich es beschrieben in meine Antwort auf eine relevante Frage. Dann könnte man es einfach kopieren auf die während der installation, denn es enthält nur Ihren Inhalt. Geschweige denn, dass es um Ihre Skripte kürzer.InformationsquelleAutor P Shved
Den
grep
Befehl " 0 " zurückgibt (true), wenn das Muster gefunden wird in der Datei. So, das oben liest:prüfen, ob JAVA_HOME gesetzt ist in der Datei
ODER legen Sie JAVA_HOME in der Datei
Wie Sie sehen können, wenn Sie aufrufen, diese one-liner, die mehrere Male, in späteren aufrufen nicht hinzufügen, um die Datei, da grep gibt true zurück, bevor Sie versuchen, hängen Sie die Datei.
JAVA_HOME="`find /usr/lib/jvm/ -name \\*-sun | sort -n | head -1`"
Oder Sie könnten
grep -q 'JAVA_HOME="/usr/lib/jvm/java-6-sun"'
. . . mit shell-Skripten und viele Konfigurations-Dateien, die neueste definition clobbers alle vorherigen Definitionen. Entweder Sie "wäre es lieber, es werden ein 1 liner", wie Sie erklärte in Ihrer Frage, in welchem Fall Sie bewerten den Rückgabewert von grep, oder Sie wirklich wollen, eine verallgemeinerte Konfiguration-management-system wie das der bot von cfengine oder puppet. (Ich bin mir ziemlich verdammt sicher, dass Ubuntu übernimmt diese banalen details zur Konfiguration, wie gut es sein sollte.)InformationsquelleAutor
In meinem Ubuntu-system, meine JAVA_HOME sieht wie folgt aus:
Blick auf die Datei mit
ls -l /usr/lib/jvm/default-java
ich bemerkte dies:In anderen Worten, der Weg in die soft-link ist das einzige, was Sie ändern müssen.
Sehen die Liste der installierten Java-Umgebungen, habe ich dieses
ls -l ...
Befehl:So, jetzt kann ich wechseln zu einer anderen Standard-mit:
Und die JAVA_HOME-variable ausgeführt wird Java 7 von Oracle.
InformationsquelleAutor Alexis Wilke