gpt4 book ai didi

linux - 保护包含空格的参数免受 eval 的影响

转载 作者:太空狗 更新时间:2023-10-29 11:37:59 30 4
gpt4 key购买 nike

为了让 eval 处理其中一个参数中包含空格的命令,到目前为止我只发现它可以工作:

eval 'sed 's/foo/foo'" "'bar/g' filename'

在用户输入命令然后将命令和参数提供给 eval 的假设程序中,这不是一个非常优雅或稳健的解决方案。有没有其他方法可以运行 eval 命令,以便 my_command 的界面更加用户友好?以下是程序现在如何接受参数的示例。

my_command 'sed 's/foo/foo'" "'bar/g' filename'

我希望界面像这样工作:

my_command sed 's/foo/foo bar/g' filename

编辑:

我会试着问一个不同的问题:

如何让 bash 从命令行读取输入?我希望保留准确的输入,所以如果有引号我想保留它们。我可以通过使用 egrep 从文件中读取然后清理输入来完成我想做的事情,如下所示:

egrep '/.*/' filename |
sed 's/\(.*\)['"'"']\(.*\) \(.*\)['"'"']\(.*\)/\1'"\'"'\2" "\3'"\'"'\4/g'

“文件名”包含这一行

sed 's/foo/foo bar/g' file

这给了我想要的输出:

sed 's/foo/foo" "bar/g' file

这里的问题是我不能 echo "$@" 因为 bash 会解释引号。我想要文字输入而不必从文件中读取。

最佳答案

原始问题

对于您喜欢的用例,您只需编写(在 my_command 内):

"$@"

执行给定的命令。

您的 eval 行很奇怪:

eval 'sed 's/foo/foo'" "'bar/g' filename'

由于单引号不嵌套的方式,它等同于:

 eval 'sed s/foo/foo" "bar/g filename'

修改后的问题

可能的解决方案:

egrep '/.*/' filename | sh

这会将 filename 中的内容直接提供给 shell 进行解释。给定的 file 包含:

Some text containing foo; and bar.
More foo bar?
More text; more foo and bar; more foo bar beyond the possibility of unfooing.

输出是:

Some text containing foo bar; and bar.
More foo bar bar?
More text; more foo bar and bar; more foo bar bar beyond the possibility of unfoo baring.

修复引号很难!

请注意,您的复杂 sed 脚本还不够复杂。给定的 filename 包含:

sed 's/foo/foo bar/g' file
sed 's/foo bar/foo bar baz/g' file

输出来自:

egrep '/.*/' filename |
sed 's/\(.*\)['"'"']\(.*\) \(.*\)['"'"']\(.*\)/\1'"\'"'\2" "\3'"\'"'\4/g'

是:

sed 's/foo/foo" "bar/g' file
sed 's/foo bar/foo bar" "baz/g' file

这并没有解决eval 的所有问题。

在相当长的一段时间内(毫不夸张地说,四分之一个世纪),我断断续续地花了很多时间来研究这些问题,而且这不是微不足道的。您可以在 How to iterate over arguments in bash script 中找到一个详尽的讨论.在某个地方,我有另一个答案,它经历了关于这些东西的旋转,但我无法立即找到它(其中“立即”意味着一个小时左右的分心搜索,其中分心是重复的问题集,等等)。它可能已被删除,或者我可能找错了地方。

关于linux - 保护包含空格的参数免受 eval 的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820617/

30 4 0
文章推荐: html - 如何使 html