如何正确地将字符串写入命名管道以及echo和printf之间的区别

如何正确地将字符串写入命名管道以及echo和printf之间的区别

问题:

我需要向命名管道发送命令,并且需要确保仅发送命令,而不发送任何错误或“笨手笨脚”的字符。

例子:

我一直在使用以下内容:

echo "command" > /path/to/namedPipe

这工作正常,但我注意到一些奇怪的事情,即可以将错误的击键发送到管道。例如:

echo "command" > /path/to/namedPipe straycharacters

然后<command><straycharacters>都写入到namedPipe。我不会想到会发生这种情况,但在某些情况下它真的会弄乱我的程序。我还注意到 echo 似乎不需要引号。我的命令不需要引号,只需要实际的<command>.仅写入<command>管道的 最佳实践是什么?

可能的解决方案:

printf "command" > /path/to/namedPipe straycharacters

在我的终端中,这只打印出来<command>,而不打印出来<straycharacters>,到目前为止,它似乎与我的程序兼容。然而它与 echo 有点不同,因为它似乎不包含新行。

答案1

这个命令

echo "command" > /path/to/namedPipe straycharacters

相当于

echo "command" straycharacters >/path/to/namedPipe

(比较) 并echo打印其所有操作数,在本例中straycharacters也是如此。同样,您的“工作”解决方案相当于

printf "command" straycharacters >/path/to/namedPipe

它“有效”只是因为

  • command显然不包括 shell 以非字面方式解释的片段(如${PATH});
  • commandprintf显然不包括以非字面方式解释的片段; notecommand被解释为格式(man 1 printf详情请参阅);如果有的话%sstraycharacters就会被替换。

正确的传递方式command(和换行符)是

printf '%s\n' 'command' >/path/to/namedPipe    # straycharacters

在哪里

  • \n负责打印换行符;
  • straycharacters出现在评论中;
  • 所有应该按字面传递的字符串printf都是单引号的(尽管您可能想要双引号command,例如,如果它依赖于设计的参数替换)。

在代码中包含“错误或笨拙的字符”是错误的。不要试图找到忽略它们的语法,只需删除这些垃圾并注意即可。这将使您的代码干净漂亮。

straycharacters即使没有,仍然echo不是一个正确的工具。看为什么 printf 比 echo 更好?

相关内容