bash 打印多行变量,但也将其用作 python 的命令?

问题描述 投票:0回答:1

我想用 bash 创建一个人类可读的变量,但随后也能够将该变量作为 python 脚本运行。

run_cmd(){
        echo "[+] Creating stuff"
        run_command="$script 10.10.10.10 \\
        --config $settings \\
        --cid $cid \\
        -v"
    echo -e "$run_comamnd"
    $run_command
}

run_cmd

运行上面将打印出以下内容

[+] Creating stuff
pythonscript 10.10.10.10 \
        --config $settings \
        --cid $cid \
        -v"

usage: pythonscript [-v] --cid CID --config CONFIG host
pythonscript: error: unrecognized arguments \ \ \

如果我删除

\\
并且只有
\
如下所示,命令运行但输出删除所有新行字符。

run_cmd(){
        echo "[+] Creating stuff"
        run_command="$script 10.10.10.10 \
        --config $settings \
        --cid $cid \
        -v"
    echo -e "$run_comamnd"
    $run_command
}

run_cmd

输出

[+] Creating stuff
pythonscript 10.10.10.10         --config $settings         --cid $cid         -v"
[+] this output is from pythonscript, the script ran successfully. 

我知道如果我从变量中完全删除

\
,它将打印出新行并运行命令。但是我想要
\
所以有人可以复制输出的命令并直接从命令行运行,所以我需要
\
输出。

我的蛋糕怎么吃?就像用新行打印出命令并运行它一样,而不必为 echo 语句和 run 语句创建单独的变量?

python bash arguments echo newline
1个回答
0
投票

为此,您可以在 Bash 中使用“heredoc”语法。这允许您定义多行字符串而无需转义任何字符(包括换行符),然后将该字符串传递给命令。以下是修改 run_cmd 函数以使用 heredoc 的方法:

run_cmd(){
    echo "[+] Creating stuff"
    read -r -d '' run_command << EOF
$script 10.10.10.10 \
--config $settings \
--cid $cid \
-v
EOF
    echo -e "$run_command"
    eval "$run_command"
}

在此版本的函数中,我们使用 heredoc 语法定义 run_command 字符串。 << EOF indicates the start of the heredoc, and the EOF indicates the end. The -r option to read tells it not to interpret backslashes in the input, and the -d '' option tells it to read until the end of input (which is signaled by the EOF marker).

使用此版本的 run_cmd,echo 语句将打印带有换行符的多行字符串,eval 语句将其作为命令执行。请注意,我们使用 eval 而不是 $run_command 因为我们希望 shell 解释字符串中的参数,而 eval 是最简单的方法。

使用这种方法,您可以创建一个人类可读的多行字符串,然后以保留换行符的方式将其作为命令执行。

© www.soinside.com 2019 - 2024. All rights reserved.