基本上,我想要的是一个包含例如的变量$(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
,但是输入这些额外的括号确实会减慢速度,因为它涉及键盘数字行上的两个字符,而不是一个。
我找不到一个好的答案,所以我怀疑这可能是不可能的。
最佳答案
你是对的:正如给定的那样(每当请求特定变量的值时触发代码运行),该请求是不可能的。
也就是说,有一些解决方法;例如,您可以在每次要打印提示时运行一个函数(或者在每个命令之前,如果您要实现 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 ,请记住环境变量和 shell 变量共享相同的命名空间。
关于bash - 是否可以有一个变量来动态计算 bash 中的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52415448/