当我跑的时候
git log --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'
在Linux终端中,输出正确:
added lines: 23322, removed lines: 8536, total lines: 14786
因为我不想记住这么复杂的命令,所以我写了一个Python脚本来做同样的事情:
import os
GitCommand = 'git log --pretty=tformat: --numstat | awk "{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }"'
report = os.system(GitCommand)
但是当我运行它时,Git报告语法错误:
awk: cmd. line:1: { add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s
awk: cmd. line:1: ^ unterminated string
awk: cmd. line:1: { add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s
awk: cmd. line:1: ^ syntax error
我也试过使用subprocess,输出也差不多,问题可能出在命令字符串的编码上,特别是引号,但我不知道如何修复。
3条答案
按热度按时间mec1mxoz1#
Python脚本
我已经做了一个Python脚本,可以完成你想要的。我通过你的脚本制作了这个脚本,并做了两个修改:
awk
唯一参数周围的双引号改为转义单引号\'
。\n
更改为“\n”的转义版本,即\\n
。下面是显示修改后的脚本工作的输出示例:
下面显示了Python脚本的差异,从问题的版本到这个答案的工作版本:
Shell脚本
正如在这个问题的其他地方提到的,拥有一个shell脚本文件可能是简单地重复调用任何给定的shell命令的最合适的方法,无论出于什么原因,这些命令不希望存储在
~/.bashrc
、~/.bash_profile
或类似的东西中。具体针对这个问题,举个例子:
我的环境
ukxgm1gy2#
在这里使用Python增加了不必要的复杂性。这里最简单的解决方案是创建一个文件
my_fancy_git_command.sh
并将bash代码复制到其中。现在您可以通过使用脚本的名称来运行整个命令。如果你想从多个目录运行这个脚本,我建议在你的用户文件夹中创建一个
bin
目录。然后将$HOME/bin
添加到.bashrc
中的PATH
。一定要关闭你的终端并打开一个新的终端,以查看当前环境中对PATH
的更改。vyswwuz23#
用Python
subprocess
做同样的事情,它的目的是replaceos.system
。根据Python文档使用
shell=True
的第一种方法可能存在shell注入漏洞。第二种方法是
shell=False
文档建议尽可能使用
subprocess.run
,因此另一种选择是:shell=False
是默认的,所以可以被删除。现在我可以通过按下一个按钮并输出结果来从Django
web框架运行git
命令。