我有一个命令输出一些我想传递给另一个命令的参数。但是,当我在子 shell 中运行命令时,输出会受到分词的影响,除非我引用整个内容,在这种情况下它是一个单词。
我希望 subshell 输出有单词拆分,但我希望单词拆分尊重引号,但事实并非如此。有没有办法(除了eval
)将子shell输出分成单词但尊重引号?
细节
给定args
定义为的命令
#!/bin/sh -
printf "%d args:" "$#"
printf " <%s>" "$@"
echo
我可以跑
$ args 'foo bar' 'one two'
2 args: <foo bar> <one two>
但我找不到办法让子shell 像这样传递 2 个参数。
$ echo "\"'foo bar'\" 'one two'"
"'foo bar'" 'one two'
$ args $(echo "\"'foo bar'\" 'one two'")
4 args: <"'foo> <bar'"> <'one> <two'>
$ args "$(echo "\"'foo bar'\" 'one two'")"
1 args: <"'foo bar'" 'one two'>
当然,我可以使用eval
$ eval args $(echo "'foo bar' 'one two'")
2 args: <foo bar> <one two>
但是eval
很危险,并且会引入各种其他可怕的可能性,导致事情出错。我不希望再次发生参数扩展或通配符等。我只想分词以尊重引号。真的没有办法做到这一点bash
吗?