我想为多行命令创建一个别名,以便更快地调用它复制-粘贴-执行每次都来自文本文件。
此类命令的一个示例是这样的执行远程更新程序命令:
(
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
,并对bash
shell 进行了稍微简化,
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
在它上使用它是令人困惑的,因为您也在subshell 对运行脚本的环境的影响source
(这通常是人们想要source
脚本的原因)在子 shell 终止时会丢失。)
Shell 函数可以在定义别名的同一个初始化文件中定义,它们的使用方式与别名相同,但更通用(可以接受参数等)
手册bash
包含以下声明
对于几乎所有用途,别名都被 shell 函数取代。