【问题标题】:Executing process substitution result as a script将进程替换结果作为脚本执行
【发布时间】:2020-02-05 21:05:55
【问题描述】:

我想创建一个临时 shell 脚本,并将其作为参数传递给另一个脚本,即回调挂钩。是否可以为此使用流程替换?

在此示例中,aria2c 允许将挂钩作为参数。下载页面后,aria2c 将使用一些参数调用该钩子。理想情况下,我希望 aria2c 调用我的“虚拟”脚本,而无需先制作任何临时文件,如下所示:

aria2c \
  --on-download-complete <(echo '#!/bin/sh'; echo 'echo "Called with [$1] [$2] [$3]"') \
  https://aria2.github.io/

但结果我得到一个许可错误:

Could not execute user command: /dev/fd/63: Permission denied

【问题讨论】:

  • 因为aria2使用execlp,相信是不可能的,还得创建一个临时文件。
  • “我希望我的脚本直接调用 aria2c”?你的意思是“我希望 aria2c 直接调用我的脚本”?
  • @jhnc 我的意思是我希望 aria2c 调用一个不作为文件存在的脚本,而只是作为 /dev/fd。我在帖子中澄清了语言。

标签: bash shell aria2


【解决方案1】:

正如 cmets 中所指出的,aria2c 期望钩子参数是 程序的文件名,以作为回调执行。但是,进程替换产生的文件名不是这样的程序;进程替换返回命名管道的文件名

如果不创建 任何 文件,您将无法做您想做的事。但是,单个静态帮助程序和导出的 bash 函数变得接近:

/my/odc/helper

#!/bin/bash
__aria2c_odc_helper_function "$@"
exit

像这样使用:

__aria2c_odc_helper_function(){
    echo "Called with [$1] [$2] [$3]"
}
export -f __aria2c_odc_helper_function

aria2c --on-download-complete /my/odc/helper \
    https://aria2.github.io/

【讨论】:

  • 如果仍然使用 bash,一种更安全的选择是只导出一个函数而不是一个变量。
  • @KamilCuk 是的,没错。
  • 如果 aria2c 是从 python 而不是 bash 调用的,这种方法会起作用吗?例如。是否可以将 shell 函数作为 env var 添加到 aria2c 子进程调用的上下文中?
  • 可能不是(我不确定是否可以通过不是 bash 的进程导出 bash 函数),但是来自这个答案的原始版本的 eval 方法的变体可能会起作用(即导出一个子进程可以读取的环境变量)。
猜你喜欢
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2019-01-20
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多