如何使 bash 别名与命令包含一起使用,即 $()(美元符号和括号)

如何使 bash 别名与命令包含一起使用,即 $()(美元符号和括号)

我曾经有过这样的别名:

alias mount-open="sudo mount $(sudo blkid | gawk '/2tb-open/ { print substr($1, 0, 9) }') 2tb-open"

我不能 100% 确定它是相同的,但 100% 它是 bash 别名,而不是 bash 函数,并且它包含其他命令而不使用变量等。

现在我无法完成这项工作。如果我加上双引号(如示例中所示),它会尝试在终端启动时运行一些 sudo 命令。如果我使用单引号并转义中间的引号:

alias mount-open='sudo mount $(sudo blkid | gawk \'/2tb-open/ { print substr($1, 0, 9) }\') 2tb-open'

它说:

bash: .bashrc: line 25: syntax error near unexpected token `('

我想这与默认 Ubuntu bashrc 中的“额外代码”有关,与 Fedora 相比,Fedora 相当精简。我的意思是,它可以在 Ubuntu 上运行。几年前,我安装了 Fedora 并将 bashrc 文件从我的 Ubuntu 系统复制到其中,别名等工作正常。一周前它在 Fedora 32(带有 Ubuntu bashrc)中工作。但现在我的数据丢失了,我正在尝试“重新发明”它。目前我正在使用默认的 Fedora bashrc 文件,该文件最初只有 15 行

谁能建议如何解决这个问题?

谢谢。

答案1

使用函数或脚本会更容易:

mount-open() {
  sudo mount "$(
      sudo blkid |
        gawk '/2tb-open/ { print substr($1, 0, 9) }'
    )" 2tb-open
}

不过如果你想安装带有标签的设备2tb-open

mount-open() { sudo mount LABEL=2tb-open 2tb-open; }

应该足够了。

答案2

单引号不能在单引号字符串内转义。您需要退出双引号并稍后重新输入:

alias mount-open='sudo mount $(sudo blkid | gawk '\''/2tb-open/ { print substr($1, 0, 9) }'\'') 2tb-open'

相关内容