如何将多行引用/特殊字符回显到文件中?

我正在尝试将下面一行回显到一个.profile文件中,但它不断被许多引号或特殊字符混淆。

bind '"e[A": history-search-backward'

我已经尝试了各种各样的东西,但不能钉上。

这是我现在有:

sudo su -c 'echo "bind \'\"\\e[A\": history-search-backward\'" >> /etc/profile' -

这是它返回的内容:

su: user '"\e[A": does not exist

但是,如果我只是使用:

echo bind \'\"\\e[A\": history-search-backward\'" >> /home/user/testfile

它工作得很好。

在我的脚本的其余部分工作得很好,我有各种各样的“sudo su -c”echo blah …。

有任何想法吗?

尝试这个

 sudo su -c $'echo \"bind \'\"\\e[A\": history-search-backward\'\" >> /etc/profile\' -' 

从bash手册页:

单引号之间可能不会出现单引号,即使前面带有反斜杠。

$'...'引用的文本可能包含反斜线转义的引号,无论是单引号还是双引号。

另一个选择是添加一个更简单的表达式~/.inputrc

 echo '"\e[A": history-search-backward' >> ~/.inputrc 

似乎没有一个由所有用户读取的.inputrc的全系统等价物。 此外,这使得键盘绑定可用于任何使用readline的程序。 如果你真的想限制它,添加一个条件表达式:

 cat >> ~/.inputrc <<'EOF' $if Bash "\e[A": history-search-backward $endif EOF 

除了'本身”之外,每个字符都在单引号之间进行字面解释。 所以你可以把一个单引号放在一个字符串中,像这样: 'single'\''quoted'是字符串single'quoted 'single'\''quoted'

你的命令很复杂,因为有两个shell:你运行这个命令的shell和su运行的shell。 请注意,由于sudo已经以root身份运行指定的命令,所以运行sudo su是很奇怪的。 sudo sh -c …更有意义。 所以你需要为两者报价。 对于外壳使用单引号通常是最清晰的,内壳使用双引号或单引号或反斜线。

你的命令有另一个问题:你的目标是错误的文件。 /etc/profile只能被登录shell读取,而bind命令是特定于bash的,但是应该被bash的所有实例读取,而不仅仅是登录shell。 如果有这样一行(通常是/etc/bash.bashrc ),则不应将此行写入/etc/profile ,而应将其写入系统范围的bashrc

 sudo sh -c 'echo "bind '\''\"\\e[A\": history-search-backward'\''" >>/etc/bash.bashrc' 

您可以将此设置直接放入readline配置文件/etc/inputrc 。 你将节省一段引用的水平。

 sudo sh -c 'echo '\''"\e[A": history-search-backward'\'' >>/etc/inputrc' 

将任意字符串传递给命令的更简单的方法是将其作为输入而不是作为参数传递,并使用here文档 。

 sudo sh -c 'cat >>/etc/inputrc' <<'EOF' "\e[A": history-search-backward EOF