带有单引号和双引号的 bash 别名命令

我有以下命令:

svn status | awk '$1 =="M"{print $2;}'

我怎么用它来做化名呢? 我试过了:

alias xx="svn status | awk '$1 ==\"M\"{print $2;}'"
54983 次浏览

Here's something that accomplishes the same thing without using an alias. Put it in a function in your .bashrc:

xx() {
svn status | awk '$1 =="M"{print $2;}'
}

This way you don't have to worry about getting the quotes just right. This uses the exact same syntax you would at the command line.

You just need to escape it correctly.

alias xxx="svn status | awk '\$1 ==\"M\"{print \$2;}'"

Since Bash 2.04 there is a third (easier) way beside using a function or escaping the way @ffledgling did: using string literal syntax (here is an excellent answer).

So for example if you want to make an alias of this onliner it will end up being:

alias snap-removedisabled=$'snap list --all | awk \'$5~"disabled"{print $1" --revision "$3}\' | xargs -rn3 snap remove'

So you just have to add the $ in front of the string and escape the single quotes.

This brings a shellcheck warning you could probably safely disable with # shellcheck disable=SC2139.

You can revert the double and simple quotations, so that double quotations are outside of single quotations.

For example, this does not work:

alias docker-table='docker ps --format "table \{\{.ID}}\t\{\{.Image}}\t\{\{.Status}}"'

But this works:

alias docker-table="docker ps --format 'table \{\{.ID}}\t\{\{.Image}}\t\{\{.Status}}'"

And when you check the actual alias interpreted, you can see the inner quotations are actually escaped.

$ alias docker-table
alias docker-table='docker ps --format '\''table \{\{.ID}}\t\{\{.Image}}\t\{\{.Status}}'\'''