Por que o comando echo 'echo \\\ z' output \ z?

1

O comando echo $(echo \\z) é do livro , Eu não entendo porque isso gera

\z

Eu acho que deve sair

z

    
por tmpbin 30.11.2017 / 16:22

2 respostas

6

\ é um operador de cotação para o shell. Quando fora de outros tipos de cotações, \x é como 'x' (exceto quando x é o caractere de nova linha).

Então:

echo \\x

é como:

echo '\''x'

Ou

echo '\x'

Portanto, echo é invocado com dois argumentos, um que contém echo (seu nome) e um que contém \x .

Por POSIX , o comportamento de echo quando qualquer um de seus operandos (argumentos outros que o nome do comando) contém uma barra invertida ou seu primeiro operante é -n não especificado. Você verá que o comportamento varia mesmo fora disso.

De acordo com a especificação do UNIX (com o XSI aplicando no link acima), o comportamento de echo '\z' também não é especificado, pois \z não é uma das seqüências de escape padrão.

Com um echo compatível com UNIX, como o echo incorporado em bash -o posix -O xpg_echo , você pode garantir que:

echo '\z'

o mesmo que:

echo \\z

ou:

echo \\\z

produzirá \z<newline> .

Além disso, você não receberá qualquer garantia do POSIX.

A implementação pode gerar z ou \z ou no such escape sequence: \z ou um caractere NUL ...

Na prática, no entanto, eu não conheço nenhuma implementação que entenda \z como uma seqüência de escape, então eu acho que todas as que eu tentei produzir \z<newline> lá.

Se você quiser uma maneira portátil e confiável de produzir texto, não use echo , use printf .

    
por 30.11.2017 / 16:37
1

Divida a declaração em seções

\ é a variável que o bash reconhece como escape

Portanto \ está escapando do caractere "\" portanto, imprimindo \

\ z está escapando do caractere "z", portanto, imprimindo z

Em conjunto, temos \ z

    
por 30.11.2017 / 16:36