Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 执行`";后获取已执行的命令,带引号的params${argv[@]}`_Linux_Bash_Shell - Fatal编程技术网

Linux 执行`";后获取已执行的命令,带引号的params${argv[@]}`

Linux 执行`";后获取已执行的命令,带引号的params${argv[@]}`,linux,bash,shell,Linux,Bash,Shell,此功能的工作原理是: 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 "$

此功能的工作原理是:

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 \“abc.txt\”
它确实可以用于显示命令,但它通过反勾号给出了执行错误


文件
“a b c.txt”
是一个有效的小文本文件。

您需要在作业中转义引号:

local CMD="cat \"${argv[@]}\""

另外,连接字符串不需要echo。

好了,在我的帮助下,我找到了正确的解决方案

我几乎忘记了为什么我们需要引用一个论点,因为它有多个词

function foo() {
    local argv=( "$@" );
    local OUT=`cat "${argv[@]}"`
    echo "--------------------------"
    echo "$OUT"
    echo "--------------------------"
    local CMD="cat"
    for word in "${argv[@]}"; do
        words="${word//[^\ ]} "
        if [[ ${#words} > 1 ]]; then
            local CMD="$CMD \"${word}\""
        else
            local CMD="$CMD $word"
        fi
    done
    echo "$CMD"
}

希望它能帮助到别人。

我提供了一个答案,但我希望你不打算用这个输出调用eval。我不确定这是否可行,当你说
foo-n“abc.txt”
bash将参数视为
-n
abc.txt
删除引号并保留空格。在
foo-n \“abc.txt\”
的情况下,参数是
-n
“a
b
&
c.txt”
。我不确定你是否能做你想做的事情,即让bash保留引号,而默认行为恰好是剥离。也许
IFS
magic。。。或者别的什么。我想不出什么对吗away@another.anon.coward是的,但它确实适用于
localout=`cat“${argv[@]}”`
,如果不可能,它也不应该适用于那个。对吗?对不起,我不太明白
OUT
将包含
cat-nbc.txt
的输出,其中
abc.txt
是一个有效文件,否则它不会包含任何内容,因为缺少的文件将显示在
stderr
上,该文件将不会保存在
OUT
中。只是为了澄清文件名包含
s”,这将给出
cat'-nbc.txt“
,这也不是我所期望的。请注意,提供的代码只是一个PoC,可能有任何标志(命令实际上是
git
)。我希望与键入的内容完全相同:
cat-n“abc.txt”
@Flavius-引号实际上从未传递给被调用的函数。