【问题标题】:Can you execute a q function from bash?你可以从 bash 执行一个函数吗?
【发布时间】:2021-08-02 13:29:59
【问题描述】:

我有一个 q 脚本和一个 bash 脚本,它们都可以使用某个函数来获取以秒为单位的等待时间。

所以从 bash 脚本中我想做类似的事情:

export WAITINGTIME=$(q scriptName.q -function functionName)

例如,WAITINGTIME 应该设置为 50 秒,这将从 q 脚本返回。这可能吗?听起来应该很容易,但我想知道是否有人有这方面的经验。

【问题讨论】:

  • 你在这里 grep 输出。如果脚本的结果回显为50,则变量将具有50。如果是blaat\n[debug] hello, world!\n50,就是这样。另外,将输出附上:export WAITINGTIME="$(do_something)"
  • @Bayou 引号不是必需的。作业的 RHS 不受分词或路径名扩展的影响。
  • 这可能吗? ...您尝试过吗?如果可以,它是否按预期工作?如果它没有按预期工作,那么用更多细节更新问题......(错误)结果和(正确)预期结果
  • 感谢您的提示。不知道我为什么这么想。也许只有重新分配变量,例如VAR2="${VAR1}"
  • @QuestionMark:为什么不呢?当然,它假定您的 q 程序将 50 写入标准输出(仅此而已),但是由于您设计了此程序,因此由您来确保这一点。

标签: bash kdb


【解决方案1】:

是的,一个最基本的例子是:

tlynch:~ $ cat scr.q
f1:{.z.P};
f2:{.z.N};
value(first .Q.opt[.z.x]`function;`)

tlynch:~ $ cat bash.sh
alias q=/opt/q3.5/l64/q
export WAITINGTIME=$(q scr.q -function $1 &)
echo "Result=$WAITINGTIME"

然后

tlynch:~ $ sh bash.sh f1
Result=2021.08.03D05:42:25.775601000
tlynch:~ $ sh bash.sh f2
Result=0D05:42:29.094209000
tlynch:~ $ sh bash.sh f1
Result=2021.08.03D05:42:31.880126000

编辑:经过整理的版本,考虑了 Charles 的各种建议

tlynch:~ $ cat scr.sh
export QHOME=/opt/q3.5
WAITINGTIME=$(/opt/q3.5/l64/q scr.q -function $1 </dev/null)
echo "Result=$WAITINGTIME"

tlynch:~ $ sh scr.sh f1
Result=2021.08.03D14:14:22.188564000
tlynch:~ $ sh scr.sh f2
Result=0D14:14:24.381535000

【讨论】:

  • 请注意,默认情况下脚本不启用别名——如果上面的代码对你有用,我假设 q 在你的 PATH 中,所以不需要别名,或者你已导出...无论要覆盖默认 shell 选项的环境变量是什么;我忘记了名字。 q() { /opt/q3.5/l64/q "$@"; } 会更可靠。 (另外,sh 不是 bash——即使文件链接在一起,bash 也会禁用某些功能,以便在以该名称启动时与 POSIX sh 更兼容——因此将 sh 脚本命名为“bash.sh”有点奇怪)。
  • 是的,好点。我的答案的整理版本仍然应该给 OP 一个工作方向
  • 旁白:POSIX 标准指定用于环境变量的全大写名称,以及对 shell 有意义的变量; variables with at least one lower-case name are reserved for application use,意味着它们不会被 shell 设置或对 shell 产生无意的影响,因此最好在该命名空间中使用变量(也就是说,not 全大写)在编写脚本并且没有明确打算修改 shell 或其他 POSIX 标准化工具的操作方式时。
  • ...作为一个快速简单的示例,for PATH in /dir/*/ 将通过阻止它在/bin 和朋友中找到实用程序来破坏您的外壳,而 for path in /dir/*/ 很好。
  • 顺便说一句,也可以酌情考虑-function "$1"-function "$@",而不是-function $1。前者只传递第一个参数,如果它包含空格,则将其保留为单个单词;后者通过 all 位置参数而不执行字符串拆分、全局扩展或以任何方式修改它们。原始的-function $1 代码为您提供了两全其美:它忽略除第一个参数以外的所有参数,并将第一个参数进行字符串拆分和全局扩展,以与 bash 解析代码的方式完全不同的方式解析它.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2018-10-02
  • 2018-12-07
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
相关资源
最近更新 更多