【问题标题】:Using pipes in an alias在别名中使用管道
【发布时间】:2016-01-09 13:04:23
【问题描述】:

我的.bashrc 中有这个:

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

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

pwdx: invalid process id: JvmName

但正在运行

jps | awk '{print $1}' | xargs pwdx

给出正确的结果:

1234: /some/dir/

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

【问题讨论】:

  • 试用功能:jpsdirfn() { jps | awk '{print $1}' | xargs pwdx; }

标签: bash shell unix awk alias


【解决方案1】:

正如 gniourf_gniourf 在 cmets 中解释的那样,您的别名不起作用的原因是您的 awk 命令中的 $1 正在被 shell 扩展。该值可能为空,因此 awk 命令变为 {print } 并且 pwdx 正在传递 jps 的输出的两个部分。

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

jpsdir() {
    jps -q | xargs pwdx
}

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

【讨论】:

  • 当然可以在别名中使用管道...这里的问题是由于双引号(因为$1很可能在定义别名时未设置),别名分配相当于alias jpsdir="jps | awk '{print }' | xargs pwdx"(没有$1)。
【解决方案2】:

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

time

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

所以时间是 date 命令中的第 5 个字符串项,当我使用 awk 命令将其取出时,我非常高兴,这是我第一次尝试使用 awk。 正如 Tom French 的回答所暗示的,如果您摆脱上面的 $x ,该命令将打印整个日期字符串。 在我遇到一个无法运行的非常简单的示例之前,我没有尝试使用 alias 命令进行很多次尝试。

【讨论】:

  • 时间不一定是日期的第五个元素。这取决于语言环境。使用date +%T等格式参数获取时间运行date
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2018-03-13
相关资源
最近更新 更多