Как правильно экранировать функцию bash в псевдониме - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть несколько команд bash, которые я успешно передал вместе:

$> foo --color=RED | grep -Eo '(v[1-9])'

$> v1

Предположим, foo - это псевдоним, который печатает многои я хочу получить version number и передать его другой команде bar, которая получает id.Поэтому я добавляю это, и это работает:

$> foo --color=RED | grep -Eo '(v[1-9])' | \ awk '{print "bar --version="$1" --color=RED"}' | xargs -0 bash -c

$> ID: 1234

Отлично .Теперь я хотел бы создать запись в моем .aliases файле, чтобы я мог просто запустить ее так:

$> wombat RED

Проблемы: я не могу получить эторабота

alias wombat='function _w() { 
    COLOR=$1; # cache the color
    foo --color=$COLOR | grep -Eo "(v[1-9])" | \
    awk '{print "bar --version=$1 --color=$COLOR"}' | xargs -0 bash -c; 
};_w'

Кажется, проблема в том, как я убегаю (или не убегаю) вокруг команды awk. Примечание: В команде awk мне нужно указать оба version number и color, которые я передал псевдониму.

Я пыталсямного вариантов, но, кажется, не могу понять это правильно.Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Непосредственная проблема заключается в том, что кавычки не вкладываются - вы не можете вложить строку в одинарных кавычках (скрипт awk) внутри строки в одинарных кавычках (определение псевдонима).Есть способы заставить это работать, но намного проще просто пропустить часть псевдонима полностью.Создание псевдонима, который определяет функцию, а затем немедленно выполняет ее, бессмысленно;просто определите функцию один раз, используйте ее как обычно.Например:

wombat() { 
    local color="$1" # cache the color
    foo --color="$color" | grep -Eo "(v[1-9])" | \
        awk -v color="$color" '{print "bar --version=" $1 " --color=" color}' | \
        xargs -0 bash -c;
}

Обратите внимание, что я также внес несколько изменений в способ обработки имени цвета: я использовал имя переменной оболочки в нижнем регистре (есть несколько имен всех заглавных букв со специальным значением, поэтому используйтеимена в нижнем или смешанном регистре для ваших собственных вещей более безопасны), я сделал эту переменную оболочки local и передал ее в awk как переменную, а не пытался встраивать ее буквально в сценарий awk.Наконец, в сценарии awk я помещаю ссылки на $1 и переменную color вне строк в кавычках, чтобы они были расширены до их значений, а не использовались буквально.

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

Поскольку у меня на самом деле нет fooили bar программ, я на самом деле не проверял это.Но, насколько я понимаю, должен работать.

0 голосов
/ 19 декабря 2018

Включите отладку оболочки Bash, чтобы увидеть, как ваши псевдонимы и функции интерпретируются до того, как они будут выполнены

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html

Существует несколько способов включить отладку.Одним из них является запуск нового сеанса Bash в режиме отладки, bash -x.Другой способ заключается в использовании разрешения отладки в существующем сеансе Bash, set -x

...