Passing flags to command via variables in bash

后端 未结 2 1167
南笙
南笙 2021-01-14 01:20

I have a complex script that takes variables from files and uses them to run programs (Wine specifically)

Passing options from the variables in the other file isn\'t

2条回答
  •  独厮守ぢ
    2021-01-14 02:20

    The problem is that "This and text" are treated as separate arguments, each containing a double-quote, rather than as a single argument This text. You can see this if you write a function to print out one argument per line; this:

    function echo_on_separate_lines ()
    {
      local arg
      for arg in "$@" ; do
        echo "<< $arg >>"
      done
    }
    run="run.exe -withoption \"This text\""
    echo_on_separate_lines $run
    

    prints this:

    << run.exe >>
    << -withoption >>
    << "This >>
    << text" >>
    

    rather than this:

    << run.exe >>
    << -withoption >>
    << This text >>
    

    The simplest solution is to tack on an eval to re-process the quoting:

    run="run.exe -withoption \"This text\""
    wine $run     # or better yet:   wine "$run"
    

    But a more robust solution is to have run be an array, and then you can refer to it as "${run[@]}":

    run=(run.exe -withoption "This text")
    wine "${run[@]}"
    

    so that the quoting is handled properly from the get-go.

提交回复
热议问题