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