2013-07-25 4 views
1

в приведенном ниже коде BASH переменная ECHO_ALL является глобальной и установлена ​​либо в «да», либо «нет» на основе анализа параметров ввода.Передайте полную строку сценария bash другой функции bash для выполнения

--- начало ~/скрипты/Util/util-optout.sh ---

######################################## 
# @param [email protected] 
# @return the return value from [email protected] 
# @brief A wrapper function to allow 
#   for OPTional OUTput of any 
#   command w/wo args 
####################################### 
optout() 
{ 
    if [ ${ECHO_ALL} = 'no' ]; then 
     "[email protected]" 1>/dev/null 2>&1 
     return $? 
    else 
     "[email protected]" 
     return $? 
    fi 
} 

--- конец файла ---

в другом файле Баш я источник выше файла util-optout.sh и использовать функцию optout(), чтобы разрешить условный вывод .. по существу разрешить условное перенаправление любых команд, выводимых на/dev/null, чтобы заставить скрипты молчать.

, например, в каком-то другом сценарии сборки у меня есть

source ~/scripts/util/util-optout.sh 

optout pushd ${ZLIB_DIR} 
optout rm -vf config.cache 

optout CC=${BUILD_TOOL_CC} ./configure ${ZLIB_CONFIGURE_OPT} --prefix=${CURR_DIR}/${INSTALL_DIR} 
#  ^^^^^^^^^^^^^^^^^^^ 
# ^this breaks my optout() command 
# my optout() fails when there are prefixed bash env vars set like CC=${...} before ./configure 

optout popd 
optout make -C ${ZLIB_DIR} ${ZLIB_COMPILER_OPT} all 
optout make -C ${ZLIB_DIR} install 

для простых команд с любым типом параметров после него, как «Pushd» или «ет» .. OptOut() отлично работает. даже оконечные устройства make-C работают нормально.

, но он дает мне ошибку для команд, которые имеют префикс ENV-вары устанавливаются как Optout CC = $ {...} ./configure ...

Utils/util-optout.sh: линия 33 : CC = gcc: команда не найдена

Есть ли способ заставить мою функцию optout() работать для ЛЮБОЙ возможной допустимой строки сценария bash.

Я знаю, что это имеет какое-то отношение к использованию «$ @» или «$ *» в моей функции optout(), но я подробно изучил страницы руководства bash, и я не могу заставить это работать все возможные случаи линии bash.

до сих пор единственный способ преодолеть это ограничение с помощью моего optout() - это следующий трехстрочный стиль; что раздражает.

export CC=${BUILD_TOOL_CC} 
optout ./configure ${ZLIB_CONFIGURE_OPT} --prefix=${CURR_DIR}/${INSTALL_DIR} 
unset CC 

Любые идеи о том, как свести все это обратно в один OptOut ... линия

ответ

3

optout является командой, как и любой другой, и поэтому должны предшествовать любые локальные изменения в окружающую среду. Команда, которая запускает optout, наследует эту среду.

CC=${BUILD_TOOL_CC} optout ./configure ${ZLIB_CONFIGURE_OPT} --prefix=${CURR_DIR}/${INSTALL_DIR} 

Кстати, это только одна из проблем, которые вы, вероятно, столкнутся с optout функции. Вы не можете запускать произвольные командные строки таким образом, только простую команду, за которой следует ноль или более аргументов (и я ожидаю, что есть некоторые исключения даже для этого ограниченного набора).

+0

wow .. Я, очевидно, смотрел на эту проблему, чтобы долго видеть лес с деревьев! –

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