我在深层目录树中有大量不同版本的 shell 脚本。为了简化使用这些,我添加了一个函数来创建别名(通过命令行选项选择):
function make_alias {
local CMD NAME
NAME=$( basename ${BASH_SOURCE[0]} )
CMD=$( realpath ${BASH_SOURCE[0]} )
echo "alias $NAME=\"$CMD\""
exit 0
}
如果我运行它,它会在标准输出上生成一个有效的别名命令,例如
$ ./myscript -a
alias myscript="/home/symcbean/library/tools/webserver/myscript"
我可以剪切并粘贴它,它有效。
但是,如果我尝试在当前 shell 中获取输出,则会收到错误:
$ source $(./myscript -a)
-bash: alias: No such file or directory
我缺少什么?
(在 Ubuntu 22.04 上使用 bash 5.1.16)
答案1
source $(./myscript -a)
那是行不通的。source
意思是读取另一个shell脚本文件的源代码,并在当前shell中执行它。你可以eval $(./myscript -a)
,这会起作用,但是嗯,这对于别名来说是一个非常尴尬的用例。
老实说,我只是将脚本的符号链接放在 /var/run 下的目录中,并将其添加到路径中(如果还不是路径的一部分):
function make_alias {
local executable
local binpath
executable=$0
binpath="/var/run/${UID}/shortcuts"
mkdir -p "${binpath}"
# next 3 lines adapted from https://superuser.com/a/39995/563936
if [[ ":$PATH:" != *":${binpath}:"* ]]; then
PATH="${PATH:+"$PATH:"}${binpath}"
fi
# Place symlink in /var/run sudirectory
ln -s "$(realpath "${executable}")" "${binpath}/$(basename "${executable}")"
}
就我个人而言,我发现这比用众多别名弄乱你的外壳要优雅得多:通过选择 中的位置$PATH
,你可以定义优先级,即不会意外隐藏重要的系统命令,诸如此类的事情type
仍然which
按预期工作,很容易获得概述您已经创建的快捷方式(通过查看所述目录),以及快捷方式在多个 shell 之间传输,而无需在每个 shell 中设置(只要$binpath
在$PATH
两个 shell 中都存在)...