我正在尝试通过以下方式传输 nc 收到的任何内容:
nc -l 20000 | xargs /root/test
...它工作得很好,除非 xargs 收到带引号的参数 - 它将它们分开,就好像它们是分开的一样...
迭代参数 ( /root/test
) 显示它们未正确传递:
for i in $*; do
echo "$i"
done
发送echo 'test1 test2'
到端口 20000 (nc) 会导致:
echo
'test1
test2'
我尝试将请求( nc 收到的内容)封装在双引号中,并"echo \'test1 test2\'"
根据以下答案转义任何引号(例如 ):https://unix.stackexchange.com/a/38151/224371,但这没有帮助,我只是得到:
echo
\'test1
test2\'
答案1
netcat 不应该影响通过它发送的数据,因此我将跳过它并专注于通过管道传输到 xargs。
这里:
echo "aa 'bb cc'" | xargs
shell 删除一组引号,将字符串发送aa 'bb cc'
到 xargs。 xargs 默认情况下将带引号的字符串作为单个元素(删除引号),将字符串传递aa
给bb cc
它运行的命令。
另一方面,这里:
echo "aa \'bb cc\'" | xargs
shell 再次删除一组引号,留下aa \'bb cc\'
.单引号(带或不带反斜杠)在双引号内并不特殊。不过,双引号内的双引号需要转义。
xargs 看到该字符串,执行自己的引号删除,但由于现在引号已转义,因此它只是删除反斜杠并在空格上拆分。留下三个字符串:aa
、'bb
和cc'
。这就是你所看到的。
通常,我们希望相反:避免让 xargs 处理引号,因为它们可能是文件名的一部分。所以你会在这里看到五打问题推荐xargs -0
或xargs -d'\n'
替代。但是如果您希望 xargs 处理带引号的字符串,则需要将引号发送给它而不进行转义。
另一个问题是您的测试脚本使用$*
.如果没有引号,这将拆分空格上的所有参数并对结果单词执行通配。 (使用引号,它将导致参数连接为单个字符串。)您几乎总是想使用它"$@"
。或者在这里只是:
for i do
echo "$i"
done
甚至:
printf '%s\n' "$@"
因此,请检查引号的转义并使用"$@"
代替$*
。
$ cat args.sh
for x in "$@" ; do echo ":$x" ; done
$ echo "aa 'bb cc' \"dd ee\""
aa 'bb cc' "dd ee"
$ echo "aa 'bb cc' \"dd ee\"" | xargs ./args.sh
:aa
:bb cc
:dd ee