为什么我的命令在使用别名时不起作用?

为什么我的命令在使用别名时不起作用?

我用来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使用空格作为默认字段分隔。

相关内容