【问题标题】:How to parametrize a function call in bash without using eval?如何在不使用 eval 的情况下参数化 bash 中的函数调用?
【发布时间】:2022-01-24 10:37:59
【问题描述】:

我有以下代码(简化):

if ! sudo -u user command1 "$Options" -o1 -o2 2>>"$log" > "$Dir"/output;

但是,在某些情况下(在运行时确定,如果变量 docker 设置为 true),我反而想执行

if ! docker exec -t "$cont" command2 "$Options" -o1 -o2 2>>"$log" > "$Dir"/output;

改变的是调用命令的方式(1 或 2)。其余参数保持不变。

所以我想参数化对 command1 或 command2 的调用。

类似

if $docker then;
  Command = docker exec -t "$cont" command2
else
  Command = sudo -u user command1

if ! $Command "$Options" -o1 -o2 2>>"$log" > "$Dir"/output;

这不起作用。是否有可能在不诉诸 eval 的情况下实现我想要的,我认为这是一种不好的做法?

谢谢

【问题讨论】:

  • 改用数组?
  • 我如何“调用”一个数组呢?这些不仅仅是参数,它也是命令......在this help中,它似乎只提到了需要参数化参数的情况,但我需要参数化函数调用

标签: bash


【解决方案1】:

您可以使用数组来保存特定于命令的部分,并依靠分词来构建整个命令行来运行。类似的东西

#!/usr/bin/env bash

# Set up your assorted variables used below

if $docker; then
  cmd=(docker exec -t "$cont" command2)
else
  cmd=(sudo -u user command1)
fi

if ! "${cmd[@]}" "$Options" -o1 -o2 2>>"$log" > "$Dir"/output; then
# etc.
fi

【讨论】:

  • omg 我离得太近了,我不知道数组可以用于命令,而不仅仅是参数。谢谢。
  • 所以澄清一下,这比 eval 替代方案更好,对吧?怎么样(没有过多的细节),因为最后似乎在这两种情况下都有字符串注入?
  • 是的,它比 eval 更好。使双重评估变量变得更加困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2018-07-13
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2015-07-07
相关资源
最近更新 更多