Por que o meu comando não funciona quando é aliado?

2

Eu uso ps -ef | grep catalina | grep -v grep para 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

Em seguida, uso ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}' para extrair o ID do processo:

7099

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

type tomcat_id dá:

tomcat_id is aliased to 'ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''
    
por Kshitiz Sharma 12.05.2014 / 05:51

3 respostas

3

Uma regra geral de 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 sua definição de alias é que você entendeu errado. 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 (então $2 expande 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 o uso de aspas simples no comando com alias. Enquanto eu estou nisso, eu removi -F " " , que é o padrão de qualquer maneira (e um pouco estranho porque parece "um espaço", mas significa "qualquer seqüência de espaço em branco").

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

Ou você pode usar '\'' para citar efetivamente uma única aspas dentro de um literal com aspas simples.

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

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

alias tomcat_id='pgrep catalina'

ou

alias tomcat_id='pidof catalina'
    
por 13.05.2014 / 02:13
2

Você deve escapar do cifrão no comando awk :

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

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

    
por 12.05.2014 / 13:55
2

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

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

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

Então, deixamos awk fazer todo o trabalho de correspondência e impressão. Não precisa se preocupar com grep ;)

Então, o significado:

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

é o campo de correspondência $8 em relação a regex /java/ e corresponde à linha inteira (também pode usar $0 explicitamente) em relação a regex /catalina/ e, se isso for verdade, imprima o campo $2 . Lembre-se do que já foi dito na resposta do Gnouc: o separador padrão já é um espaço em branco. Não há necessidade de definir isso.

    
por 12.05.2014 / 18:06