Por que meu comando não funciona quando tem alias?

Por que meu comando não funciona quando tem alias?

Eu uso ps -ef | grep catalina | grep -v greppara imprimir o processo do Tomcat em execução no sistema:

kshitiz   7099     1  0 May11 ?        00:02:29 /usr/lib/jvm/jdk1.8.0/bin/java -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:38156 -Dcatalina.base=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1 -Dcatalina.home=/opt/tomcat-7.0.42 -Dwtp.deploy=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps -Djava.endorsed.dirs=/opt/tomcat-7.0.42/endorsed -Dfile.encoding=UTF-8 -classpath /opt/tomcat-7.0.42/bin/bootstrap.jar:/opt/tomcat-7.0.42/bin/tomcat-juli.jar:/usr/lib/jvm/jdk1.8.0/lib/tools.jar org.apache.catalina.startup.Bootstrap start

Então eu uso ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'para extrair o ID do processo:

7099

Mas quando eu alia todo o comando alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"e o uso via alias, ele imprime o texto inteiro e awkparece não funcionar.

type tomcat_iddá:

tomcat_id is aliased to `ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''

Responder1

Uma regra geral para aliases: se ficar muito complexo para um alias, use uma função.

tomcat_id () {
  ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
}

O problema com a definição do seu alias é que você errou na citação. A linha que define o alias é um comando shell e é analisada pelo shell. Como você usou aspas duplas e provavelmente não há parâmetros posicionais no momento (portanto, $2expande para uma string vazia), o alias que você definiu é

ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }'

A maneira fácil de definir um alias é usar aspas simples para a definição e evitar usar aspas simples no comando com alias. Enquanto estou nisso, removi -F " ", que é o padrão de qualquer maneira (e um pouco estranho porque parece “um espaço”, mas significa “qualquer sequência de espaços em branco”).

alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk "{print \$2}"'

Ou você pode usar '\''para citar efetivamente uma aspa simples dentro de um literal entre aspas simples.

alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk '\''{print \$2}'\'

Mas, como escrevi acima, use uma função, fica mais claro. Ou melhor, use a ferramenta adequada para o trabalho:

alias tomcat_id='pgrep catalina'

ou

alias tomcat_id='pidof catalina'

Responder2

A resposta do Gnouc é perfeitamente válida (é por isso que votei positivamente), mas gostaria de oferecer uma alternativa:

alias tomcat_id="ps -ef|awk '\$8 ~ /java/ && /catalina/ {print \$2}'"

a ideia aqui é que no nome do processo (campo 8) possamos encontrar javae na linha como um todo devemos encontrar catalina.

Então deixamos awkfazer todo o trabalho de correspondência e impressão. Não há necessidade de se preocupar grep;)

Então o significado:

$8 ~ /java/ && /catalina/ {print $2}

é combinar campo $8com regex /java/e combinar a linha inteira (também pode usar $0explicitamente) com regex /catalina/e se essas coisas forem verdadeiras, imprima field $2. Lembre-se do que já foi afirmado na resposta do Gnouc: o separador padrão já é um espaço em branco. Não há necessidade de definir isso.

Responder3

Você deve escapar do cifrão no awkcomando:

alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk '{print \$2}'"

E você não precisa usar -F' ', awkuse espaços como campo padrão separado.

informação relacionada