mar*_*ark 9 windows command-line
我的场景很简单 - 我从Mercurial 在线书籍中复制脚本示例并将它们粘贴到 Windows 命令提示符中。问题是书中的示例使用了单引号字符串。在 Windows 命令提示符下传递单引号字符串时,后者无法识别单引号之间的所有内容都属于一个字符串。
例如,以下命令:
hg commit -m 'Initial commit'
Run Code Online (Sandbox Code Playgroud)
不能按原样粘贴在命令提示符中,因为后者将其'Initial commit'
视为两个字符串 -'Initial
和commit'
. 粘贴后我必须编辑命令,这很烦人。
是否可以指示 Windows 命令提示符以类似于双引号的方式处理单引号?
编辑
根据 JdeBP 的回复,我做了一些研究。这是摘要:
Mercurial 入口点看起来像这样(它是一个 python 程序):
def run():
"run the command in sys.argv"
sys.exit(dispatch(request(sys.argv[1:])))
Run Code Online (Sandbox Code Playgroud)因此,我创建了一个微型 python 程序来模拟 mercurial 使用的命令行处理:
import sys
print sys.argv[1:]
Run Code Online (Sandbox Code Playgroud)这是 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 ~]$
Run Code Online (Sandbox Code Playgroud)这是相应的 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>
Run Code Online (Sandbox Code Playgroud)可以清楚地看到,Windows 不会将单引号视为双引号。这就是我的问题的本质。
不能在 command.com 提示符下更改引号字符。但是,您可以使用 PowerShell,它接受单引号和双引号作为引用字符。它们的功能与在 Unix shell 中相同。即,单引号不会扩展变量,而双引号会。
您可能仍然会遇到引号内的引号问题。例如,我在我的 Windows 计算机上安装了草莓 perl。当我perl -e 'print time, "\n" '
在 PowerShell 中运行时,我看到诸如1321375663SCALAR(0x15731d4)
. 我必须转义双引号才能按预期工作:perl -e 'print time, \"\n\" '
首先,命令提示符不是命令解释器。(命令提示符是命令解释器显示的内容。 )其次,您的命令解释器、它发出的提示以及 Win32 控制台与此完全无关。
在 Win32 程序中,将命令行拆分为“单词”(C 和 C++ 语言中的程序将其视为传递给的参数数组的以 NUL 结尾的多字节字符串main()
)是这些程序的运行时库的职责。在 Unices 和 Linux 上,shell 执行分词,因为操作系统实际上是根据参数字符串数组工作的。Win32 的情况并非如此。在 Win32 上,操作系统本身按照命令尾部进行操作:一个长字符串,其中仍然包含最初在命令行上键入的所有引号。(在将命令尾部传递给目标程序之前,命令解释器对此命令尾部进行了一些处理,但与分词无关。)
在您的情况下,您的程序的运行时库hg
将通过以下命令尾部传递:
commit -m '初始提交'
编译该程序的运行时库不知道您将单引号表示为空白引用字符,因为这不是约定。该约定仅处理双引号(以及双引号前的反斜杠)。
此约定内置于运行时库中,该运行时库随最初用于创建程序的编译器一起提供。如果您想更改约定,则必须将要以这种方式运行的每个单独程序与您自己制作的也可以识别单引号的特殊运行时库重新链接。显然这是不切实际的(除非这些都是 Cygwin 程序)。
更实用的方法是做您已经在做的事情:认识到 Windows 不是 Unix,并在使用示例之前相应地调整它们。
我确信你无法编辑 DOS 解析命令的方式。它是其基本编程所固有的。
我能想到的加快速度的唯一解决方案是保持记事本窗口打开并运行“查找和替换”——用双引号替换所有单引号。然后从那里复制粘贴到 DOS 中。
归档时间: |
|
查看次数: |
18519 次 |
最近记录: |