我在使用 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
.直到之前的文本EOT
被cat
作为其标准输入,然后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
部分正如您所期望的那样。