Bash:如何打印并运行其中包含管道运算符 | 的 cmd 数组

2024-07-01

这是我的问题的后续:当命令的参数带有空格或要扩展的内容时,如何编写 bash 函数来打印和运行命令 https://stackoverflow.com/q/71117953/4561887

假设我有这个函数来打印并运行存储在数组中的命令:

# Print and run the cmd stored in the passed-in array
print_and_run() {
    echo "Running cmd:  $*"
    # run the command by calling all elements of the command array at once
    "$@"
}

这工作正常:

cmd_array=(ls -a /)
print_and_run "${cmd_array[@]}"

但这不起作用:

cmd_array=(ls -a / | grep "home")
print_and_run "${cmd_array[@]}"

Error: syntax error near unexpected token `|':

eRCaGuy_hello_world/bash$ ./print_and_run.sh 
./print_and_run.sh: line 55: syntax error near unexpected token `|'
./print_and_run.sh: line 55: `cmd_array=(ls -a / | grep "home")'

我怎样才能让这个概念与管道操作员一起工作(|)在命令中?


如果你想处理一个只包含|作为生成管道的指令,您可以这样做。我不推荐它 - 如果您不验证字符串中的变量不能仅包含单个管道字符,则意味着您存在安全风险 - 但这是可能的。

下面,我们创建一个随机的一次性"$pipe"使攻击变得更加困难的印记。如果你不愿意这样做,那就改变[[ $arg = "$pipe" ]] to [[ $arg = "|" ]].

# generate something random to make an attacker's job harder
pipe=$(uuidgen)

# use that randomly-generated sigil in place of | in our array
cmd_array=(
  ls -a /
  "$pipe" grep "home"
)

exec_array_pipe() {
  local arg cmd_q
  local -a cmd=( )
  while (( $# )); do
    arg=$1; shift
    if [[ $arg = "$pipe" ]]; then
      # log an eval-safe copy of what we're about to run
      printf -v cmd_q '%q ' "${cmd[@]}"
      echo "Starting pipeline component: $cmd_q" >&2
      # Recurse into a new copy of ourselves as a child process
      "${cmd[@]}" | exec_array_pipe "$@"
      return
    fi
    cmd+=( "$arg" )
  done
  printf -v cmd_q '%q ' "${cmd[@]}"
  echo "Starting pipeline component: $cmd_q" >&2
  "${cmd[@]}"
}

exec_array_pipe "${cmd_array[@]}"

查看它在在线沙箱中运行:https://ideone.com/IWOTfO https://ideone.com/IWOTfO

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash:如何打印并运行其中包含管道运算符 | 的 cmd 数组 的相关文章

  • 使用Curl数据二进制选项,内存不足

    我正在尝试使用curl来上传数据 我需要上传二进制数据 不幸的是 我认为curl首先将文件二进制文件加载到内存中 因此对于大文件来说这是一个问题 我使用的系统的可用内存非常少 因此即使是 8mb 大的文件也很困难 我得到 curl opti
  • 如何显示带有完整路径或文件名的“grep”结果[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 使用时如何获取完整的文件路径grep 我使用类似的命令 cat log grep somethingtosearch 我需要显示结果以及从
  • Swift - 创建“Array”类型的自定义类

    如何在 swift 中创建一个类型的自定义类Array 确切地说 我有一个自定义类型类Car 现在我想创建一个单例 它是一个数组Cars 因为我希望能够从我的应用程序中的任何位置访问它 我的解决方法是将我的单例定义为NSMutableArr
  • 将数组项合并到字符串中[重复]

    这个问题在这里已经有答案了 如何将所有数组项合并为一个字符串 Use the implode功能 http php net manual en function implode php 例如 fruits array apples pear
  • linux键盘驱动源码

    我一直致力于为 Linux 制作自己的键盘驱动程序 所以我发现了这两个链接 usbkbd c http lxr free electrons com source drivers hid usbhid usbkbd c and atkbd
  • awk 如何找到带括号的变量的匹配项?

    我有一个文件some file txt 我想在其中找到匹配线name方括号内 必须完全匹配 因为某些单词可能会重复 例如foo在下面的例子中 文档内容如下所示 foo url foo Foo url bar Bar url fizz buz
  • 比较 2 个数组并显示数组 1 中不匹配的元素 [重复]

    这个问题在这里已经有答案了 我有 2 个数组 如下所示 我想比较两个数组 并且只提供 check 中不存在于 data 数组中的元素 var check 044 451 data 343 333 044 123 444 555 使用的函数如
  • 获取Java InputStream后面的文件的字节数

    正如标题所示 我需要知道文件在输入流 后面 有多少字节 我不想下载所有字节和计数 需要很长时间 我只需要知道文件有多少字节 像这样 int numberOfBytes countBytes inputStream 所以 我需要 countB
  • 为什么我们不能将新字符串分配给 char 数组,而是分配给指针?

    我试图将字符串重新分配给预初始化的数组 a 但我得到的只是一个错误 main char a Sunstroke char b Coldwave a Coldwave b Sunstroke printf n s s a b 错误 从类型 c
  • 如何在Linux上正确设置串行通信

    我正在尝试从 FPGA 板读取数据以及向 FPGA 板写入数据 该板本身附带一个驱动程序 每当板插入时 该驱动程序都会创建一个名为 ttyUSB0 的终端设备 在 FPGA 上 实现了异步接收器和发送器 并且它们似乎可以工作 然而 C 方面
  • ruby - 如何从字符串数组中生成可能的字母顺序组合?

    我有一个字符串数组 ABC GHI 我想要所有 字母 组合 从左到右读 即 AG AH AI BG BH BI CG CH CI but not GA GB HA etc 相似地 ABC DEF GHI 应该生成 ADG ADH ADI A
  • Bash:如何打印并运行其中包含管道运算符 | 的 cmd 数组

    这是我的问题的后续 当命令的参数带有空格或要扩展的内容时 如何编写 bash 函数来打印和运行命令 https stackoverflow com q 71117953 4561887 假设我有这个函数来打印并运行存储在数组中的命令 Pri
  • 使用脚本取消设置 PDF 字体

    我正在使用 xhtml2pdf 库自动创建 PDF 几个月前我有过这个问题 https stackoverflow com questions 25203219 xhtml2pdf doesnt embed helvetica 库嵌入了我没
  • numpy 不规则跨步数组

    引用文档 http docs scipy org doc numpy reference arrays ndarray html internal memory layout of an ndarray关于内存中的 numpy 数组结构 N
  • 在 1 级深度上翻转键值对

    我有对象 const pairs A D 1 2 3 B D 3 2 1 C D 4 3 2 1 B 0 1 2 3 我怎样才能让它翻转 const fliped D A 1 2 3 B 3 2 1 C 4 3 2 1 B C 0 1 2
  • chrome 对象 console.log 中的奇怪行为

    当我尝试在 Chrome 中 console log 一个对象时 它在 console log 的第一行中指出 您可以在其中看到 Object 此处的小摘要 我的 posts 数组的长度为 0 posts Array 0 然而 当我展开帖子
  • AFNetworking 在 post 请求的 JSON 参数中发送数组

    我正在尝试通过 POST 将参数发送到我的服务器 并且它通常可以工作 但我不知道如何发送包含数组作为参数之一的 JSON 这是我尝试过的 AFHTTPClient httpClient AFHTTPClient alloc initWith
  • Java将浮点字符串解析为浮点数组?

    有没有一种简单的方法将浮点字符串解析为浮点数组 我正在编写一个导入程序 它需要解析一个 ascii 文件以获取一些值 我只是想知道是否有更简单的方法来执行此操作 然后自己搜索所有空白并使用Float parseFloat s 对于每个空格分
  • Java将浮点字符串解析为浮点数组?

    有没有一种简单的方法将浮点字符串解析为浮点数组 我正在编写一个导入程序 它需要解析一个 ascii 文件以获取一些值 我只是想知道是否有更简单的方法来执行此操作 然后自己搜索所有空白并使用Float parseFloat s 对于每个空格分
  • Ruby - 根据数组顺序对哈希值(字符串)数组进行排序

    我有一个如下所示格式的哈希数组 我正在尝试对 book基于单独数组的哈希键 该顺序不是按字母顺序排列的 对于我的用例来说 它不能按字母顺序排列 我需要根据以下数组进行排序 array Matthew Mark Acts 1John 请注意

随机推荐

  • 如何获取 Angular 5 组件元素的位置?

    在 5 角分量中 我有一个table 我需要创建一些类似叠加多个div上面几个td的 获得这些职位的最佳方法是什么td位于表格中 以便我可以放置其他元素 我目前正在尝试使用类似的东西 ViewChild table tableElement
  • 使用应用程序属性的 @Cacheable 条件

    我正在尝试将 Redis 与 Spring 一起使用 Cacheable但需要根据 Spring Boot 样式应用程序属性有条件地打开或关闭缓存 我的第一次尝试似乎不起作用 application properties 文件 auth t
  • 铆钉、Backbone.View 和 Backbone.Collection

    在过去的视图周中 我尝试了多种方法让 Rivets 与 Backbone View 和 Backbone Collection 配合使用 我在互联网上找到的示例涵盖了我所有的尝试 但我仍然没有成功 这是我目前试图实现的挑战 让 Rivets
  • PostgreSQL - 限制总日志大小

    我有一个非常简单的要求 PostgreSQL 日志目录应该有固定的最大大小 例如所有 PostgreSQL 日志最大 10 GB 它可以通过创建固定大小的日志并使用日志轮换来实现 例如轮换 10 个日志文件 每个日志文件 1 GB 我尝试使
  • 在带有传送器的网格上 A* 可接受的启发法?

    假设您有一个二维单元格网格 其中一些单元格被墙填充 角色可以从一个方格迈出一步 到达距离该方格水平或垂直一步的任何方格 但不能越过墙壁 给定起始位置和结束位置 我们可以使用具有可接受启发式的 A 算法找到从起始位置到结束位置的最短路径 在当
  • 输入宽度与文本区域宽度

    读完主题后输入尺寸与宽度 https stackoverflow com questions 1480588 input size vs width 我很清楚我们不应该使用 size 属性而应该使用 css 样式 输入 文本 和文本区域显示
  • Android:如何使用“uses-library”?

    我的Android应用程序可以分为客户端UI层和API层 我想将它们部署为单独的 应用程序 以便可以重用 API 层 在 Eclipse 中 我将它们编写为 2 个独立的 Android 项目 在客户端 UI 项目中 我在其构建路径中声明
  • 将画布图像保存到服务器

    我正在尝试将画布图像保存到服务器 我可以保存文件 但它始终是 0 字节 我的代码有什么问题吗 php
  • 吉普犯错了!构建错误。堆栈错误:“make”失败,退出代码为 2

    我目前正在开发一个 Nodejs Web 应用程序 但我在使用 Cloud Foundry 在线推送该应用程序时遇到了问题 我对这些错误进行了一些研究 似乎某些正在安装的软件包存在一些冲突 这是 package json 文件 depend
  • ARC 不允许将非 Objective-C 指针类型“char *”隐式转换为“NSString *”

    对于以下代码行 我收到以下错误 for UILabel label in labels label text label tag 100 gt someMutableString length 错误指出 ARC 不允许将非 Objectiv
  • Google 跨客户端身份验证是否可以在 iOS 上实现?如果可以,如何实现?

    我正在使用 oAuth2 并且我的 google API 控制台中有一个项目 其中注册了 iOS 客户端和 Web 客户端 我想从我的 iOS 应用程序进行身份验证 并让我的 Web 后端检索访问令牌 以便它可以使用 Google api
  • 在 Maven 存储库中查找 Oracle JDBC 驱动程序

    我想将 oracle jdbc 驱动程序作为依赖项 运行时范围 添加到我的项目中 ojdbc14 在 MVNrepository 站点中 放入 POM 的依赖项是
  • 在 Eclipse 中打开 Android XML 布局的快捷方式

    例如 如果我有类似的东西 setContentView R layout activity main 有没有快捷方式可以打开activity main xml 如果没有 有没有办法创建一个 Its there Just hold Ctrl
  • 动态方法的实际例子?

    我想学习动态方法及其使用 C 的实际示例 动态方法和Reflection有什么关系吗 请帮我 我们正在使用动态方法来加速反射 这是我们的反射优化器的代码 只比直接调用慢10 比反射调用快2000倍 public class Reflecti
  • 如何禁止隐式任何?

    我正在使用 TSLint no any true no unsafe any true 它不允许 let foo any 然而它仍然允许 let foo 如何开启隐式any的规则 截至目前 tslint 中还没有选项可以实现这一目标 您可以
  • 如何为 MongoDB 集合中的所有文档选择单个字段?

    在我的 MongoDB 中 我有一个学生集合 其中包含 10 条包含字段的记录name and roll 该集合的一项记录是 id ObjectId 53d9feff55d6b4dd1171dd9e name Swati roll 80 我
  • 如果没有连接 USB 电缆,ADB over TCP/IP 无法工作

    我可以使用 USB 电缆通过 ADB 连接到我的智能手机 我还可以通过 tcp ip 连接到同一智能手机 adb connect 192 168 1 110 同时 USB 电缆仍处于连接状态 但是 一旦我断开电缆 我就会松开 tcp ip
  • 待定意图的多个实例

    我创建了一个小部件 单击该小部件会激活 PendingIntent 问题是 当我屏幕上有多个小部件时 只有最新的小部件才会启动 PendingIntent 我读过一些关于独特请求代码的内容 但没有弄清楚这一点 有什么想法可以让多个小部件和
  • 贝塞尔曲线python的递归函数

    我被要求设计一个名为 Bezier 的递归函数 其参数是给定点的列表 以及必须评估的点 它返回贝塞尔曲线中由点列表的控制点定义的点 这是我所做的算法 def Bezier point list t if len point list 1 r
  • Bash:如何打印并运行其中包含管道运算符 | 的 cmd 数组

    这是我的问题的后续 当命令的参数带有空格或要扩展的内容时 如何编写 bash 函数来打印和运行命令 https stackoverflow com q 71117953 4561887 假设我有这个函数来打印并运行存储在数组中的命令 Pri