Respuestas:
echo -e ' \t '
repetirá 'espacio de tabulación espacio nueva línea' ( -esignifica 'permitir la interpretación de escapes de barra invertida'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -eno funciona desde Makefiles?
echo -eque no es POSIX y las makellamadas /bin/shque normalmente no se usan en el programa se usan de forma interactiva y normalmente no se han -eimplementado. Para portabilidad, use printf '\t'en su lugar.
manpágina del echocomando no menciona la opción -e. Sin embargo, esta opción es aceptada.
Uso printf, no echo.
Hay varias versiones diferentes del echocomando. Existe /bin/echo(que puede ser o no la versión GNU Coreutils, dependiendo del sistema), y el echocomando 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 --versiony --help, y el bash printf incorporado acepta -v varalmacenar la salida en una variable).
Por su ejemplo:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
Y ahora es tiempo de admitir que echofuncionará 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 echoverlo.
echoestá bien para una salida simple, como echo hello world, pero debe usarlo printfcuando quiera hacer algo más complejo. Usted puede obtener echoa trabajar, pero el código resultante es probable que falle cuando se ejecuta con una diferente echoaplicació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 ^Ven 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.
greppara atrapar líneas que contenían tabcaracteres.
Usar echo para imprimir valores de variables es una trampa común de Bash. Link de referencia: