获取别名失败 - 没有这样的文件或目录

获取别名失败 - 没有这样的文件或目录

我在深层目录树中有大量不同版本的 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 中都存在)...

相关内容