1

我正在尝试编写alias一个通用命令来取消进程,但我遇到了单引号和双引号的问题。这是我第一次尝试 Bash 脚本,我有点难过。

lsof -i tcp:80 | awk '$1 == "Google" {print $2}'

这作为一个独立的命令工作并输出正确的 PID。

当我尝试将其格式化为别名时,虽然我遇到了问题。我知道命令在第一个单引号处停止,这是结构,但我不知道如何修复它。

alias test='lsof -i tcp:80 | awk '$1=="Google" {print $2}''
4

3 回答 3

2

There's no escape sequence for single quotes inside single quotes. You can't write \' like you might expect. So there are two options.

  1. You can break out of single quotes, add an escaped single quote \', and then go back in, like so:

    alias test='lsof -i tcp:80 | awk '\''$1 == "Google" {print $2}'\'
    
  2. You can use double quotes. You then have to escape not just the double quotes inside the string but also the dollar signs.

    alias test="lsof -i tcp:80 | awk '\$1 == \"Google\" {print \$2}'"
    
于 2013-09-26T12:07:18.320 回答
2

尝试像这样定义您的别名

alias test='lsof -i tcp:80 | awk '"'"'$1=="Google" {print $2}'"'"

单引号'必须在双引号之间转义"。为此,必须将命令拆分为几个部分以不同方式转义它们。lsof -i tcp:80 | awk '$1=="Google" {print $2}'可以像这样在单引号上拆分

  1. lsof -i tcp:80 | awk
  2. '
  3. $1=="Google" {print $2}
  4. '

然后用适当的引号引用

  1. 'lsof -i tcp:80 | awk'
  2. "'"
  3. '$1=="Google" {print $2}'
  4. "'"

并将每个部分合并在一起,你就有了你的别名:

'lsof -i tcp:80 | awk'"'"'$1=="Google" {print $2}'"'"

请注意,第一部分不包含任何解释变量,因此它可以用双引号引起来并与第二部分合并。因此别名变为

alias test="lsof -i tcp:80 | awk'"'$1=="Google" {print $2}'"'"
于 2013-09-26T08:15:02.053 回答
0

在几乎所有发现自己试图定义别名的情况下,请改为定义一个函数。

testing () {
    lsof -i tcp:80 | awk '$1=="Google" {print $2}'
}
于 2013-09-26T15:14:05.917 回答