我正在嘗試撰寫一個 git 鉤子,它允許我在提交后收集單元測驗報告。
我在 Windows 機器上,但使用 bash 作為鉤子本身。它似乎運行良好。這是我到目前為止所擁有的:
#!/bin/sh
test_summary=$(pytest -v | grep -E ". \.py::. [A-Z] ")
commit_id=$(git rev-parse HEAD)
問題是該變數test_summary只保留grep匹配的最后一行。我知道我的管道pytest/grep很好,因為在互動式 msys 終端上運行它可以提供所有匹配項的正確輸出:
$ pytest -v | grep -E ". .py::. [A-Z] "
test_main.py::test_main PASSED [ 33%]
test_main.py::test2 FAILED [ 66%]
test_main.py::test3 PASSED [100%]
test_summary 包含以下內容:
$ echo $test_summary
test_main.py::test3 PASSED [100%]3%]
為什么它只保留最后一行加上第一行中的一些笨拙的巨著?
我不明白……
uj5u.com熱心網友回復:
tl;博士
OP 在 Windows 環境中運行這些命令,因此(在這種情況下)變數正在加載\r\n行尾。
解決這個問題的一個想法是使用引數替換:
$ test_summary=$(pytest -v | grep -E ". \.py::. [A-Z] ")
$ test_summary="$(test_summary//$'\r'/}" # strip out '\r' characters
$ echo $test_summary
test_main.py::test_main PASSED [ 33%]
test_main.py::test2 FAILED [ 66%]
test_main.py::test3 PASSED [100%]
繼續了解詳情...
我們可以通過以下方式模擬這種行為:
$ cat pytest.out
test_main.py::test_main PASSED [ 33%]
test_main.py::test2 FAILED [ 66%]
test_main.py::test3 PASSED [100%]
# convert to windows/dos line endings:
$ unix2dos pytest.out
# load variable:
$ test_summary=$(cat pytest.out)
# verify '\r\n' lines endings loaded into variable:
$ od -c <<< "$test_summary"
... snip ... 3 3 % ] \r \n t e s t ... snip ...
# eumlate OP's echo/output:
$ echo $test_summary
test_main.py::test3 PASSED [100%]3%] <== '\r' causes lines to overwrite the same one line
用$test_summary雙引號括起來有幫助:
$ echo "$test_summary"
test_main.py::test_main PASSED [ 33%]
test_main.py::test2 FAILED [ 66%]
test_main.py::test3 PASSED [100%]
或者,我們可以\r從變數中去除行尾,例如:
$ test_summary="$(test_summary//$'\r'/}"
$ od -c <<< "$test_summary"
... snip ... 3 3 % ] \n t e s t ... snip ...
$ echo $test_summary
test_main.py::test_main PASSED [ 33%] test_main.py::test2 FAILED [ 66%] test_main.py::test3 PASSED [100%]
# still need to wrap in double quotes to properly display all spaces and line endings:
$ echo "$test_summary"
test_main.py::test_main PASSED [ 33%]
test_main.py::test2 FAILED [ 66%]
test_main.py::test3 PASSED [100%]
\r在將輸出保存在變數中之前去除字符的一些其他想法:
$ test_summary=$(pytest -v | grep -E ". \.py::. [A-Z] " | tr -d '\r')
$ test_summary=$(pytest -v | grep -E ". \.py::. [A-Z] " | sed 's/\r//g')
uj5u.com熱心網友回復:
我無法訪問您的開發環境,因此我應該嘗試猜測解決方案。
該$(pytest -v | grep -E ". \.py::. [A-Z] ")代碼回傳一個由行分隔符分隔的行串列,因此我想您應該將其括在雙引號中以捕獲所有行:
test_summary="$(pytest -v | grep -E ". \.py::. [A-Z] ")"
請告訴我它是否適合你。
uj5u.com熱心網友回復:
用 mapfile 試試看:
...
mapfile -t test_summary <(pytest -v | grep -E ". \.py::. [A-Z] ")
...
或者
mapfile -t test_summary <<< $(pytest -v | grep -E ". \.py::. [A-Z] ")
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/335563.html
上一篇:TensorflowfitValueError:Shapemismatch:theshapeoflabels(received(16640,))應該等于logits的形狀,除了最后一個維度
下一篇:Python和GetVolumeInformationW和GetDriveTypeW:列出所有磁盤并獲取磁盤資訊和檔案系統標志
