如何將命令的確切結果列印到文件中
語境
我有一個文件
my-cmd
:echo '<some data...>\\<some other data...>'
基本上,我想將此命令的輸出重定向到一個文本文件:
./my-cmd > file.txt
問題
我的問題是它
>
總是替換任何出現的\\
to\
infile.txt
。我怎樣才能防止這種行為?
echo
是一個不可移植的命令,其行為因實現、版本、它們的編譯時和執行時選項以及環境而異。
-
特別是,如果它的第一個參數可能以開頭(儘管 zsh 的內置echo
函式是可以解決此問題的罕見實現之一)或任何參數包含反斜杠字元,則不應使用它。特別是對於
zsh
echo
內置實現,除非啟用該選項(在大多數部署中預設禁用),否則會擴展\
序列(如\n
,\c
,\61
,\\
…)(根據 POSIX+XSI 的要求,而沒有 XSI 的 POSIX 則未指定行為),而bsdecho
因為bash
它們僅在xpg_echo
啟用時擴展(在大多數部署中預設禁用)。
zsh
和s都bash
echo
支持(非標準)選項來禁用擴展(如果同時啟用了和選項,則’s-E
不支持)。bash``xpg_echo``posix
在這裡,即使您可以這樣做:
echo -E '<some data...>\\<some other data...>' > file
zsh
在大多數部署中都可以正常工作,使用標準命令bash
會更好:printf
printf '%s\n' '<some data...>\\<some other data...>' > file
在這種情況下,其行為完全由 POSIX 指定,並且在所有實現中都相同。
請注意,該
printf
實用程序是一項 POSIX 發明。早在 POSIX 之前,Korn shell 對這種不可移植的echo
混亂的回答是一個新的-r
可以選擇不擴展\x
序列和-
標記選項的結束。zsh
確實有一個類似 Korn 的bash
沒有。在 ksh 和 zsh 中,您還可以執行以下操作:
print -r - "$var"
按原樣列印任意數據。
更多詳情請訪問:
如果
my-cmd
這樣做:echo "abc\\def"
輸出將是
abc\def
:反斜杠被解釋為雙引號內的轉義字元。OTOH,它被視為單引號內的文字反斜杠:echo 'abc\\def'
將
abc\\def
作為輸出產生。編輯:這是用 bash 測試的。OP 已將標籤更改為“zsh”,因此這並不能回答他的問題。如果版主認為它現在無關緊要,我將刪除它。