【问题标题】:Unix alias command not working as expectedUnix 别名命令未按预期工作
【发布时间】:2011-01-25 09:50:38
【问题描述】:

我有一个命令可以杀死一些进程,如下所示:

kill -9 `psu|grep MF1pp|grep -v grep|awk '{print $2}'`

该命令运行良好

>psu|grep MF1pp|grep -v grep|awk '{print $2}'
29390
29026
$>kill -9 `psu|grep MF1pp|grep -v grep|awk '{print $2}'`
$>psu|grep MF1pp|grep -v grep|awk '{print $2}'

当我创建如下别名并运行它时:

alias killaf="kill -9 `psu|grep MF1pp|grep -v grep|awk '{print $2}'`"



$> psu|grep MF1pp|grep -v grep|awk '{print $2}'
5487
5272
$>killaf
ksh: kill: bad argument count

给出上述错误。

谁能告诉我可能是什么问题?

【问题讨论】:

  • @benjamin 他们投票决定将其移至超级用户 - 我个人不同意,因为这显然是一个 shell 脚本问题。
  • 可能是因为它与编程无关 - 它更适合 serverfault.com(系统管理员)。
  • 这显然是shell引用语义的编程问题。这不是系统管理问题。任何为任何目的编写 shell 脚本(或本例中的别名)的人都可能遇到完全相同的问题。
  • 另外,不要使用反引号。 $() 是一个更清晰的语法。

标签: unix shell command-line alias ksh


【解决方案1】:

您设置别名的命令行未正确引用。具体来说,反引号嵌入子命令是在您设置别名时执行的,而不是稍后您真正想要运行别名的时候。

尝试这样设置:

alias killaf='kill -9 `psu|grep MF1pp|grep -v grep|awk '\''{print $2}'\''`'

编辑:我修复了 awk 命令周围的引号 - 当您已经是单引号时,嵌入单引号会很棘手。

【讨论】:

  • 为什么需要 '\'
【解决方案2】:

这就是 xargs 的用途:

alias killaf='ps -fu $USER | awk '/[M]F1pp/ {print $2}' | xargs kill -9'

(未经测试)

顺便说一句:我不知道为什么bash 支持别名。我更喜欢使用函数:

killaf() { ps -fu $USER | awk '/[M]F1pp/ {print $2}' | xargs kill -9; }

【讨论】:

    【解决方案3】:

    为什么要使用别名?改用子程序。我假设你的意思是ps 命令,因为我不知道psu 是什么

    killmyprocess(){
      ps -eo pid,comm |awk '$2~/MF1pp/{
        cmd="kill -9 "$1
        print cmd
      #  system(cmd) #uncomment to use
      }'
    }
    

    【讨论】:

    • psu 这里是ps-fu $USER。它又是一个别名。
    【解决方案4】:

    尝试在awk中转义$,通常必须转义才能使其正常工作:

    alias killaf="kill -9 `psu|grep MF1pp|grep -v grep|awk '{print \$2}'`"
    

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 1970-01-01
      • 2018-09-16
      • 2021-11-25
      • 2020-05-23
      • 2016-09-29
      • 2019-10-31
      • 1970-01-01
      相关资源
      最近更新 更多