Bash

如何在 Bash 中創建多行別名?

  • July 25, 2021

我想為多行命令創建一個別名以更快地呼叫它,然後每次從文本文件中複製-粘貼-執行它。

此類命令的一個範例是這個execute-a-remote-updater命令:

(
cd "${program_to_update_dir}"
wget https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh
source update.sh
rm update.sh
)

幾年前,我了解到由於 Bash 設計的限制,多行命令的別名是不可能的,但也許從那以後程序已經改變,現在它是可能的。


我認為,如果仍然不可能,也許我可以使用該程式碼創建一個函式,將其導出到所有 shell 會話(儘管我很少使用任何子會話,我什至不記得我上次這樣做是什麼時候),然後呼叫它以某種方式。

export將它包裝在一個ed 和命名函式中是否足夠安全,.bashrc或者.bash_profile在我需要時呼叫它?

這根本不是不可能的。

alias thing='(
cd "${program_to_update_dir}"
wget "https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh"
source update.sh
rm update.sh
)'

或者,

alias thing='( cd "${program_to_update_dir}"; wget "https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh"; source update.sh; rm update.sh )'

別名的問題是引用可能很難正確,因為它們是文本字元串,而且它們更適合非常短的東西,比如

alias ls='ls -F'

在幾乎所有其他情況下,您都需要一個 shell 函式:

thing () (
   cd "${program_to_update_dir}"
   wget 'https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh'
   source update.sh
   rm update.sh
)

或者,更正為不使用update.sh目前目錄中的名稱(它可能被不相關的文件佔用)並且僅wget在成功時執行,並為外殼cd稍微簡化,bash

thing () (
   cd "$program_to_update_dir" &&
   source <( wget --quiet -O - 'https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh' )
)

(請注意,您可能希望使用而不是獲取它來執行update.sh腳本,或將其通過管道傳輸到,或使用其 -line 使用的任何解釋器。您在其上使用的事實令人困惑,因為您也在執行它subshel​​l。當 subshel​​l終止時,對執行腳本環境的影響(通常是人們想要腳本的原因)會失去。)bash``bash -s``#!``source``source``source

Shell 函式可以在定義別名的同一初始化文件中定義,並且它們的使用方式與別名相同,但用途更廣(可以接受參數等)

bash手冊包含聲明

對於幾乎所有用途,別名都被 shell 函式所取代。

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