2015-05-10 4 views
0

Мой вопрос прост.bash echo wrapper issue

Я использую некоторые обломоки echo/print вместо простых вызовов эха в более крупном сценарии bash. Пример:

!/bin/bash 
function print_common() { echo "[email protected]"; } 
function print_inf () { echo "INFO: $(print_common [email protected])"; } 
function print_war () { echo "WARN: $(print_common [email protected])"; } 
function print_err () { echo "ERROR: $(print_common [email protected])"; } 

Как правило, он работает очень хорошо. Ниже script1.sh:

!/bin/bash 
print_err "Whoops!" 

генерирует:

ERROR: Whoops! 

Однако script2.sh:

!/bin/bash 
print_err "*** Whoops!" 

генерирует:

ERROR: script2.sh Whoops! 

ожидаемый результат печати:

ERROR: *** Whoops! 

Благодарим за помощь!

+4

Все '$ @', чтобы избежать globbing: '' $ @ "' – Cyrus

+0

спасибо Cyrus и stackoverflow! –

+0

@Cyrus Это, вероятно, должно быть сделано ответом. –

ответ

1

В ваших эхо/печати оберток, завернуть переменную print_common с одиночными qoutes

Пример:

function print_err () { echo "ERROR: '$(print_common [email protected])'"; } 

Если вы не обернуть его в кавычки будет:

echo *** Whoops 

И если вы поместили звезду (*) в качестве аргумента в команду echo, она покажет вам список всех файлов внутри каталога, где выполняется scirpt.

Использование цитат покажет вам, что вы хотите.

+1

Спасибо за ваше усилие, рогивое! Однако я считаю ответ Кира самым изящным! К сожалению, я не могу отметить комментарий, чтобы быть принятым ответом. Хорошие точки в любом случае! –

+0

Это на самом деле не работает. Внешняя функция расширяет аргументы в команде, которая должна выполняться, и суб-оболочка затем все еще глотает их. Решение Кира в комментарии верное. Перемещение одиночных кавычек * внутри * '$ (...)' (вокруг '$ @') действительно работает, но оно все же менее корректно. –