别名或 bash 功能不起作用

Ami*_*ani 4 bash alias function

当我创建

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'
Run Code Online (Sandbox Code Playgroud)

或者

function wd () {
    ps -ef | grep java | awk '{print $2}' ...
}
Run Code Online (Sandbox Code Playgroud)

在我的 .bashrc 文件中,出现错误。有趣的是,如果我使用该函数获取我的 .bashrc 文件,它会“编译”,但是在执行时,会给出:

 context is
     >>> \ <<< {\print
    missing }
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题,并回答什么时候将某些东西放在函数中而不是别名中更好?

Gil*_*il' 7

为什么别名不起作用

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'
Run Code Online (Sandbox Code Playgroud)

alias命令接收三个参数。第一个是字符串wd=ps -ef | grep java | awk {print(单引号防止它们之间的字符具有特殊含义)。第二个参数由一个空格字符组成。(在 中.bashrc,位置参数$2$9为空,因此$2扩展为 0 个单词的列表。)第三个参数是} | egrep "(A|B|C|D)"(再次用单引号保护特殊字符)。

别名定义在遇到时像任何其他 shell 命令一样被解析。然后在扩展别名时解析为别名定义的字符串。以下是定义此别名的一些可能方法。第一种可能性:由于整个别名定义都在单引号内,因此只能在命令中使用双引号,这意味着您必须使用反斜杠保护awk的"$含义。

alias wd='ps -ef | grep java | awk "{print \$2 \" \" \$9}" | egrep "(A|B|C|D)"'
Run Code Online (Sandbox Code Playgroud)

第二种可能性:每个字符在单引号内代表自己,除了单引号结束文字字符串。'\''是“单引号字符串中的单引号”的成语:结束单引号字符串,放置一个文字单引号,然后立即开始一个新的单引号字符串。由于没有中间空格,它仍然是同一个词。

alias wd='ps -ef | grep java | awk '\''{print $2 " " $9}'\'' | egrep "(A|B|C|D)"'
Run Code Online (Sandbox Code Playgroud)

您可以稍微简化一下:

alias wd='ps -ef | grep java | awk '\''{print $2, $9}'\'' | egrep "(A|B|C|D)"'
Run Code Online (Sandbox Code Playgroud)

提示:用于set -x查看 shell 如何扩展您的命令。

为什么该功能不起作用

我不知道。你展示的部分看起来不错。如果您在我的解释后仍然不明白为什么您的函数不起作用,请复制粘贴您的代码。

别名还是函数?

仅对非常简单的事情使用别名,通常为常用命令提供较短的名称或提供默认选项。例子:

alias grep='grep --color'
alias cp='cp -i'
alias j=jobs
Run Code Online (Sandbox Code Playgroud)

对于更复杂的事情,请使用函数。

你应该写的

与其解析ps输出,不如让它生成适合您的输出。

wd () {
  ps -C java -o pid=,cmd= | egrep "(A|B|C|D)"
}
Run Code Online (Sandbox Code Playgroud)