bash - 是否可以有一个变量来动态计算 bash 中的命令?

标签 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 ,但是输入这些额外的括号确实会减慢速度,因为它涉及键盘数字行上的两个字符,而不是一个。

我找不到一个好的答案,所以我怀疑这可能是不可能的。

最佳答案

你是对的:正如给定的那样(每当请求特定变量的值时触发代码运行),该请求是不可能的。

也就是说,有一些解决方法;例如,您可以在每次要打印提示时运行一个函数(或者在每个命令之前,如果您要实现 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/

相关文章:

bash - 从串口读取并以十六进制存储

linux - 确定 SCP 传输是否失败的最佳方法

bash - 如何在 bash 中自动引用或分组别名的命令行参数?

linux - 使用 iwatch 监视目录更改 - 获取新文件名而不是完整路径?

linux - 庆典 shell : syntax error near unexpected token `else'

linux - 用于搜索任何出现的短语并返回文件和路径列表的 Bash 命令

linux - 使用 Bash 脚本进行多线程编程

bash - 如何使 echo 解释反斜杠转义而不打印尾随换行符?

linux - 对返回状态代码 shell 脚本的使用感到困惑?

bash - 无法验证SSH的结果