Bash

執行腳本時,在腳本中轉義 shell 別名有用嗎?

  • May 10, 2021

轉義bash別名在任何(非來源且正常執行的)shell 腳本中是否有意義?


考慮最簡單的情況,許多使用者使用(in或)ls重新定義其功能,例如:alias``.bashrc``.bash_aliases

alias ls='\ls --color=auto --group-directories-first'

然後假設我呼叫了一個包含函式的 shell 腳本,例如:

list_sata_devices ()
{
   \ls -1 /dev/sd?
}

正如您所注意到的,我用 強制原件 ls\ls但我想知道這有必要嗎?


當然,可以不使用 來編寫它ls,例如:

list_sata_devices ()
{
   printf '%s\n' /dev/sd?
}

但我仍然猶豫可能會有什麼不同。

alias ls='\ls --color=auto --group-directories-first'

不需要反斜杠,shell 不會陷入這樣一個微不足道的循環

替換文本的第一個單詞會測試別名,但與正在擴展的別名相同的單詞不會再次擴展。


然後假設我呼叫了一個包含函式的 shell 腳本,例如:

list_sata_devices ()
{
    \ls -1 /dev/sd?
}

如果它是一個 shell 腳本,即非互動式 shell,則預設情況下禁用別名

當 shell 不是互動式的時,別名不會展開,除非 expand_aliases shell 選項是使用 shopt 設置的(參見 Shopt Builtin)。

腳本需要顯式啟用它們(shopt -s expand_aliases)即使它這樣做(無論出於何種原因),它也不會繼承您的互動式 shell 中設置的任何別名,並且非互動式 shell 也不會讀取例如.bashrc,所以它不會不要從那裡得到它們。但是,非互動式外殼會讀取名為 in 的文件$BASH_ENV,因此可能不要在那裡設置別名。

所以,這裡也不需要反斜杠。


list_sata_devices ()
{
    printf '%s\n' /dev/sd?
}

嗯,這是一個不同的命令。效果不大,但ls如果列印到終端,可能會以不同的方式處理某些特殊字元。

無論如何,Bash可以通過環境 導出和繼承 函式,這可能會弄亂腳本,但通常不會意外地這樣做。

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