Warum funktioniert mein Befehl nicht, wenn er einen Alias ​​verwendet?

Warum funktioniert mein Befehl nicht, wenn er einen Alias ​​verwendet?

Ich verwende ps -ef | grep catalina | grep -v grepzum Drucken des auf dem System laufenden Tomcat-Prozesses:

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

Dann verwende ich ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'zum Extrahieren der Prozess-ID:

7099

Aber wenn ich den gesamten Befehl mit einem Alias ​​verknüpfe alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"und ihn über den Alias ​​verwende, wird der gesamte Text gedruckt und awkes scheint nicht zu funktionieren.

type tomcat_idgibt:

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

Antwort1

Eine allgemeine Regel für Aliase: Wenn es für einen Alias ​​zu komplex wird, verwenden Sie stattdessen eine Funktion.

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

Das Problem mit Ihrer Aliasdefinition ist, dass Sie die Anführungszeichen falsch gesetzt haben. Die Zeile, die den Alias ​​definiert, ist ein Shell-Befehl und wird von der Shell analysiert. Da Sie doppelte Anführungszeichen verwendet haben und es zu diesem Zeitpunkt wahrscheinlich keine Positionsparameter gibt (also $2zu einer leeren Zeichenfolge erweitert wird), lautet der von Ihnen definierte Alias

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

Die einfache Möglichkeit, einen Alias ​​zu definieren, besteht darin, einfache Anführungszeichen für die Definition zu verwenden und die Verwendung einfacher Anführungszeichen im Alias-Befehl zu vermeiden. Wenn ich schon dabei bin, habe ich entfernt -F " ", was ohnehin die Standardeinstellung ist (und ein bisschen seltsam, weil es wie „ein Leerzeichen“ aussieht, aber „jede beliebige Folge von Leerzeichen“ bedeutet).

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

Oder Sie können verwenden, '\''um effektiv ein einfaches Anführungszeichen innerhalb eines in einfache Anführungszeichen gesetzten Literals zu zitieren.

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

Aber wie ich oben geschrieben habe, verwenden Sie eine Funktion, das ist klarer. Oder besser gesagt, verwenden Sie das für die Aufgabe geeignete Werkzeug:

alias tomcat_id='pgrep catalina'

oder

alias tomcat_id='pidof catalina'

Antwort2

Die Antwort von Gnouc ist vollkommen gültig (weshalb ich sie positiv bewertet habe), aber ich möchte eine Alternative anbieten:

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

Die Idee besteht hier darin, dass wir im Prozessnamen (Feld 8) javaund in der gesamten Zeile finden können sollten catalina.

Also überlassen wir Ihnen awkdie ganze Arbeit des Abgleichens und Druckens. Sie brauchen sich nicht darum zu kümmern grep;)

Also die Bedeutung:

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

ist, das Feld $8mit dem regulären Ausdruck abzugleichen /java/und die ganze Zeile (könnte auch $0explizit verwendet werden) mit dem regulären Ausdruck abzugleichen /catalina/und, wenn diese Dinge zutreffen, das Feld auszudrucken $2. Denken Sie daran, was bereits in Gnoucs Antwort gesagt wurde: Das Standardtrennzeichen ist bereits ein Leerzeichen. Dies muss nicht definiert werden.

Antwort3

Sie müssen das Dollarzeichen im awkBefehl maskieren:

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

Und Sie müssen nicht verwenden -F' ', awkverwenden Sie Leerzeichen als Standardfeldtrennzeichen.

verwandte Informationen