基本上,我想要的是包含一个变量,例如$(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
,但是键入那些多余的括号会使速度变慢,因为它在键盘的数字行中最多包含两个字符,而不仅仅是一个。
对此我找不到很好的答案,因此我怀疑这可能是不可能的。
答案 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的相关规范,请记住环境变量和外壳程序变量共享相同的名称空间。