【问题标题】:How to set path that contains spaces in a YAML file in a GitHub workflow?如何在 GitHub 工作流中的 YAML 文件中设置包含空格的路径?
【发布时间】:2021-03-19 10:44:21
【问题描述】:

我有一个存储库,其中一个文件夹中有一个 LaTex 文件。文件夹名为Literature Review,文件名为Review.tex。我是 docker 和 GitHub Actions 的新手。我尝试了很多不同的组合来设置文件路径:

Literature Review/Review.tex

我尝试了很多 StackOverflow 上建议的方法,但似乎我太天真了,无法正确理解实现 xD

我在某处读到,为了避免转义序列,我们可以在空格前使用\。然而,这并没有太大的区别。

工作流在构建时返回以下错误:

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

【问题讨论】:

    标签: bash docker yaml latex github-actions


    【解决方案1】:

    不要尝试单独转义空格字符,只需将生成的路径放在双引号中即可:

    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'

    【讨论】:

      【解决方案2】:

      在单引号内使用双引号,如下所示:'"Literature Review/Review"'。解析 YAML 会删除单引号,您的环境变量的值将是 "Literature Review/Review"。这反过来将使 pdflatex 接收 Literature Review/Review 作为单个参数。

      jobs:
        build:
          runs-on: ubuntu-latest
          env:
            # fixed
            MANUSCRIPT_PATH_TEX: '"Literature Review/Review.tex"'
      [...]
          - name: Build paper
            run: |
              echo ${MANUSCRIPT_PATH_TEX}
              ${LATEX} ${MANUSCRIPT_PATH_TEX}
              ${BIBTEX} ${MANUSCRIPT_PATH_TEX}
              ${LATEX} ${MANUSCRIPT_PATH_TEX}
              ${LATEX} ${MANUSCRIPT_PATH_TEX}
      

      【讨论】:

      • 显示如下错误:! Unbalanced quotes in argument "LiteratureError: Process completed with exit code 1.
      猜你喜欢
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多