Bash

如何使 bash 別名與命令包含一起使用,即 $()(美元符號和括號)

  • October 2, 2020

我曾經有這樣的別名:

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 則相當精簡。我的意思是,它適用於 Ubuntu。幾年前,我安裝了 Fedora 並將 bashrc 文件從我的 Ubuntu 系統複製到它,別名等工作。一周前它在 Fedora 32(使用 Ubuntu bashrc)中工作。但現在我有點數據失去了,我正試圖“重新發明”這個。目前我正在使用預設的 Fedora bashrc 文件,它最初只有 15 行

誰能建議如何解決這個問題?

謝謝你。

單引號不能在單引號字元串中轉義。您需要退出雙引號並稍後重新輸入:

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

使用函式或腳本會容易得多:

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

雖然如果你想用 label 安裝設備2tb-open

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

應該足夠了。

引用自:https://unix.stackexchange.com/questions/612536