arrays - 使用管道运行 bash 数组

标签 arrays bash pipeline

如何从包含管道的 bash 数组运行命令行?

例如,我想运行 ls | grep x 通过:

$ declare -a pipeline
$ pipeline=(ls)
$ pipeline+=("|")
$ pipeline+=(grep x)
$ "${pipeline[@]}"

但是我明白了:

ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access x: No such file or directory

最佳答案

简短形式:你不能(不编写一些代码),这是一个功能,而不是错误。

如果您以安全的方式做事,您就是在保护您的数据不被解析为代码(语法)。然而,您在这里明确想要的是将数据视为代码,但只是以一种受控的方式。

你可以做的是迭代元素,如果它们不是管道,则使用 printf '%q ' "$element" 获取安全引用的字符串,如果它们是管道,则不替换它们.

在这样做之后,并且只有在这样做之后,您才能安全地评估输出字符串。

eval_args() {
  local outstr=''
  while (( $# )); do
    if [[ $1 = '|' ]]; then
      outstr+="| "
    else
      printf -v outstr '%s%q ' "$outstr" "$1"
    fi
    shift
  done
  eval "$outstr"
}
eval_args "${pipeline[@]}"

顺便说一句——不这样做会更安全。考虑一下您正在处理文件列表的情况,其中一个名为 |;攻击者可以使用此策略来注入(inject)代码。为前后数组使用单独的列表,或者仅将管道的一侧设为数组并对另一侧进行硬编码,是更好的做法。

关于arrays - 使用管道运行 bash 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16992684/

相关文章:

java - 将数据从扫描仪写入阵列

bash - 如何将多个公钥转换为一行?

python - scikit-learn 中重复的FeatureUnion

python - 在 NumPy 数组上调用 `np.asarray' 是否有很大的开销?

javascript - 从javascript中的json格式获取未知父节点的子节点

linux - 获取上个月修改的文件数

python - 使用 python 文件夹中的文件选项运行 .py

javascript - StreamSets 将 Text 转换为 Json

c++ - 你能制作自己的渲染管线吗?

java - 将字节数组直接复制到Java中的剪贴板