Terminal

如何將命令的確切結果列印到文件中

  • August 12, 2021

語境

我有一個文件my-cmd

echo '<some data...>\\<some other data...>'

基本上,我想將此命令的輸出重定向到一個文本文件:

./my-cmd > file.txt

問題

我的問題是它>總是替換任何出現的\\to \in file.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混亂的回答是一個新的print內置函式,它-r可以選擇不擴展\x序列和-標記選項的結束。zsh確實有一個類似 Korn 的print內置函式,但bash沒有。

在 ksh 和 zsh 中,您還可以執行以下操作:

print -r - "$var"

按原樣列印任意數據。

更多詳情請訪問:

如果my-cmd這樣做:

echo "abc\\def"

輸出將是abc\def:反斜杠被解釋為雙引號內的轉義字元。OTOH,它被視為單引號內的文字反斜杠:

echo 'abc\\def'

abc\\def作為輸出產生。

編輯:這是用 bash 測試的。OP 已將標籤更改為“zsh”,因此這並不能回答他的問題。如果版主認為它現在無關緊要,我將刪除它。

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