Respuestas:
echo -e ' \t '
repetirá 'espacio de tabulación espacio nueva línea' ( -e
significa 'permitir la interpretación de escapes de barra invertida'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
no funciona desde Makefiles?
echo -e
que no es POSIX y las make
llamadas /bin/sh
que normalmente no se usan en el programa se usan de forma interactiva y normalmente no se han -e
implementado. Para portabilidad, use printf '\t'
en su lugar.
man
página del echo
comando no menciona la opción -e
. Sin embargo, esta opción es aceptada.
Uso printf
, no echo
.
Hay varias versiones diferentes del echo
comando. Existe /bin/echo
(que puede ser o no la versión GNU Coreutils, dependiendo del sistema), y el echo
comando está integrado en la mayoría de los shells. Las diferentes versiones tienen diferentes formas (o ninguna) para especificar o deshabilitar escapes para los caracteres de control.
printf
, por otro lado, tiene mucha menos variación. Puede existir como un comando, por lo general /bin/printf
, y está integrado en algunos shells (bash y zsh lo tienen, tcsh y ksh no), pero las diversas versiones son mucho más similares entre sí que las diferentes versiones de echo
. Y no tiene que recordar las opciones de línea de comandos (con algunas excepciones; GNU Coreutils printf acepta --version
y --help
, y el bash printf incorporado acepta -v var
almacenar la salida en una variable).
Por su ejemplo:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
Y ahora es tiempo de admitir que echo
funcionará igual de bien para el ejemplo que está preguntando; solo necesita poner comillas dobles alrededor del argumento:
echo "[$res]"
como escribió kmkaplan (hace dos años y medio, ¡acabo de darme cuenta!). El problema con tus comandos originales:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
no está con echo
; es que el caparazón reemplazó la pestaña con un espacio antes de echo
verlo.
echo
está bien para una salida simple, como echo hello world
, pero debe usarlo printf
cuando quiera hacer algo más complejo. Usted puede obtener echo
a trabajar, pero el código resultante es probable que falle cuando se ejecuta con una diferente echo
aplicación o un shell diferente.
También puedes probar:
echo Hello$'\t'world.
necesitas usar -e flag para echo, entonces puedes
echo -e "\t\t x"
Desde la página de manual de bash:
Las palabras de la forma $ 'string' se tratan especialmente. La palabra se expande a una cadena, con los caracteres con barra invertida reemplazados según lo especificado por el estándar ANSI C.
Entonces puedes hacer esto:
echo $'hello\tworld'
Usar la palabra por palabra de pulsaciones de teclas, ^V
( CTRL+V
, C-v
, lo que sea ).
Cuando escribe ^V
en el terminal (o en la mayoría de los editores de Unix), el siguiente carácter se toma literalmente . Puede usar esto para escribir un carácter de tabulación literal dentro de una cadena que está repitiendo.
Algo así como los siguientes trabajos:
echo "^V<tab>" # CTRL+V, TAB
Documentos bash ( qv , "inserción-citada")
entre comillas (Cq, Cv) Agregue el siguiente carácter que escriba a la línea textualmente. Así es como se insertan secuencias de teclas como Cq, por ejemplo.
nota al margen: de acuerdo con esto, ALT+TAB
debería hacer lo mismo, pero todos hemos vinculado esa secuencia al cambio de ventana, por lo que no podemos usarla
tab-insert (M-TAB) Inserta un carácter de tabulación.
-
Nota: puedes usar esta estrategia con todo tipo de personajes inusuales. Como un retorno de carro:
echo "^V^M" # CTRL+V, CTRL+M
Esto se debe a que el retorno de carro es ASCII 13 y M es la decimotercera letra del alfabeto, por lo que cuando escribe ^M
, obtiene el decimotercer carácter ASCII. Puede verlo en acción usando ls^M
, en una solicitud vacía, que insertará un retorno de carro, haciendo que la solicitud actúe como si presionara retorno. Cuando estos caracteres se interpretan normalmente, textualmente se obtiene el carácter literal.
grep
para atrapar líneas que contenían tab
caracteres.
Usar echo para imprimir valores de variables es una trampa común de Bash. Link de referencia: