Bash
執行腳本時,在腳本中轉義 shell 別名有用嗎?
轉義
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可以通過環境 導出和繼承 函式,這可能會弄亂腳本,但通常不會意外地這樣做。