
我的場景很簡單 - 我正在從Mercurial 線上圖書並將它們貼到 Windows 命令提示字元中。問題在於書中的範例使用單引號字串。當在 Windows 命令提示字元上傳遞單引號字串時,後者無法識別單引號之間的所有內容都屬於一個字串。
例如,以下命令:
hg commit -m 'Initial commit'
無法按原樣貼在命令提示字元中,因為後者將其視為'Initial commit'
兩個字串 -'Initial
和commit'
。貼後我必須編輯命令,這很煩人。
是否可以指示 Windows 命令提示字元以類似雙引號的方式處理單引號?
編輯
根據 JdeBP 的回复,我做了一些研究。總結如下:
Mercurial 入口點如下所示(它是一個 python 程式):
def run(): "run the command in sys.argv" sys.exit(dispatch(request(sys.argv[1:])))
因此,我創建了一個小型 python 程式來模仿 Mercurial 使用的命令列處理:
import sys print sys.argv[1:]
這是 Unix 控制台日誌:
[hg@Quake ~]$ python 1.py "1 2 3" ['1 2 3'] [hg@Quake ~]$ python 1.py '1 2 3' ['1 2 3'] [hg@Quake ~]$ python 1.py 1 2 3 ['1', '2', '3'] [hg@Quake ~]$
這是對應的 Windows 控制台日誌:
C:\Work>python 1.py "1 2 3" ['1 2 3'] C:\Work>python 1.py '1 2 3' ["'1", '2', "3'"] C:\Work>python 1.py 1 2 3 ['1', '2', '3'] C:\Work>
可以清楚看到 Windows 並不將單引號視為雙引號。這就是我問題的本質。
答案1
無法在 command.com 提示字元中變更引號字元。但是,您可以使用 PowerShell,它接受單引號和雙引號作為引用字元。它們的功能與 Unix shell 中的功能相同。即,單引號不會擴展變量,而雙引號則會。
您可能仍然會遇到引號內引號的問題。例如,我在 Windows 電腦上安裝了 Strawberry Perl。當我perl -e 'print time, "\n" '
在 PowerShell 中運行時,我看到諸如1321375663SCALAR(0x15731d4)
.我必須轉義雙引號才能使其按預期工作:perl -e 'print time, \"\n\" '
答案2
首先,命令提示字元不是命令解釋器。 (命令提示字元就是這樣顯示者命令解釋器。)其次,您的命令解釋器、它發出的提示以及 Win32 控制台具有什麼都沒有與此有關。
在 Win32 程式中,將命令列拆分為「單字」(C 和 C++ 語言中的程式將其視為傳遞給的參數數組的以 NUL 結尾的多位元組字串main()
)是這些程式的運行時庫的職責。在 Unices 和 Linux 上,shell 執行分詞,因為作業系統實際上是根據參數字串陣列工作的。 Win32 的情況並非如此。在 Win32 上,作業系統本身會按照以下方式運行命令尾: A單身的長字串,仍然包含最初在命令列中鍵入的所有引號。 (那裡是命令解釋器在將其傳遞到目標程式之前對此命令尾部進行的一些處理,但與分詞無關。
在您的情況下,您的程式的運行時庫hg
將透過以下命令尾部傳遞:
commit -m '初始提交'
編譯程式的運行時庫不知道您的意思是單引號是空白引用字符,因為這不是慣例。大會達成交易僅有的用雙引號(以及雙引號前的反斜線)。
此約定內建於運行時庫中,該運行時庫隨最初用於創建程式的編譯器一起提供。如果您想更改約定,則必須重新連結您想要以這種方式運行的每個單獨的程序使用您自己製作的特殊運行時庫,該庫也可以識別單引號。顯然這是不切實際的(除非這些都是 Cygwin 程式)。
更實用的方法是做您已經在做的事情:認識到 Windows 不是 Unix,並在使用範例之前相應地調整它們。
答案3
我確信你無法編輯 DOS 解析指令的方式。它是其基本程式設計所固有的。
我能想到的加快速度的唯一解決方案是保持記事本視窗打開並運行「尋找和替換」——用雙引號替換所有單引號。然後從那裡複製並貼上到 DOS 中。