2016-08-17 2 views
0

Существуют следующие альтернативы для передачи параметров исполняемому файлу в оболочке Bash. Я считаю, что первый метод более распространен в настоящее время.Недостатки использования переменных среды для передачи параметров

Метод 1 - передать переменные в качестве аргументов командной строки

./myprogram --arg1 1 

метод 2 - параметры передачи в качестве за вызов переменных среды

arg1=1 ./myprogram 

Какие проблемы могут возникнуть при используя второй метод?

Это тесно связанный с ним вопрос (Argument passing strategy - environment variables vs. command line) обращается к более широкому использованию переменных окружения, а не непосредственного использования каждого вызова, что я заинтересован.

+2

Нет проблем, на самом деле. Эти два не взаимозаменяемы; ваш сценарий должен быть написан правильно, чтобы принять его. Единственным недостатком переменной среды по сравнению с параметром командной строки является то, что вы можете установить переменную среды в своей оболочке и забыть об этом. Ваша программа не знает и не заботится о том, как она была установлена, и вы можете поцарапать голову, когда './Myprogram' неожиданно работает так же, как' arg1 = 1./Myprogram'. Труднее случайно добавить параметр командной строки для вызова. – chepner

ответ

3

Первый метод является более распространенным, так проще для других Понимаю.

В большинстве случаев, когда используется переменная среды ($ ORACLE_HOME, $ JAVA, ..), она не установлена ​​в командной строке, а некоторое время ранее и используется разными скриптами. Поэтому, когда вы считаете, что ваш var должен быть частью конфигурации, использование переменной среды (как значения по умолчанию) прекрасное.
В других случаях я бы использовал параметры.

Как насчет необходимости модифицировать скрипт:

# First script calling myprogram that uses ... 
# Difficult to see, the vars name and lastname 
name="John" 
while read -r lastname; do 
    ./myprogram 
done < lastnames.txt 

Теперь кто-то хочет изменить цикл и получить все пользователи с переменной окружения пользователя из базы данных.

name="John" 
while read -r lastname; do 
    ./myprogram 
    username="${lastname}" ~/bin/getdbusers 
done < lastnames.txt 

На этот раз вам повезло, то второй человек также использует вар username и не подозревает о том, что ./myprogram использует lastname. Он соблазн ввести ошибку, изменив переменный цикл:

name="John" 
while read -r username; do 
    ./myprogram # Oops, this should have been changed into lastname=username ./myprogam 
    ~/bin/getdbusers 
    ~/bin/somethingWithUserName 
done < lastnames.txt 

Это Становится все труднее понять, какие программы использовать $ имени и другой ВАР.
Использование параметров облегчит понять и ошибки держали подальше:

name="John" 
while read -r lastname; do 
    ./myprogram "${name}" "${lastname}" 
    ~/bin/getdbusers "${lastname}" 
    ~/bin/somethingWithUserName "${lastname}" 
done < lastnames.txt 
+0

+1 Хорошие заметки об использовании переменных среды в целом, но я специально задавал вопрос о явной форме использования для каждого вызова, где, я думаю, будет сложнее ввести типы ошибок, которые вы предупреждаете. Я вижу искушение использовать переменные неявно, как вы описываете. Но для того, чтобы эти фрагменты работали, они, вероятно, также требуют оператора 'export', что может сделать его немного менее соблазнительным, чтобы обмануть, как это, - или более ясно, когда вы это делаете. – nobar

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