在别名中使用管道

Using pipes in an alias

我的.bashrc里有这个:

alias jpsdir="jps | awk '{print }' | xargs pwdx"

但是当我使用 jpsdir 我得到这个输出:

pwdx: invalid process id: JvmName

但是运行

jps | awk '{print }' | xargs pwdx

给出正确的结果:

1234: /some/dir/

我的别名有什么问题?我应该把它变成一个函数吗?

正如 gniourf_gniourf 在评论中解释的那样,您的别名不起作用的原因是因为您的 awk 命令中的 </code> 被 shell 扩展了。该值可能为空,因此 awk 命令变为 <code>{print } 并且 pwdx 被传递到 jps.

的输出的两个部分

您可以通过完全避免使用 awk 来避免转义 $;你可以使用 -q 开关而不是管道到 awk:

jpsdir() {
    jps -q | xargs pwdx
}

我个人更喜欢使用函数,但如果您愿意,可以使用别名。

一直在尝试 运行 : date | awk '{print }' 作为从日期命令中提取时间的命令。 当我将 运行“时间”作为命令时,我得到了这个乱码:

time

real    0m0.000s
user    0m0.000s
sys     0m0.000s

所以时间是日期命令中的第 5 个字符串项,当我使用 awk 命令将它取出时我非常高兴,这是我第一次尝试使用 awk。 正如 Tom French 的回答所建议的那样,如果您去掉上面的 $x,该命令将打印整个日期字符串。 在我遇到一个不会 运行.

的非常简单的例子之前,我并没有尝试使用 alias 命令。