问题:
我需要向命名管道发送命令,并且需要确保仅发送命令,而不发送任何错误或“笨手笨脚”的字符。
例子:
我一直在使用以下内容:
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}
);command
printf
显然不包括以非字面方式解释的片段; notecommand
被解释为格式(man 1 printf
详情请参阅);如果有的话%s
,straycharacters
就会被替换。
正确的传递方式command
(和换行符)是
printf '%s\n' 'command' >/path/to/namedPipe # straycharacters
在哪里
\n
负责打印换行符;straycharacters
出现在评论中;- 所有应该按字面传递的字符串
printf
都是单引号的(尽管您可能想要双引号command
,例如,如果它依赖于设计的参数替换)。
在代码中包含“错误或笨拙的字符”是错误的。不要试图找到忽略它们的语法,只需删除这些垃圾并注意即可。这将使您的代码干净漂亮。
straycharacters
即使没有,仍然echo
不是一个正确的工具。看为什么 printf 比 echo 更好?