Respostas:
echo -e ' \t '
ecoará 'nova aba do espaço da guia de espaço' ( -e
significa 'habilitar a interpretação de escapes de barra invertida'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
que não funciona no Makefiles?
echo -e
ocorre porque não é POSIX e as make
chamadas /bin/sh
que normalmente não são usadas pelo programa usam interativamente e normalmente não foram -e
implementadas. Para portabilidade, use em printf '\t'
vez disso.
man
página do echo
comando não menciona a opção -e
. No entanto, esta opção é aceita.
Use printf
, não echo
.
Existem várias versões diferentes do echo
comando. Existe /bin/echo
(que pode ou não ser a versão GNU Coreutils, dependendo do sistema), e o echo
comando está embutido na maioria dos shells. Versões diferentes têm maneiras diferentes (ou não) de especificar ou desativar escapes para caracteres de controle.
printf
, por outro lado, tem muito menos variação. Ele pode existir como um comando, normalmente /bin/printf
, e está embutido em alguns shells (o bash e o zsh têm, o tcsh e o ksh não), mas as várias versões são muito mais parecidas entre si do que as diferentes versões do echo
. E você não precisa se lembrar das opções da linha de comando (com algumas exceções; o GNU Coreutils printf aceita --version
e --help
, e o bash printf embutido aceita -v var
armazenar a saída em uma variável).
Para o seu exemplo:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
E agora é hora de eu admitir que echo
funcionará tão bem quanto o exemplo que você está perguntando; você só precisa colocar aspas duplas no argumento:
echo "[$res]"
como escreveu o kmkaplan (há dois anos e meio, eu acabei de notar!). O problema com seus comandos originais:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
não está com echo
; é que o shell substituiu a aba por um espaço antes echo
mesmo de ser visto.
echo
é bom para saída simples, como echo hello world
, mas você deve usá- printf
lo sempre que quiser fazer algo mais complexo. Você pode começar echo
a trabalhar, mas é provável que o código resultante falhe ao executá-lo com uma echo
implementação diferente ou um shell diferente.
Você também pode tentar:
echo Hello$'\t'world.
você precisa usar -e flag para eco, então você pode
echo -e "\t\t x"
Na página do manual do bash:
Palavras da forma $ 'string' são tratadas especialmente. A palavra se expande para string, com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C.
Então você pode fazer isso:
echo $'hello\tworld'
Use o verbatim keystroke, ^V
( CTRL+V
, C-v
, qualquer que seja ).
Quando você digita ^V
no terminal (ou na maioria dos editores de Unix), o seguinte caractere é escolhido literalmente . Você pode usar isso para digitar um caractere de tabulação literal dentro de uma string que você está ecoando.
Algo como o seguinte funciona:
echo "^V<tab>" # CTRL+V, TAB
Documentos bash ( qv , "inserção entre aspas")
inserção entre aspas (Cq, Cv) Adicione o próximo caractere digitado à linha literalmente. Isto é como inserir sequências de teclas como Cq, por exemplo.
nota lateral: de acordo com isso, ALT+TAB
deve fazer a mesma coisa, mas todos vinculamos essa sequência à alternância de janelas para que não possamos usá-la
inserção de tabulação (M-TAB) Insere um caractere de tabulação.
-
Nota: você pode usar esta estratégia com todos os tipos de caracteres incomuns. Como um retorno de carro:
echo "^V^M" # CTRL+V, CTRL+M
Isso ocorre porque o retorno de carro é ASCII 13 e M é a 13ª letra do alfabeto; portanto, quando você digita ^M
, obtém o 13º caractere ASCII. Você pode vê-lo em ação usando ls^M
, em um prompt vazio, o qual inserirá um retorno de carro, fazendo com que o prompt atue exatamente como você pressiona o retorno. Quando esses caracteres são normalmente interpretados, literalmente você obtém o caractere literal.
grep
para pegar linhas contendo tab
caracteres.
Usar eco para imprimir valores de variáveis é uma armadilha comum do Bash. Link de referência: