3

Мои /и т.д./окружение выглядит следующим образом:Добавить или изменить запись конфигурации в/и т.д./окружающей среде

cat /etc/environment 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" 

Я хотел бы использовать команду (SED, AWK, питон, независимо ....), что сделает его выглядеть следующим образом:

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" 

Теперь улов, я предпочел бы это быть 1 вкладыш (в области SED -XYZ/DoMagic// и т.д./окружающей среды), она должна содержать объединяющая логика - либо добавляет новую запись конфигурации, либо обновляет существующую. Нижняя линия, она должна предотвратить файл от вида: (Вызванная в опытных скриптерах оболочки вызывая эхо >> на каждый вызов)

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" 

Я предполагаю, что это трюк вопросы, потому что я пытаюсь избегать использования пользовательских сценариев, таких как

/usr/local/bin/PropUpdate /etc/environment JAVA_HOME "/usr/lib/jvm/java-6-sun" 

/USR/местные/бен/PropUpdate является следующий сценарий (написанный для примера, может содержать ошибки. Комментарии приветствуются)

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

Спасибо, Maxim.

- Обновление: мне действительно понравился этот скрипт, поэтому я немного его улучшил. Кажется, сейчас готово производство. Наслаждаться.

+3

Использовать http://augeas.net/? – Zoredache

+0

@Zoredache, пожалуйста, напишите это как ответ, чтобы я мог его принять. Это инструмент, который я искал. –

ответ

3

Вместо того, чтобы пытаться проанализировать файл /etc/environment, вы могли бы создать файл с вашим собственным именем в /etc/profile.d/, как я описал в my answer to a relevant question. Затем вы можете просто скопировать его во время установки, потому что он содержит только ваш контент. Не говоря уже о том, что это сделает ваши скрипты короче.

+2

Спасибо, но я говорю об общей идее редактирования файлов конфигурации. Лоты задействованных систем не реализуют шаблон проектирования rc * .d. –

0
grep -q JAVA_HOME /etc/environment || echo 'JAVA_HOME="/usr/lib/jvm/java-5-sun"' >> /etc/environment 

Команда grep возвращает 0 (true), если шаблон найден в файле. Итак, выше гласит:

проверить, если JAVA_HOME установлен в файле
ИЛИ установить JAVA_HOME в файле

 
0-15:49 [email protected] ~# cat /etc/environment 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" 
0-15:49 [email protected] ~# grep JAVA_HOME /etc/environment && echo true 
1-15:49 [email protected] ~# grep -q JAVA_HOME /etc/environment || echo 'JAVA_HOME="/usr/lib/jvm/java-5-sun"' >> /etc/environment 
0-15:49 [email protected] ~# grep JAVA_HOME /etc/environment && echo true 
JAVA_HOME="/usr/lib/jvm/java-5-sun" 
true 
0-15:49 [email protected] ~# grep -q JAVA_HOME /etc/environment || echo 'JAVA_HOME="/usr/lib/jvm/java-5-sun"' >> /etc/environment 
0-15:49 [email protected] ~# 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" 

Как вы можете видеть, если вы вызываете этот Однострочник несколько раз, последующие вызовы не добавляйте в файл, потому что grep возвращает true, прежде чем пытаться добавить файл.

+0

Да, но как насчет обновления файла? Скажем, я хочу заменить JAVA_HOME = "/ usr/lib/jvm/java-5-sun" с JAVA_HOME = "/ usr/lib/jvm/java-6-sun". Здесь начинается реальная проблема. –

+0

'JAVA_HOME =" \ 'find/usr/lib/jvm/-name \\ * - sun | sort -n | head -1 \' "' – dannyman

+0

Или вы можете 'grep -q 'JAVA_HOME ="/usr/lib/jvm/java-6-sun ". , , с shell-скриптами и многими конфигурационными файлами, последнее определение clobbers любых предыдущих определений. Либо вы «предпочтете, чтобы он был 1 лайнером», как вы заявили в своем вопросе, и в этом случае вы оцениваете код возврата из grep, или вы действительно хотите, чтобы система управления обобщенной конфигурацией, подобная предложенной cfengine или марионеткой. (Я, черт возьми, уверен, что Ubuntu справляется с этими подробными конфигурационными данными, а также должен). – dannyman

0

В моей системе Ubuntu, мой JAVA_HOME выглядит следующим образом:

JAVA_HOME=/usr/lib/jvm/default-java 

Глядя на этот файл с ls -l /usr/lib/jvm/default-java я заметил это:

lrwxrwxrwx 1 root root 24 Apr 27 2012 /usr/lib/jvm/default-java -> java-1.7.0-openjdk-amd64 

Другими словами, путь в мягкой линии связи является единственное, что вам нужно изменить.

Чтобы увидеть список установленных Java среды, я использовал эту ls -l ... команду:

prompt$ ls -l /usr/lib/jvm 
total 20 
lrwxrwxrwx 1 root root 24 Apr 27 2012 default-java -> java-1.7.0-openjdk-amd64 
drwxr-xr-x 4 root root 4096 Feb 23 17:54 java-1.5.0-gcj-4.8-amd64 
lrwxrwxrwx 1 root root 20 Sep 2 2012 java-1.6.0-openjdk-amd64 -> java-6-openjdk-amd64 
lrwxrwxrwx 1 root root 20 Jul 3 2013 java-1.7.0-openjdk-amd64 -> java-7-openjdk-amd64 
drwxr-xr-x 5 root root 4096 Oct 7 2012 java-6-openjdk-amd64 
drwxr-xr-x 3 root root 4096 Oct 7 2012 java-6-openjdk-common 
drwxr-xr-x 5 root root 4096 Sep 21 20:06 java-7-openjdk-amd64 
drwxr-xr-x 8 root root 4096 Sep 18 21:18 java-7-oracle 

Так что теперь я могу переключиться на другой по умолчанию с:

sudo rm /usr/lib/jvm/default-java 
sudo ln -s java-7-oracle /usr/lib/jvm/default-java 

и переменная JAVA_HOME будет работать Java 7 из Oracle.

Смежные вопросы