我正在尝试向另一个终端发送命令。我了解到我需要使用
sh -c
一次发送整个命令。该命令本身是使用 7-Zip(命令行可执行文件 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
我做错了什么?
我知道这个问题可能听起来很熟悉,并且可能与其他问题类似,例如 如何将命令参数中的引号转义为 sh -c? 以及许多其他人。但标记为这些问题的答案的方法都不适合我。所以,请多多包涵。
您正在寻找:
sh -c '7z a Aa.zip "B'\''b.txt"'
This:
'\''
是转义的 '
作为字符串的一部分。您需要为 sh
命令本身提供该信息。一旦开始运行命令,不匹配的 '
会导致问题,因此您需要将其放在字符串中。
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[@]}"
我建议阅读这篇 [shell 命令语言][1] 文章。 [1]:http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html 对于您的情况,具体
“反斜杠不能用于转义单引号字符串中的单引号。可以通过编写来创建嵌入引号,例如:
'a'\''b'
,它会产生 a'b
。单个标记可以由以下组成包含所有三种引用或转义的连接部分字符串,因此允许任意字符组合。”
希望它对你有用。