是否有可能在bash中动态评估命令的变量?

时间:2018-09-19 23:25:23

标签: bash

基本上,我想要的是包含一个变量,例如$(some-command),以便在展开时提供some-command的结果。

一个例子将有助于阐明我的意思。

假设我有一些命令tell-svn-root,该命令可以打印出当前目录的最新(即最深)祖先的路径,该目录包含一个子目录.svn

我很想创建一个变量SVNROOT,该变量始终求值为tell-svn-root的输出。

SVNROOT=$(tell-svn-root)中的

.bashrc将不起作用,因为这样SVNROOT将具有固定值(即运行tell-svn-root.bashrc的输出)。

运行例如cd $(tell-svn-root)也是不够的,因为我想编写类似cd $SVNROOT/my-app-src的命令。

我知道我可以做$(tell-svn-root)/my-app-src,但是键入那些多余的括号会使速度变慢,因为它在键盘的数字行中最多包含两个字符,而不仅仅是一个。

对此我找不到很好的答案,因此我怀疑这可能是不可能的。

1 个答案:

答案 0 :(得分:3)

您是正确的:正确地给出了(只要请求特定变量的值就运行触发代码),就不可能进行请求。

也就是说,有一些解决方法;例如,您可以在每次将要打印提示时(或者在每个命令之前,如果要实现DEBUG陷阱)运行一个函数,该函数将在那时更新变量。

显然,对性能的影响可能是微不足道的,我强烈建议在函数调用中使用额外的冗长性。特别是在处理不可信数据的安全做法普遍冗长的情况下,bash对于迷恋简洁的人来说并不是一种安全的语言。

update_variables() {
  if [[ $svnroot_for_PWD != "$PWD" ]]; then
    svnroot=$(tell-svn-root)
    svnroot_for_PWD=$PWD
  fi
}
PROMPT_COMMAND=update_variables

关于变量命名约定-全大写的名称保留给对Shell和其他POSIX定义的工具有意义的变量,而小写的名称可确保用户定义的代码可以安全使用。请注意http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html的相关规范,请记住环境变量和外壳程序变量共享相同的名称空间。