【发布时间】:2012-08-11 19:06:43
【问题描述】:
此功能有效:
source foo.bash && foo -n "a b c.txt"
问题是,无论我尝试了什么,我都无法让最后一行 echo "$CMD"(或 echo $CMD)准确地生成此输出:
cat -n "a b c.txt"
如何实现?
# foo.bash
function foo() {
local argv=("$@");
local OUT=`cat "${argv[@]}"`
local CMD=`echo cat "${argv[@]}"`
echo "--------------------------"
echo "$OUT"
echo "--------------------------"
echo "$CMD"
}
输出是:
cat -n a b c.txt
使用此命令:foo -n \"a b c.txt\" 它确实可以显示命令,但通过反引号执行时会出错。
文件"a b c.txt" 是一个有效的小文本文件。
【问题讨论】:
-
我提供了一个答案,但我希望你不打算用那个输出调用 eval。
-
我不确定这是否可能,当您说
foo -n "a b c.txt"bash 将参数视为-n和a b c.txt删除引号并保留空格时。对于foo -n \"a b c.txt\",参数为-n、"a、b和c.txt"。我不确定你是否可以做你想做的事情,即让 bash 保留引号,而默认行为恰好是剥离。也许IFS魔法......或者别的什么。没有什么我能马上想到的 -
@another.anon.coward 是的,但它确实适用于
local OUT=`cat "${argv[@]}"`,如果不可能,它也不应该适用于那个。对吗? -
对不起,我不太明白。
OUT将包含cat -n a b c.txt的输出,其中a b c.txt是有效文件,否则它将不包含任何内容,因为丢失的文件将显示在stderr上,而不会保存在OUT中。 -
只是为了澄清文件名包含
"s?