Preserving escapes in bash arguments $@

2019-06-14 02:36发布

问题:

related to this: Preserve Quotes in bash arguments

A simple example, where I simply run a command with nohup...

#!/bin/bash
nohup "$@"

...

./myscript gedit some\ file\ with\ spaces.txt

This works fine. However, I have no idea how to keep the correct bits of the arguments escaped when using an intermediate variable...

#!/bin/bash
CMD="$@"
printf "%q\n" "$CMD" #for debugging
nohup $CMD

I've tried a few permutations and nothing works in all cases. What am I missing? Ideally I would like to be able to modify $CMD before nohup.

回答1:

You need to use an array.

cmd=( "$@" )
printf '%q\n' "${cmd[@]}"
nohup "${cmd[@]}"

Scalar variables (strings) are NUL-delimited, so they can't contain an argument list (which is, by its nature, NUL-separated).

See also the BashSheet entry on arrays, BashFAQ #5 (explaining how to use arrays), and BashFAQ #50 (explaining the pitfalls caused by not doing it this way).



标签: bash escaping