WHen I write a bash program I typically construct calls like follows:
declare -a mycmd=( command.ext "arg1 with space" arg2 thing etc )
"${mycmd[@]}" || echo "Failed: foo"
Where die foo
is a bash function that prints Error foo
and exits.
But if I want to be clear about the error reason, I want to print the failed command:
"${mycmd[@]}" || echo "Failed: foo: ${mycmd[*]}"
So the user can run the dead command and find out why. However, quoting is lost on this pass - the Failed message arguments that have spaces or escaped characters are not printed in a way that can be cut-n-pasted and run.
Does anyone have a suggestion for a compact way to fix this problem?
I think the problem is the way bash deals with argument parsing for commands, and the way (builtin) echo handles arguments. Another way of stating the problem is:
How can I print the quotes around arguments with spaces in the following bash example (which must be run as a script, not in immediate mode):
#!/bin/bash
mkdir qatest; cd qatest
declare -a myargs=(1 2 "3 4")
touch "${myargs[@]}"
ls
echo "${myargs[@]}"
actual result:
1 2 3 4
1 2 3 4
desired result
1 2 3 4
1 2 "3 4"
OR
1 2 3 4
"1" "2" "3 4"
In few additional bash code characters.