為什麼我的命令在使用別名時不起作用?

為什麼我的命令在使用別名時不起作用?

我用來ps -ef | grep catalina | grep -v grep列印系統上運行的tomcat進程:

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

然後我用它ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'來提取進程ID:

7099

但是,當我為整個命令添加別名alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"並通過別名使用它時,它會打印整個文本並且awk似乎不起作用。

type tomcat_id給出:

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

答案1

別名的一般規則:如果別名對於別名來說太複雜,請改用函數。

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

您的別名定義的問題是您引用錯誤。定義別名的行是一個 shell 指令,由 shell 解析。由於您使用了雙引號,並且當時可能沒有位置參數(因此$2擴展為空字串),因此您定義的別名是

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

定義別名的簡單方法是使用單引號進行定義,並避免在別名指令中使用單引號。當我這樣做時,我已經刪除了-F " ",無論如何這是預設的(有點奇怪,因為它看起來像“一個空格”,但意味著“任何空白序列”)。

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

或者您可以使用'\''在單引號文字中有效地引用單引號。

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

但是,正如我上面所寫,使用函數,更清晰。或者更確切地說,使用適合該工作的工具:

alias tomcat_id='pgrep catalina'

或者

alias tomcat_id='pidof catalina'

答案2

Gnouc 的答案是完全有效的(這就是我投票的原因),但我想提供一個替代方案:

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

這裡的想法是,在進程名稱(欄位 8)中,我們應該能夠找到java,並且在整個線路上我們應該找到catalina

所以我們讓awk所有的匹配和列印工作都完成。無需打擾grep;)

所以意思是:

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

$8與正規表示式匹配的字段/java/,並將整行(也可以$0明確使用)與正規表示式匹配/catalina/,如果這些事情是真的,則列印字段$2。記住 Gnouc 的回答中已經說過的話:預設分隔符號已經是空格了。不需要定義這個。

答案3

您必須在指令中轉義美元符號awk

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

而且您不必使用-F' 'awk使用空格作為預設欄位分隔。

相關內容