Skip to content

$ escape behavior change on a second call of the same command line tool within workflow #2217

Description

@sleyn

Summary

the issue was tested with cwltool 3.1.20240112164112 and 3.1.20251031082601 and CWLv1.0

The bug happens when in a CWLv1.0 workflow with several steps that call the same CommandLineTool. This tool runs a script described in InitialWorkDirRequirement. This script has variables with escaped \$. I've found by cwltool --debug that the first step using the tool makes a normal BASH script with $ variables, but the second step creates escaped \\$ variables.

Investigation

It seems that the reason is in the version control of the escaping handling in the update.py. The ORIGINAL_CWLVERSION is used in the first run of the tool, but the second run of the tool uses the INTERNAL_VERSION.

The toy example.

Workflow:

class: Workflow
cwlVersion: v1.0

requirements:
  StepInputExpressionRequirement: {}

inputs:
  file1:
    label: FASTQ files 1
    type: File

  file2:
    label: FASTQ file 2
    type: File

  file3:
    label: FASTQ file 3
    type: File

steps:
  cat_1:
    run: cat.cwl
    in:
      file1: file1
      file2: file2
      output_fn:
        valueFrom: "1.txt"
    out:
      - out_file

  cat_2:
    run: cat.cwl
    in:
      file1: cat_1/out_file
      file2: file3
      output_fn:
        valueFrom: "2.txt"
    out:
      - out_file

outputs:
  wf_out:
    type: File
    outputSource: cat_2/out_file

cat.cwl tool

cwlVersion: v1.0
class: CommandLineTool

label: Concatenate files
doc: Concatenate files using `cat`

requirements:
  DockerRequirement:
    dockerPull: ubuntu:20.04
  InitialWorkDirRequirement:
    listing:
      - entryname: wrapper.sh
        entry: |
          #!/usr/bin/env bash
          FILE1=\$1
          FILE2=\$2
          OUTFILE=\$3
          cat \$FILE1 \$FILE2 > $OUTFILE

baseCommand: ["bash", "wrapper.sh"]

inputs:
  file1:
    type: File
    label: Input file 1
    inputBinding:
      position: 1
  
  file2:
    type: File
    label: Input file 1
    inputBinding:
      position: 2

  output_fn:
    type: string
    label: Output filename
    inputBinding:
      position: 3

outputs:
  out_file:
    type: File
    outputBinding:
      glob: $(inputs.output_fn)

The output:

cat: '$FILE1': No such file or directory
cat: '$FILE2': No such file or directory

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions