【发布时间】:2022-01-23 16:38:55
【问题描述】:
我正在尝试让脚本监听 stdin(所以我运行它并且它不会立即退出)并且仅在 stdin 不为空时执行,然后将 stdin 行传递给另一个命令。 现在我正在使用来自the answer here的命令:
xargs -I {} sh -c 'echo {} | foo'
我想保留标准输入的双引号,因为人们建议使用 -d '\n' 但这会导致 foo 在空行上运行。
我研究了可能的 GNU Parallel 解决方案,但一无所获。
这是我的标准输出:
>xargs -I {} sh -c 'echo {} | foo'
bar
I have executed for 'bar'
"bar"
I have executed for 'bar' //notice the double quotes missing
^C
>xargs -I {} sh -c "echo '{}' | foo"
bar
I have executed for 'bar'
"bar"
I have executed for 'bar' //Same thing, double quotes missing
^C
>xargs -d '\n' -I {} sh -c "echo {} | foo"
i have executed for '' //doesn't ignore empty lines anymore
i have executed for ''
bar
i have executed for 'bar'
"bar"
i have executed for 'bar'
期望的输出:
bar
I have executed for 'bar'
"bar"
I have executed for '"bar"'
跑步
echo '"bar"' | foo
了解我
I have executed for '"bar"'
【问题讨论】:
-
xargs sh -c '...{}...'会导致严重的安全问题。是的,你看到人们一直都在这样做,但不要通过自己做来助长问题。 (find ... -exec sh -c '...{}...' \;也是如此)。数据应始终从代码带外传递以避免注入攻击——不仅在 bash 中,在其他任何地方也是如此。 -
也就是说,听从 Tripleee 的建议。 ????