alias ou função bash não funciona

3

Quando eu crio

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'

ou

function wd () {
    ps -ef | grep java | awk '{print $2}' ...
}

no meu arquivo .bashrc, recebo erros. Curiosamente, se eu fonte meu arquivo .bashrc com a função, ele 'compila', mas ao executar, me dá:

 context is
     >>> \ <<< {\print
    missing }

Alguém pode me ajudar com isso, e também responder quando é melhor colocar algo em uma função versus em um alias?

    
por Amir Afghani 18.03.2011 / 19:23

3 respostas

6

Por que o alias não funciona

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'

O comando alias recebe três argumentos. A primeira é a string wd=ps -ef | grep java | awk {print (as aspas simples impedem que os caracteres entre elas tenham um significado especial). O segundo argumento consiste em um único caractere de espaço. (Em .bashrc , os parâmetros posicionais $2 e $9 estão vazios, então $2 expande para uma lista de 0 palavras.) O terceiro argumento é } | egrep "(A|B|C|D)" (novamente as aspas simples protegem os caracteres especiais).

A definição do alias é analisada como qualquer outro comando shell quando é encontrado. Em seguida, a cadeia definida para o alias é analisada quando o alias é expandido. Aqui estão algumas maneiras possíveis de definir esse alias. Primeira possibilidade: como toda a definição de alias está entre aspas simples, use apenas aspas duplas nos comandos, o que significa que você deve proteger o " e $ destinados ao awk com barras invertidas.

alias wd='ps -ef | grep java | awk "{print \ \" \" \}" | egrep "(A|B|C|D)"'

Segunda possibilidade: cada caractere se destaca entre aspas simples, exceto que uma aspa simples termina a string literal. '\'' é uma expressão idiomática para “aspas simples dentro de uma sequência de aspas simples”: finalize a sequência de aspas simples, coloque uma aspa simples literal e inicie imediatamente uma nova sequência de aspas simples. Como não há espaço intermediário, ainda é a mesma palavra.

alias wd='ps -ef | grep java | awk '\''{print $2 " " $9}'\'' | egrep "(A|B|C|D)"'

Você pode simplificar isso um pouco:

alias wd='ps -ef | grep java | awk '\''{print $2, $9}'\'' | egrep "(A|B|C|D)"'

Dica: use set -x para ver como o shell está expandindo seus comandos.

Por que a função não funciona

Eu não sei. A parte que você mostra parece ok. Se você ainda não entender por que sua função não está funcionando depois das minhas explicações, copie e cole seu código.

Alias ou função?

Use um alias apenas para coisas muito simples, geralmente para atribuir um nome mais curto a um comando usado com freqüência ou fornecer opções padrão. Exemplos:

alias grep='grep --color'
alias cp='cp -i'
alias j=jobs

Para algo mais complicado, use funções.

O que você deveria ter escrito

Em vez de analisar a saída ps , faça com que ela gere a saída mais adequada a você.

wd () {
  ps -C java -o pid=,cmd= | egrep "(A|B|C|D)"
}
    
por 18.03.2011 / 20:16
2

O problema com o alias é que aspas não são aninhadas diretamente (exceto, como um caso especial, dentro de $() ). Você precisa escapar dos internos.

alias wd='ps -ef | grep java | awk {\'print $2 " " $9\'} | egrep "(A|B|C|D)"'
#                                   ^^               ^^

Você removeu muito do formulário de função para que eu tenha certeza, mas o fragmento de erro é de awk e sugere problemas de expansão de variáveis de shell ou cotação.

Como regra geral, as funções são mais flexíveis do que os aliases (você não tem controle sobre o processamento de argumentos com aliases além da expansão do histórico), mas os aliases são um pouco mais rápidos e se você terminar o alias com um espaço, o primeiro argumento é expandido como um comando (conclusão de tabulação, etc.) Os aliases também não funcionam no arquivo em que são declarados (para evitar loops infinitos de expansão de alias).

    
por 18.03.2011 / 19:39
0

Eu não acho que você pode passar um argumento para um alias. Um alias é apenas uma regra de substituição de string para a primeira palavra de um comando.
Exemplo:

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'

resultará no comando wd arg1 arg2 arg3 sendo substituído e executado como

ps -ef | grep java | awk {'print " " '} | egrep "(A|B|C|D)" arg1 arg2 arg3

Para tudo além disso, use funções.

    
por 18.03.2011 / 19:50