Shell

將文件內容重定向到命令“echo”

  • October 12, 2021

我有一個名為的文件my_file.txt,其內容只是字元串Hello。如何將其內容重定向到命令echo

我知道我有命令less, cat, more… 但我需要用echo.

我試過這個:

$ cat my_file.txt | echo

還有這個:

$ echo < my_file.txt

但在這兩種情況下,它在標準輸出中只出現一個空白,而不是 my_file.txt 的內容。

我怎麼能那樣做?

你可以重定向所有你想要的, echo但它不會做任何事情。echo不讀取其標準輸入。它所做的只是將其參數寫入標準輸出,由空格字元分隔並由換行符終止(並且在某些實現中擴展了一些轉義序列和/或以可能視為選項echo開頭的參數)。-

如果要echo顯示文件的內容,則必須將該內容作為參數傳遞給echo. 就像是:

echo "$(cat my_file.txt)"

請注意,從該命令的輸出中$(...)刪除尾隨換行符scat,並echo添加一個回。

另請注意,除了zsh,您不能在命令的參數中傳遞 NUL 字元,因此上述內容通常不適用於二進製文件。yash還將刪除不構成有效字元一部分的字節。

如果想要這樣做的原因是因為您想echo擴展文件中的\n, \b, \0351… 轉義序列(正如 UNIX 兼容echo實現所做的那樣,但不是全部),那麼您寧願printf使用

printf '%b\n' "$(cat my_file.txt)"

相反echo,它是可移植的,如果文件的內容以-.


作為$(cat file), with ksh, zshand的一種替代方法,bash還可以:$(<file) . 這是一個特殊的運算符,shell通過它而不是cat讀取文件的內容來組成擴展。除了zsh. 在bash中,這仍然會產生一個額外的過程。另請注意,一個區別是,如果嘗試以這種方式讀取目錄類型的文件,您將不會收到任何錯誤。此外,雖然$(< file)是特殊的,但$(< file; other command)不是(在zsh不模擬其他 shell 時,仍會file通過執行隱式 $READNULLCMD命令(通常是尋呼機)擴展 的內容)。

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