arrays - 在 bash robuSTLy 中传递部分命令

标签 arrays bash escaping syntax-error eval

我想在 bash 中传递部分命令,以便:

commandpart=( --flags "filename" >/dev/null )
command "${commandpart[@]}"

将评估为:

command --flags "filename" >/dev/null

这以前对我很有用,不幸的是把 >在 bash 数组中会导致语法错误。

syntax error near unexpected token `>'
`commandpart=( --flags "filename" >/dev/null )'

我尝试过的其他方法是将其全部粘贴到一个字符串中,然后 eval正在处理它:

commandpart="--flags filename >/dev/null"
eval "command $commandpart"

但这会带来转义、空格等问题(并且 eval 并不是最佳实践)

最好,如何修复第一个示例中的语法错误而不转义像 <>& 这样的字符?我想继续使用这种数组语法,因为它似乎比 eval 更强大并且不需要转义。

如果没有,是否有另一种方法可以满足我的需要来移动部分命令?

加分点:如果我将参数传递给我的脚本以像这样执行:

#!/bin/bash
echo "script running"
command "${@}"

我有一个新问题,添加 >/dev/null脚本调用将其应用于脚本,而不是命令:

$ script >/dev/null

在转义时将其应用于命令,但作为字符串没有预期的效果。 (例如,如果命令是 firefox,它将在名为“>/dev/null”的页面打开 firefox,并立即显示 404)

最佳答案

来自 bash(1):

A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. The first word specifies the command to be executed, and is passed as argument zero. The remaining words are passed as arguments to the invoked command.

这意味着重定向不是命令行的一部分。它们被 bash 解释为命令将在其中运行的“环境”描述的一部分,等同于在它之前分配环境变量。

来自同一个 bash(1):

Expansion is performed on the command line after it has been split into words.

这暗示了这样一个事实,即在参数扩展(在您的情况下为“${commandpart[@]}”)发生时,单词已经与重定向分开了。由于这不太可能发生两次,这意味着参数扩展的结果不会被解释为重定向。

您可以通过创建一个函数来引用不是重定向的数组元素,遵循 bash 引用规则,然后将它们作为参数传递给 eval。但是,该函数必须能够像 bash 一样区分重定向和“单词”,并且有 many kinds .这也可能需要引用某些类型的重定向的部分内容。

我建议不要存储/传递重定向,而是在必要时应用它们代替调用。如果您总是需要使用某些命令进行重定向,请制作包装函数或脚本。

关于arrays - 在 bash robuSTLy 中传递部分命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383651/

相关文章:

c# - 创建一个返回数组的方法

java - 即使调用了break,循环仍在运行;

c - 换页不清除屏幕

c - 如何在 C 中输出冒泡排序的二维字符串数组?

javascript - 按索引访问非数字对象属性?

bash - 给定别名,从ssh config获取主机名

linux - 当 SSH 进入系统时,有没有办法像我做 VIM 一样从命令行启动 netbeans?

bash - echo "#!"失败 -- "event not found"

django 在渲染表单时转义小部件

java - 如何转义json?