Linux

如何正確地將字元串寫入命名管道以及 echo 和 printf 之間的區別

  • June 13, 2019

問題:

我需要向命名管道發送命令,並且需要確保只發送命令,而不是任何錯誤或“胖手指”字元。

例子:

我一直在使用以下內容:

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);如果有%sstraycharacters將被替換。

正確的傳遞方式command(和換行符)是

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

在哪裡

  • \n負責列印換行符;
  • straycharacters出現在評論中;
  • 所有應該按printf字面意思傳遞的字元串都是單引號(儘管您可能想要雙引號command,例如,如果它依賴於設計的參數替換)。

在您的程式碼中包含“錯誤或胖手指字元”是錯誤的。不要試圖找到忽略它們的語法,只需刪除這些垃圾並註意。這將使您的程式碼乾淨漂亮。

儘管如此,即使沒有straycharacters,echo也不是一個正確的工具。請參閱為什麼 printf 比 echo 更好?

引用自:https://unix.stackexchange.com/questions/524583