我知道这个问题可能听起来很熟悉,可能与其他问题类似 how to escape quotes in command argument to sh -c? 和许多其他人。但是,标记为回答这些问题的方法对我来说都不起作用。所以,请耐心等待。
我正在尝试向另一个终端发送命令。我已经知道我需要使用sh -c
一次发送整个命令。命令本身是使用7z压缩文件。这是一个例子:
7z a Aa.zip Bb.txt
所以整个命令都是
sh -c '7z a Aa.zip Bb.txt'
这没有任何问题。问题是当要压缩的文件名中有单引号('
)时,例如B'b.txt
。所以,命令变为
sh -c '7z a Aa.zip B'b.txt'
不在终端中运行。
这些是我试过的没有运气的命令:
sh -c '7z a Aa.zip B'b.txt'
sh -c '7z a Aa.zip B\'b.txt'
sh -c '7z a Aa.zip B'"'"'b.txt'
sh -c '7z a Aa.zip "B'b.txt"'
sh -c '7z a Aa.zip \"B\'b.txt\"'
sh -c '7z a Aa.zip \"B'b.txt\"'
sh -c '7z a Aa.zip B'\''b.txt'
运行这些命令会导致此错误:
Syntax error: Unterminated quoted string
或等待输入
>
然后我使用Ctrl + c取消。
我也尝试使用变量,然后将其传递给sh -c
。再没有运气:
cmd="'7z a Aa.zip B'b.txt'"
echo $cmd
'7z a Aa.zip B'b.txt'
sh -c $cmd
a: 1: a: Syntax error: Unterminated quoted string
请让我知道我做错了什么?
答案 0 :(得分:1)
您正在寻找:
sh -c '7z a Aa.zip "B'\''b.txt"'
这:'\''
是一个转义'
作为字符串的一部分。您需要sh
命令本身。一旦你开始运行命令,让'
无法匹配会导致问题,所以你需要将它放在一个字符串中。
答案 1 :(得分:0)
我建议您阅读这篇shell command language文章。 对于您的情况,特别是
“反斜杠不能用于转义单引号字符串中的单引号。嵌入引号可以通过编写来创建,例如:”'a'\''b'“,它产生”a“ b“。单个标记可以由包含所有三种引用或转义的连接部分字符串组成,因此允许任何字符组合。”
希望它对你有用。
答案 2 :(得分:0)
sh -c "7z a Aa.zip B'b.txt"
或
sh -c '7z a Aa.zip B'"'"'b.txt'
或者,你知道,使用(bash或zsh)数组。
cmd=(7z a Aa.zip B'b.txt)
sh -c "${cmd[@]}"