【发布时间】:2018-11-05 21:59:13
【问题描述】:
我想这里的答案可能很简单,但我可能需要一些复杂的 bash 知识。我已经浏览 bash 文档几个小时了,但似乎找不到答案。
我正在开发一个 python 存储库,并想出了一个简单的脚本来仅对当前分支和主分支之间不同的文件进行 lint。这是从所述脚本 (lint.sh) 中提取的最小工作示例:
#!/bin/bash
paths=$(git diff --name-only -r origin/master...HEAD | grep \.py$)
flake8 $paths
出于测试目的,假设我只提交了一个文件bad.py,其内容如下:
hello
there
bash lint.sh 的预期输出为:
bad.py:1:1: F821 undefined name 'hello'
bad.py:2:1: F821 undefined name 'there'
但是,输出为空。在调试模式下运行时,bash 显示以下命令:
++ git diff --name-only -r origin/master...HEAD
++ grep '.py$'
+ paths='bad.py'
+ flake8 'bad.py'
这是我所期望的。另外,当我简单地运行flake8 bad.py 时,输出与预期的一样。
我希望这可能与不同 bash 版本之间的参数传递有关。 bash --version 的输出:
GNU bash, version 4.4.23(1)-release (x86_64-apple-darwin17.5.0)
我会感谢所有的见解
【问题讨论】:
-
你能从命令行和脚本中显示
type -a flake8的结果吗? -
也可以在脚本中尝试
flake8 'bad.py'。 -
type的输出在两种情况下都是相同的:flake8 is /Users/path/to/project/venv/bin/flake8 flake8 is /Users/filip/miniconda3/bin/flake8。从脚本运行flake 'bad.py'可以正常工作 -
出于调试目的,您能否显示以下内容:
set -x; python -c 'import sys; print(sys.argv[1:])' $paths(在脚本末尾) -
err sorry, 更有用:
set -x; python -c 'import sys; print(sys.argv[1:])' "$paths"