bash - 如何在 GitHub 工作流中的 YAML 文件中设置包含空格的路径?
问题描述
我有一个存储库,其中一个文件夹中有一个 LaTex 文件。文件夹被命名Literature Review
,文件被命名为Review.tex
. 我是 docker 和 GitHub Actions 的新手。我尝试了很多不同的组合来设置文件路径:
Literature Review/Review.tex
我已经尝试了很多在 StackOverflow 上建议的方法,但似乎我太天真而无法正确理解实现 xD
我在某处读到,为了避免转义序列,我们可以\
在空格前使用 a 。然而,这并没有太大的区别。
工作流在构建时返回以下错误:
Run echo ${MANUSCRIPT_PATH}.tex
echo ${MANUSCRIPT_PATH}.tex
${LATEX} ${MANUSCRIPT_PATH}.tex
${BIBTEX} ${MANUSCRIPT_PATH}.aux
${LATEX} ${MANUSCRIPT_PATH}.tex
${LATEX} ${MANUSCRIPT_PATH}.tex
shell: /bin/bash -e {0}
env:
MANUSCRIPT_PATH: Literature\ Review/Review
LATEX: pdflatex -shell-escape
BIBTEX: bibtex
Literature\ Review/Review.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=pdflatex)
\write18 enabled.
entering extended mode
! I can't find file `Literature'.
<to be read again>
\
<*> Literature\
Review/Review.tex
(Press Enter to retry, or Control-D to exit)
Please type another input file name:
! Emergency stop.
<to be read again>
\
<*> Literature\
Review/Review.tex
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on texput.log.
Error: Process completed with exit code 1.
我的yml
文件如下所示:
name: paper-maker
on: push
jobs:
build:
runs-on: ubuntu-latest
env:
# This needs fixing
MANUSCRIPT_PATH: 'Literature\ Review/Review' # exclude the '.tex' / '.pdf' extension!
LATEX: pdflatex -shell-escape
BIBTEX: bibtex
steps:
- uses: actions/checkout@v1
- name: Install texlive
run: |
sudo apt-get install texlive-publishers \
texlive-latex-recommended \
texlive-latex-extra \
texlive-fonts-recommended \
texlive-fonts-extra
- name: Build paper
run: |
echo ${MANUSCRIPT_PATH}.tex
${LATEX} ${MANUSCRIPT_PATH}.tex
${BIBTEX} ${MANUSCRIPT_PATH}.aux
${LATEX} ${MANUSCRIPT_PATH}.tex
${LATEX} ${MANUSCRIPT_PATH}.tex
- name: Push paper
run: |
git checkout --orphan ${GITHUB_REF##*/}-pdf
git rm -rf .github/
git rm -rf .
git add -f ${MANUSCRIPT_PATH##*/}.pdf
git -c user.name='paper-maker' -c user.email='paper-maker' commit -m "update pdf"
git push -q -f https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} ${GITHUB_REF##*/}-pdf
解决方案
不要尝试单独转义空格字符,只需将生成的路径放在双引号中:
MANUSCRIPT_PATH: Literature Review/Review
${LATEX} "${MANUSCRIPT_PATH}.tex"
${BIBTEX} "${MANUSCRIPT_PATH}.aux"
${LATEX} "${MANUSCRIPT_PATH}.tex"
${LATEX} "${MANUSCRIPT_PATH}.tex"
似乎在变量替换之前处理了反斜杠转义,这就是您的方法不起作用的原因。
无论如何,将最终路径放在双引号中是长期确立的最佳实践。
编辑:详细说明一下,这与 Docker 或 YAML 无关。只需在 bash 中尝试这段代码:
mkdir -p a\ b && echo "foo" > a\ b/c.txt
P='a\ b/c' cat $P.txt
你会得到
cat: a\: No such file or directory
cat: b/c.txt: No such file or directory
如您所见,反斜杠不会在变量替换中转义以下空格。相反,shell 的行为就像您提供了两个参数'a\'
和'b/c.txt'
.
推荐阅读
- spring - 将 select 子句中使用的别名表达式用于条件查询的 order by 子句
- database - 在线托管的网站是否可以访问本地服务器上的数据库?
- api - 来自 axios.post 的未定义响应
- mysql - Mysql - 添加当前时间戳字段而不影响现有记录
- python - 使用自定义标签解析文件
- angular - 错误:请将您的依赖项升级到 core-js@3 的实际版本
- typescript - 如何在打字稿中定义和使用静态变量
- excel - 使用 Excel VBA 重命名多个文件
- android - 找不到提供程序错误的元数据
- c++ - 是否可以在源文件中更改 constexpr-ops-limit ?