如何在 Bash 中创建多行别名?

如何在 Bash 中创建多行别名?

我想为多行命令创建一个别名,以便更快地调用它复制-粘贴-执行每次都来自文本文件。

此类命令的一个示例是这样的执行远程更新程序命令:

(
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然后在我需要的时候调用它?

答案1

这并非不可能。

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,并对bashshell 进行了稍微简化,

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

(请注意,您可能希望update.sh使用bash而不是获取它来运行脚本,或者将其通过管道传输到bash -s,或者使用其#!-line 使用的任何解释器。事实上,您source在它上使用它是令人困惑的,因为您也在subshel​​l 对运行脚本的环境的影响source(这通常是人们想要source脚本的原因)在子 shell 终止时会丢失。)

Shell 函数可以在定义别名的同一个初始化文件中定义,它们的使用方式与别名相同,但更通用(可以接受参数等)

手册bash包含以下声明

对于几乎所有用途,别名都被 shell 函数取代。

相关内容