如何将带有多个引号/特殊字符的行回显到文件中?

时间:2012-08-16 20:14:27

标签: linux bash shell echo

我试图将以下行回应到.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 ..."在我的其余脚本中工作得很好。

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

试试这个

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

来自bash手册页:

  

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

$'...'引用的文字可能包含反斜杠转义引号,包括单引号和双引号。

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

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

所有用户似乎都没有系统范围内的.inputrc等效内容。此外,这使得密钥绑定可用于任何使用readline的程序。如果您确实想将其限制为bash,请添加条件表达式:

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

答案 1 :(得分:0)

除了'本身之外,每个字符都在单引号之间进行解释。因此,您可以在文字字符串中放置单引号,如下所示:'single'\''quoted'是字符串single'quoted

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

您的命令还有另一个问题:您的目标是错误的文件。 /etc/profile仅由登录shell读取,而bind命令特定于bash但应由所有bash实例读取,而不仅仅是登录shell。不应将此行写入/etc/profile,而应将其写入系统范围bashrc,如果有的话(通常是/etc/bash.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 document

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