ошибка при использовании командной строки в качестве псевдонима bash в linux

2496
cfischer

Я хочу сохранить следующую последовательность командной строки как псевдоним bash:

grep `date '+%d/%b/%Y'` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '' | sort |uniq -c -w15 |sort -n 

Он отлично работает из командной строки, но не работает, когда я пытаюсь установить его в качестве псевдонима. Я попытался добавить следующее .bash_profile:

alias downloads="grep `date '+%d/%b/%Y'` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '' | sort |uniq -c -w15 |sort -n" 

и я получаю следующие ошибки:

-bash-3.2$ downloads awk:  awk: ^ syntax error awk:  awk: ^ syntax error awk:  awk: ^ syntax error awk:  awk: ^ syntax error awk:  awk: ^ syntax error awk:  awk: ^ syntax error 

Что я делаю неправильно????

4

5 ответов на вопрос

6
A Dwarf

Я немного зеленоват в Linux, поэтому не уверен, почему он не работает. Но вы можете использовать функцию вместо этого.

В .profile / .bashrc создайте новую функцию:

downloads() { grep `date '+%d/%b/%Y'` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '' | sort |uniq -c -w15 |sort -n; } 

Это работает именно как псевдоним.

Ах! Нагул знает, почему это не работает :) A Dwarf 14 лет назад 1
(+1) Если бы у меня не было веской причины предпочитать псевдоним функции, я бы предпочел это. Это чище и более очевидно, чем экранированная версия псевдонима. nagul 14 лет назад 0
5
Jonathan Leffler

Честно говоря, к тому времени, когда команда становится настолько большой, я превращаю ее в сценарий, а не в псевдоним. Одним из преимуществ скрипта является то, что вы заставляете его работать с большим количеством файлов, чем просто «access.logs».

Эта последовательность команд включает в себя одинарные кавычки и обратные кавычки - это всегда добавляет веселья. Как правило, лучше использовать $(command args)вместо обратных кавычек.

Когда вы используете двойные кавычки вокруг псевдонима, команды с обратными кавычками выполняются при создании псевдонима - если только оболочка не имеет другого способа интерпретации вещей, когда они определяют псевдоним. Кроме того, $varвыражения оцениваются в двойных кавычках, поэтому ваши awkошибки показывают, что у вас нет аргументов в текущей оболочке.

Таким образом, если вы должны использовать псевдоним, то вам, вероятно, нужно использовать одинарные кавычки вокруг всего выражения, а также для каждого отдельного предложения, которое появляется в выражении, заменить его последовательностью котировка-обратной косой кавычки кавычки: '\''. Первая кавычка завершает текущую строку в кавычках; кавычка с обратной косой чертой представляет собой буквальную кавычку; окончательная цитата перезапускает цитируемую строку.

Это приводит к:

alias downloads='grep `date '\''+%d/%b/%Y'\''` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py | awk '\'''\'' | sort | uniq -c -w15 | sort -n' 
Это отличный совет! Вы также можете создать «функцию bash», но, скорее всего, сценарий предпочтительнее (по крайней мере, для переменных областей видимости). Функции не наследуются подоболочками, но сценарии по-прежнему можно найти через $ PATH ericslaw 14 лет назад 0
«Функции не наследуются подоболочками» - но вы можете сделать `export -f имя_функции` Dennis Williamson 14 лет назад 1
4
nagul

Поскольку псевдоним определяется в двойных кавычках, команда date выполняется во время определения псевдонима, а $1переменные также раскрываются. Вы можете проверить это, посмотрев псевдоним после того, как определите его:

$ alias downloads="grep `date '+%d/%b/%Y'` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '' | sort |uniq -c -w15 |sort -n" $ alias downloads alias downloads='grep 27/Sep/2009 access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\'''\'' | sort |uniq -c -w15 |sort -n' 

Вы должны быть в состоянии исправить это, избегая вызова даты и $1переменных:

$ alias downloads="grep \`date '+%d/%b/%Y'\` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '' | sort |uniq -c -w15 |sort -n" $ alias downloads alias downloads='grep `date '\''+%d/%b/%Y'\''` access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\'''\'' | sort |uniq -c -w15 |sort -n' 

Проверьте, можете ли вы запустить это успешно. В идеале вы должны определять псевдоним в одинарных кавычках, но наличие одинарных кавычек в самом псевдониме делает это сложным в вашей ситуации.

3
Dennis Williamson

Другим вариантом является использование одинарных кавычек для внешних и экранирование и цитирование внутренних. Вы можете выбрать, какой метод (этот или тот, что есть в ответе Нагула ) принесет наименьший уродливый результат для конкретной ситуации.

alias downloads='grep $(date '\''+%d/%b/%Y'\'') access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\'''\'' | sort |uniq -c -w15 |sort -n' 

Вы, вероятно, заметите, что это то, что aliasраспечатывается в любом случае, если вы избежите всех знаков доллара.

Я взял на себя смелость поменять галочки $()для удобства чтения и универсальности .

Если вы используете метод Нагула (включая двойные кавычки для внешних) и $()вместо обратных кавычек, все, что вам нужно, - это знаки доллара.

alias downloads="grep \$(date '+%d/%b/%Y') access.logs | egrep 2765330645ae47d292c9ceac725d744e.py |awk '' | sort |uniq -c -w15 |sort -n" 

Что делает метод запоминающимся и очень последовательным.

0
cokedude

Как бы вы использовали значение, полученное из awk, и сохранили его как переменную? Это то, с чего я начинаю.

alias xx2='xrandr | awk '\''$2=="connected" END'\'''

Это то, что я пытаюсь сделать.

VAR=$(xrandr | awk '$2=="connected" END'); xrandr --output $VAR --mode 1024x768 --rate 60; xrandr --output LVDS1 --left-of $VAR; xrandr --output LVDS1 --primary; unset VAR;

Это была моя первая идея. Я видел, что это не присваивает значение VAR после того, как я пытаюсь открыть OMG.

alias xx2='VAR=$(xrandr | awk '\''$2=="connected" END'\''); echo $VAR > OMG'

Похожие вопросы