作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在Windows上的git bash中使用以下git命令:
git log --format="%C(cyan)%cd%Creset %s" --date=short -5
%cd
),然后显示提交消息(
%s
)。提交日期用颜色标记包裹:
%C(cyan)
开始彩色输出,
%Creset
停止彩色输出。
cmd
结合使用效果并不理想:
%cd%
由Windows Shell扩展到当前工作目录(相当于bash中的
$PWD
)。
cmd
运行该命令时,我看到在第一列中显示了当前工作目录,而不是提交日期!
2015-10-08 commit msg
2015-10-08 commit msg
2015-10-07 commit msg
2015-10-06 commit msg
2015-10-06 commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
cmd
,而是在编写其中包含以下内容的nodejs(0.12)脚本时发现了此行为
require('child_process').execSync('git log --format=...', {stdio: 'inherit'})
cmd
执行)。
%cd%
被发现,即更改
git log --format="%C(cyan)%cd%Creset %s" --date=short -5
git log --format="%C(cyan)%cd %Creset%s" --date=short -5
%s
之前删除了另一个空间,但它仍然是一个hack,需要手动干预)。
%%
或
^%
逃脱
%
的信息,但它们不是此处的解决方案:
# produces superfluous ^ characters
git log --format="%C(cyan)^%cd^%Creset %s" --date=short -5
^2015-10-08^ commit msg
^2015-10-08^ commit msg
^2015-10-07^ commit msg
^2015-10-06^ commit msg
^2015-10-06^ commit msg
# seems the expansion is done at command parse time
git log --format="%C(cyan)%%cd%%Creset %s" --date=short -5
%D:\git\someFolder commit msg
%D:\git\someFolder commit msg
%D:\git\someFolder commit msg
%D:\git\someFolder commit msg
%D:\git\someFolder commit msg
最佳答案
提供MC ND's helpful answer的替代方法:
如果您确实需要让 shell 涉及(这不太可能,因为您声明您希望该命令同时与Windows的cmd.exe
和Bash一起使用),请立即考虑下面的解决方案;请参见下面的解决方案。有关绕过问题的无 shell 替代产品的信息,请参阅底部的解决方案。
MC ND的提示,是通过建议在%
实例周围放置双引号而不是%
实例之间的潜在变量名称来改进我的原始方法,并建议对execFileSync
进行说明。
“转义” %
字符。用于cmd.exe
如MC ND's answer中所述,从技术上讲,您不能在Windows命令提示符处转义%
(在批处理文件中,您可以使用%%
,但这在从其他环境(例如Node.js)中调用Shell命令时不起作用,并且通常无法跨平台)。
但是,解决方法是在每个%
实例周围加上双引号:
// Input shell command.
var shellCmd = 'git log --format="%C(cyan)%cd%Creset %s" --date=short -5'
// Place a double-quote on either end of each '%'
// This yields (not pretty, but it works):
// git log --format=""%"C(cyan)"%"cd"%"Creset "%"s" --date=short -5
var escapedShellCmd = shellCmd.replace(/%/g, '"%"')
// Should work on both Windows and Unix-like platforms:
console.log(require('child_process').execSync(escapedShellCmd).toString())
cmd.exe
将诸如%cd%
之类的标记识别为变量引用("%"cd"%"
不会扩展)。git.exe
(大概是通过C运行时)然后负责从组合字符串中除去多余的双引号。 $
前缀的 token 执行可能不需要的扩展(此处不存在问题);但是,为了保持Windows兼容,您必须使用双引号。 %
实例中。类似于POSIX的shell仍将其识别为单个字符串-子字符串被双引号引起来,并直接邻接%
实例。 (如果将这种技术应用于未加引号的字符串,则逻辑相反:实际上是在双引号%
实例中进行拼接。)子字符串周围的双引号被认为是语法元素,而不是字符串的一部分。然后在子字符串连接在一起以形成单个文字并传递给目标程序时将其删除。execFile[Sync]
构建,仅适用于调用外部可执行文件(在OP的情况下是正确的:git.exe
)-相反,对于调用shell内置程序(内部命令)或Windows批处理文件, exec[Sync]
,并因此由cmd.exe
解释(在Windows上)。[1]execFileSync
而不是execSync
,那么 shell 程序(在Windows上为cmd.exe
)将不涉及,因此不必担心转义%
字符。就此而言,或任何其他shell元字符:require('child_process').execFileSync('git',
[ 'log',
'--format=%C(cyan)%cd%Creset %s',
'--date=short',
'-5' ], {stdio: 'inherit'})
execFile[Sync]
调用脚本文件(例如Python脚本),而是可以将解释器可执行文件(例如python
)作为要执行的文件,而将脚本文件作为参数。在类似Unix的平台上,您可以直接调用脚本,只要它们具有shebang line并被标记为可执行文件即可。execFile[Sync]
可以用来调用Windows批处理文件,但是cmd.exe
总是像exec[Sync]
一样对参数进行插值。
关于node.js - 有没有办法防止Windows命令行中的env变量扩展百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33016094/
我是一名优秀的程序员,十分优秀!