Linux
如何正確地將字元串寫入命名管道以及 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 有點不同,因為它似乎不包含新行。
這個命令
echo "command" > /path/to/namedPipe straycharacters
相當於
echo "command" straycharacters >/path/to/namedPipe
(比較this)並
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 更好?