variable - echo genera el parámetro-e en los scripts de bash. ¿Cómo puedo prevenir esto?
echo shell linux (4)
Debe usar #!/bin/bash
como la primera línea en su script. Si no lo hace, o si usa #!/bin/sh
, el shell Bourne ejecutará el script y su echo
no reconocerá la opción -e
. En general, se recomienda que todos los nuevos scripts utilicen printf
lugar de echo
si la portabilidad es importante.
En Ubuntu, sh
se proporciona mediante un enlace simbólico a /bin/dash
.
He leído las páginas man en echo, y me dice que el parámetro -e permitirá que un personaje escapado, como una n escapada para nueva línea, tenga un significado especial. Cuando escribo el comando
$ echo -e ''foo/nbar''
en una shell bash interactiva, obtengo el resultado esperado:
foo
bar
Pero cuando uso este mismo comando (he probado este carácter de comando para el carácter como un caso de prueba) obtengo el siguiente resultado:
-e foo
bar
Es como si echo interpretara el -e como un parámetro (porque la nueva línea todavía aparece) pero también interpreta el -e como una cadena para hacer eco. ¿Que está pasando aqui? ¿Cómo puedo evitar que aparezca?
Diferentes implementaciones de echo
comportan de maneras molestas diferentes. Algunos no toman opciones (es decir, simplemente harán eco de -e
como usted describe) e interpretarán automáticamente las secuencias de escape en sus parámetros. Algunos toman banderas, y no interpretan escapes a menos que se les dé la bandera -e
. Algunos toman banderas e interpretan diferentes secuencias de escape dependiendo de si se ha pasado la bandera -e
. Algunos te harán arrancarte el pelo si intentas que se comporten de una manera predecible ... oh, espera, eso es todo.
Lo que probablemente está viendo aquí es una diferencia entre la versión de echo
integrada en bash
vs /bin/echo
o tal vez contra alguna otra shell integrada. Esto me mordió cuando Mac OS X v10.5 se distribuyó con un echo
incorporado de bash que hacía eco de las banderas, a diferencia de lo que esperaban todos mis scripts ...
En cualquier caso, hay una solución: use printf
lugar. Siempre interpreta las secuencias de escape en su primer argumento (la cadena de formato). El problema es que no agrega automáticamente una nueva línea (por lo que debe recordar hacerlo explícitamente), y también interpreta %
secuencias en su primer argumento (es, después de todo, una cadena de formato). En general, desea colocar todas las cosas de formato en la cadena de formato, luego colocar cadenas variables en el resto de los argumentos para que pueda controlar cómo se interpretan mediante el formato %
que utiliza para interpolarlos en la salida. Algunos ejemplos:
printf "foo/nbar/n" # this does what you''re trying to do in the example
printf "%s/n" "$var" # behaves like ''echo "$var"'', except escapes will never be interpreted
printf "%b/n" "$var" # behaves like ''echo "$var"'', except escapes will always be interpreted
printf "%b/n" "foo/nbar" # also does your example
Prueba esto:
import subprocess
def bash_command(cmd):
subprocess.Popen([''/bin/bash'', ''-c'', cmd])
code="abcde"
// you can use echo options such as -e
bash_command(''echo -e "''+code+''"'')
Fuente: http://www.saltycrane.com/blog/2011/04/how-use-bash-shell-python-subprocess-instead-binsh/
Utilizar
alias echo / usr / bin / echo
forzar ''echo'' invocando coreutils ''echo que interpreta'' -e ''parámetro.