在文件中写入命令

在文件中写入命令

我在使用 bash 脚本在文件中编写命令时遇到困难(不是命令的输出+我不希望执行命令),我希望文件只包含run $(python -c "print('A'*256)")在其中。

我尝试将其添加到变量中,然后通过 echo 将其传递到文件,但这不起作用。

我也尝试过类似的东西echo "run $(python -c "print('A'*256)")" > file.txt

也不起作用,我实际上遇到了一些错误,所以我认为问题是因为多个双引号,所以我将它们更改为单引号。这在文件运行中给了我这个输出

所以基本上就完全忽略了$(python -c "print('A'*256)")

知道如何解决这个问题吗?

答案1

将任意字符串重定向到最可靠的方法是使用此处的文档

cat > file.txt <<'EOT'
run $(python -c "print('A'*256)")
EOT

这会将单行完全按原样放入file.txt.直到之前的文本EOTcat作为其标准输入,然后cat再次将其吐出以进行重定向。 shell 将继续读取文档,直到EOT出现在行的开头,因此如果需要,您可以一次放入多行(如果EOT在字符串中出现这样的情况,请使用其他内容 - 分隔符是任意的)。

由于分隔符在顶部被引用,因此不会对此处文档1的正文执行任何扩展,并且所有字符都会原封不动地通过。Here-documents 的行为由 POSIX 指定并且可以在任何 shell 中工作。

1某些旧版本的 Bash 中存在一个错误,在某些情况下确实执行了一些扩展,但你不会在这里碰到它。

答案2

尝试使用转义字符代替:

echo run \$\(python -c \"print\(\'A\'*256\)\"\) > file.txt

答案3

一个字符串与*两种引用总是很难处理。有三种方法:

  • 在两种引用之间交替。将双引号 ( ") 放在单引号 ( ') 内,反之亦然。

    首先将字符串分成三段:

    run $(python -c "print ('A'*256) ")
    ↑---------1----------↑ ↑---2---↑ ↑3↑
    

    其中第一部分和第三部分不包含单引号,第二部分不包含双引号。然后适当地引用它们:

    echo 'run $(python -c "print'"('A'*256)"'")'
         ↑----------1-----------↑↑----2----↑↑-3↑
    

    只是将子字符串一起运行。

  • 用双引号引用字符串,然后将其\"用于您想要回显的每个文字双引号。也替换$\$

    echo "run \$(python -c \"print('A'*256)\")"
    
  • 仅在 bash 中有效的方法是用 引用字符串$'…'。在这样的字符串中,您可以使用以下命令转义单引号\'

    echo $'run $(python -c "print(\'A\'*256)")'
    

当然,这> file.txt部分正如您所期望的那样。

相关内容