Pao*_*olo 11 shell bash alias quoting escape-characters
我得到了这个单行代码来了解我的进程消耗了多少内存。
$ ps -u $USER -o pid,rss,command | \
awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'
Run Code Online (Sandbox Code Playgroud)
现在我想为该命令创建一个别名,但在转义'字符时遇到问题:
$ 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
Run Code Online (Sandbox Code Playgroud)
我试图转义单引号,但仍然不起作用。
$ alias mm='ps -u $USER -o pid,rss,command | \
awk \'{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}\''
>
Run Code Online (Sandbox Code Playgroud)
你能帮我理解如何创建这个别名吗?
slm*_*slm 13
要使其成为可能的别名,您需要在别名的整个值周围使用双引号。因此,您还需要对别名中的一些内容进行转义,并且您需要将任何字段参数转义为 ,awk因为当您设置别名时,这些参数也会被 Bash 解释为参数。
这对我有用:
$ alias mm="ps -u $USER -o pid,rss,command | \
awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}'"
Run Code Online (Sandbox Code Playgroud)
在上面我做了以下事情:
别名值周围的双引号
alias mm="ps -u ...."
Run Code Online (Sandbox Code Playgroud)转义 awk 的双引号
awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
Run Code Online (Sandbox Code Playgroud)转义 awk 的字段
awk '{print \$0}{sum+=\$2} END
Run Code Online (Sandbox Code Playgroud)可能不会,我会将其切换为 Bash 函数,因为这样会更容易维护和理解正在发生的事情,但如果您仍然需要,这里是别名。
小智 11
你能帮我理解如何创建这个别名吗?
如果您使用 bash 并将其放在 .bashrc 中,我可以建议您创建一个函数吗?
mm() {
ps -u "$USER" -o pid,rss,command |
awk '{print $0}{sum+=$2}
END {print "Total", sum/1024, "MB"}'
}
Run Code Online (Sandbox Code Playgroud)
如果是bash,则需要引用变量。在一个函数中,不需要把所有东西都放在一行上。
这是转义命令:
alias mm='ps -u $USER -o pid,rss,command | \
awk '\''{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'\'
Run Code Online (Sandbox Code Playgroud)
shell 中转义引号的示例:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
Run Code Online (Sandbox Code Playgroud)
只需完成已打开的一个 ( '),放置转义的一个 ( \'),然后打开另一个 ( ') 即可。
或者:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
Run Code Online (Sandbox Code Playgroud)
这是通过完成已打开的一个 ( '),将引号放入另一个引号 ( "'"),然后打开另一个 ( ') 来完成的。
相关:如何转义单引号字符串中的单引号?在 stackoverflow SE