2012-08-16 20 views
7

Estoy tratando de hacer eco de la siguiente línea en .profile pero se sigue confundiendo por las muchas comillas o caracteres especiales.¿Cómo hacer eco de la línea con múltiples comillas/caracteres especiales en el archivo?

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

He intentado todo tipo de cosas, pero no puede conseguirlo clavado.

Esto es lo que tengo actualmente:

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

Esto es lo que devuelve:

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

Sin embargo, si sólo tiene que utilizar:

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

Funciona bien.

tengo toda clase de "sudo su -c "eco bla ..." en el resto de mi guión que funciona muy bien.

¿Alguna idea?

+0

'\ '\" \\ e [A \ "' Hay un extra \ antes de la e. – steveg89

+0

Necesita dos barras diagonales inversas para que se agregue un literal \ a/etc/profile. – chepner

Respuesta

5

Prueba este

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

Desde la página de manual de bash:.

una comilla simple puede no ocurrir entre comillas simples, incluso cuando precedido por una barra invertida

El texto citado por $'...' puede contener comillas salientes de barra invertida, tanto simples como dobles.

Otra opción es añadir una expresión más simple de ~/.inputrc:

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

No parece ser un equivalente de todo el sistema de .inputrc que es leído por todos los usuarios. Además, esto hace que la vinculación de clave esté disponible para cualquier programa que use readline. Si realmente desea restringir a Bash, añadir una expresión condicional:

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

Cada personaje es interpretado literalmente entre comillas simples, excepto ' sí. De modo que puede poner una comilla simple dentro de una cadena literal como esta: 'single'\''quoted' es la cadena single'quoted.

Su comando es complicado porque hay dos shells involucrados: el shell desde el que ejecuta este comando y el shell que ejecuta su. Tenga en cuenta que es extraño ejecutar sudo su ya que sudo ya ejecuta el comando especificado como root; sudo sh -c … tiene más sentido. Entonces necesitas citar los dos. Por lo general, es más claro usar comillas simples para la capa exterior, y comillas dobles o comillas simples o barras invertidas para la capa interior.

Hay otro problema con su comando: está apuntando al archivo incorrecto./etc/profile solo se lee mediante shells de inicio de sesión, mientras que el comando bind es específico de bash, pero debe leerlo todas las instancias de bash, no solo las shell de inicio de sesión. En lugar de escribir esta línea en /etc/profile, debe escribirla en el sistema bashrc, si hay una (generalmente es /etc/bash.bashrc).

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

Usted puede poner este valor directamente en el fichero de configuración readline, /etc/inputrc. Ahorrará en un nivel de cotización.

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

Una forma más fácil que pasar una cadena arbitraria a un comando sería pasarlo como entrada en lugar de como un argumento y utilizar un here document.

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