我可以让 bash 停止解析和验证某个别名吗?

我可以让 bash 停止解析和验证某个别名吗?

我正在使用 Fedora 25,并已将以下别名添加到我的 bash 配置文件中:

alias releasenotes="dnf updateinfo --refresh info `dnf check-update | cut -d '.' -f 1 | xargs` | less"

(我不能直接使用,dnf updateinfo info因为https://bugzilla.redhat.com/show_bug.cgi?id=1405191

我的别名可以工作,但命令运行大约需要 10 秒钟,而且由于 bash 在获取配置文件时会解析并验证所有别名,因此创建新的 shell 会导致 10 秒钟的挂起。这很烦人。

有什么办法可以让 bash 不尝试解析和验证别名 - 或者只是那一个?

答案1

我最好的猜测是你应该使用单引号围绕别名定义。

我知道当使用双引号时,shell 变量会在别名定义阶段(就像您所说的解析和验证)被其内容替换,以及反引号或 shell 替换,如 $(command)。

更好的解释是Unix SE 问题

如果这不能帮助再次加快提示加载速度,请定义一个 shell 函数而不是别名。

编辑:不要忘记将 cut 参数替换为双引号,就像 quixotic 提到的那样。

答案2

bash正在解释引用的字符串,并且该解释将执行嵌入的dnf check-update命令。此执行占用了别名定义期间的时间,而不是dnf updateinfo您为之设置别名的主要命令。尝试一个基于的虚构示例,sleep并注意它alias本身如何花费 5 秒钟:

alias sleep5="echo 'wake' ; `sleep 5` ; echo 'done'"

使用单引号避免解释:

alias releasenotes='dnf updateinfo --refresh info `dnf check-update | cut -d "." -f 1 | xargs` | less'

不要忘记将cut参数换成双引号。

相关内容