Bash:在没有Word拆分的情况下将命令替换传递给外部程序(或函数)

时间:2013-11-06 12:01:18

标签: bash whitespace

在下面的代码中,我希望pyfg()的输出完全按照回显(-htnscrl之间的空格从字面上解释,而不是aoeu()}到aoeu()的空白。当然,问题在于aoeu()$1-htns$2crl$3,我不是在这种情况下,我想要的是qjkx。我知道这个例子是完全无用的,但是我正在尝试应用的实际应用程序调用外部程序代替下面的aoeu(),所以我确实需要某些东西就像是什么下方。

#!/bin/bash
# pass_space_function.sh

aoeu() {
echo "$1" "$2"
}

pyfg() {
echo "-htns crl" "qjkx"
} 

aoeu $(pyfg)

我运行上述输出:

$ ./pass_space_function.sh
-htns crl

我想要的输出是:

$ ./pass_space_function.sh
-htns crl qjkx

要明确的是,我确实理解为什么我的代码不能正常工作,但我不确定的是如何让它做我想要它做的事情。< / p>

编辑:

#!/bin/bash

aoeu() {
echo 1:"$1" 2:"$2" 3:"$3"
}

pyfg() {
# These variables might be user-provided.
wvz="/usr/lib/scarychacacters_\"@#$:%^&:*(){}[]; a o ;u ;::e i y f.so.4"
bm="/space space space"
snt="/var/cache/normalpath"

printf "%q %q %q" "$wvz" "$bm" "$snt" 
} 

aoeu $(pyfg)

该代码为我返回1:/usr/lib/scarychacacters_\"@#\$:%\^\&:\*\(\)\{\}\[\]\;\ 2:a\ 3:o\。它显然在$wvz的空白处分裂。

2 个答案:

答案 0 :(得分:2)

纠正引用的关键在于理解会发生什么。

例如,echo "-htns crl" "qjkx"只会将一个字节流打印到其标准输出,因此最后它只是-htns crl qjkx。 <{1}}比-htns crl更紧密地分组的信息将丢失。

为避免这种损失,您可以使用qjkx

printf "%q"

这将生成带引号的输出:pyfg() { printf "%q %q" "-htns crl" "qjkx" } ,这意味着shell与-htns\ crl qjkx相同(无论空格是用反斜杠转义还是引用双引号都没有区别)。

下一个方面是使用"-htns crl" "qjkx"将一个程序的输出传递给下一个程序。

典型的方法是将它放在双引号中:

$()

这样一切都在没有解释的情况下通过,这在大多数情况下都是可取的。

但是,在您的情况下,您可能希望引用aoeu "$(pyfg)" 的输出,而不是引用pyfg的输出;注意重要的区别:第一个意味着pyfg产生引用输出(如上所示),第二个意味着pyfg产生输出,后来引用。如果pyfg的输出已经丢失了哪些部分属于一起的信息,则第二个没有帮助。

如果你现在只是放弃双引号,不幸的是输出会在空格(即pyfg的第一个字符)处被分割,即使这个空格是用反斜杠转义的。因此,在这种情况下,您需要使用$IFS来强制shell使用正常的shell评估机制来解释eval的值:

$(pyfg)

答案 1 :(得分:1)

编辑:这有效

#!/bin/bash
# pass_space_function.sh

aoeu() {
echo $1 x $2
}

pyfg() {
echo "'-htns crl' 'qjkx'"
}


eval aoeu $(pyfg)