如何正确转义单引号创建别名

如何正确转义单引号创建别名

我得到了这一行来了解我的进程消耗了多少内存。

$ ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'

现在我想为该命令创建一个别名,但遇到转义'字符的问题:

$ alias mm=ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'
bash: alias: -u: not found
bash: alias: myuser: not found
bash: alias: -o: not found
bash: alias: pid,rss,command: not found
Total 0 MB

我试图转义单引号,但仍然不起作用。

$ alias mm='ps -u $USER -o pid,rss,command | \
    awk \'{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}\''
> 

您能帮我了解如何创建此别名吗?

答案1

要使其成为别名(这是可能的),您需要在别名的整个值周围使用双引号。因此,您还需要转义别名中的一些内容,并且需要转义任何字段参数,awk因为在设置别名时这些参数也会被 Bash 解释为参数。

这对我有用:

$ alias mm="ps -u $USER -o pid,rss,command | \
    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}'"

在上面我做了以下事情:

  1. 别名值用双引号引起来

    alias mm="ps -u ...."
    
  2. 转义 awk 的双引号

    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
    
  3. 转义 awk 的字段

    awk '{print \$0}{sum+=\$2} END
    

我会用这个吗?

可能不会,我会将其切换为 Bash 函数,因为它会更容易维护和理解正在发生的事情,但如果您仍然需要它,这里是别名。

答案2

您能帮我了解如何创建此别名吗?

如果您使用 bash,我可以建议您创建一个函数并将其放入 .bashrc 中吗?

mm() {
  ps -u "$USER" -o pid,rss,command |
    awk '{print $0}{sum+=$2}
         END {print "Total", sum/1024, "MB"}'
}

如果是bash,则需要引用变量。在一个函数中,无需将所有内容都放在一行中。

答案3

这是转义命令:

alias mm='ps -u $USER -o pid,rss,command | \
    awk '\''{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'\'

shell 中转义引号的示例:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

只需完成已打开的一个 ( '),放置转义的一个 ( \'),然后打开另一个 ( ') 即可。

或者:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

这是通过完成已打开的一个 ( '),将引号放入另一个引号 ( "'"),然后打开另一个 ( ') 来完成的。

有关的:如何转义单引号字符串中的单引号?在 stackoverflow SE

相关内容