Passing flags to command via variables in bash

后端 未结 2 1151
南笙
南笙 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 01:56

    Short answer: see BashFAQ #050: I'm trying to put a command in a variable, but the complex cases always fail!

    Long answer: putting quotes in a variable doesn't do anything useful, because bash parses quotes before it replaces variable with their values; this means that by the time it's replaced $run with run.exe -withoption "This text" it's already done quote parsing, and isn't going to go back and notice those double-quotes, which means they don't do what you expect.

    BTW, using echo to check what's happening is extremely misleading, because echo shows you what its arguments looked like after they're parsed, but you're reading it as though it was showing them before parsing. Instead, use @Eduardo's suggestion of -x to see what's really going. (BTW, you can also use set -x to turn that on for the interesting part of the script, then set +x to turn it off.)

    So how do you solve it? Generally the best way is to put your command in an array rather than a simple variable, and then use the idiom "${arrayname[@]}" to pass each array element as a separate argument:

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

提交回复
热议问题