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

tim*_*rer 7 bash alias function

我想为多行 ? 命令创建一个别名,以便更快地调用它,然后每次从文本文件中复制粘贴执行它。

此类命令的一个示例是此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
)
Run Code Online (Sandbox Code Playgroud)

几年前,我了解到由于 Bash 设计限制,多行命令的别名是不可能的,但也许从那时起程序已经更改,现在可以了。


我认为,如果仍然不可能,也许我可以使用该代码创建一个函数,将其导出到所有 shell 会话(尽管我很少使用任何子会话,而且我什至不记得我上次这样做是什么时候),然后调用它以某种方式。

它应该是足够的,安全的,只是把它包在export编和命名函数中说.bashrc.bash_profile,然后调用它,每当我需要?

Kus*_*nda 20

这并非不可能。

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

或者,

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

别名的问题是引用可能很难正确,因为它们是文本字符串,而且它们更适合非常短的东西,比如

alias ls='ls -F'
Run Code Online (Sandbox Code Playgroud)

在几乎所有其他情况下,您都需要一个 shell 函数:

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

或者,更正为不使用update.sh当前目录中的名称(它可能被一个不相关的文件占用)并且只wgetcd成功时运行,并且稍微简化了bashshell,

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

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

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

bash手册包含的声明

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