No bash, grep para uma linha que começa com \, e atribui o resultado usando backticks

2

No bash, estou tentando fazer um arquivo para uma linha que começa com um \ e retornar o resultado usando backticks.

Por exemplo:

echo \Hello > myFile
out='cat myFile | grep '^\Hello''
echo $out

não retorna nada, mesmo que

cat myFile | grep '^\Hello'

retorna como esperado.

\Hello

Isso parece um comportamento extremamente estranho. Em particular, a sequência de comandos anólogos no tcsh faz o que se espera:

set out='cat myFile | grep '^\Hello''; echo $out

retorna

\Hello

Alguém poderia explicar o que está acontecendo, por favor? Obrigado

    
por Leo Simon 15.09.2015 / 00:44

1 resposta

7

Leia o link e especialmente

Backslashes inside backticks are handled in a non-obvious manner

:

'...'

é a sintaxe legada requerida apenas pelos mais antigos bourne-shells não compatíveis com POSIX. Há vários motivos para sempre preferir a sintaxe $(...) , então:

echo \Hello > myFile

e em vez de

out=$(cat myFile | grep '^\Hello')

simplifique um pouco:

out=$(grep '^\Hello' myFile)

então

echo $out

E "Aspas duplas" a cada literal que contenha espaços / metacaracteres e todas expansão: "$ var", "$ (comando" $ var ")", "$ {array [@]} "," a & b ". Use 'aspas simples' para código ou literal $ 's:' Custa $ 5 US ', host ssh' echo "$ HOSTNAME" '. Consulte o link , link e < href="http://wiki.bash-hackers.org/syntax/words"> link .

Então, finalmente:

echo \Hello > myFile
out="$(grep '^\Hello' myFile)"
echo "$out"
    
por 15.09.2015 / 00:54