Existe uma diferença entre citar duas vezes uma variável ou uma linha inteira no eco

3

Quando você digita, por exemplo,

echo Variable "$var" is not initialised.

e

echo "Variable $var is not initialised."

o resultado final é exatamente o mesmo (até onde eu sei, pelo menos). Mas eu estava me perguntando, da perspectiva de echo , se há alguma diferença em como o comando é executado.

E no desempenho, este último é mais rápido, já que echo receberia todos os argumentos de uma só vez?

    
por Linkyu 09.01.2015 / 16:55

1 resposta

1

Em

echo Variable "$var" is not initialised.

Você está passando 5 argumentos para echo (6, se contar echo ), echo os produzirá separados por um caractere de espaço terminado com uma nova linha.

Em:

echo "Variable $var is not initialised."

Você está passando 2 argumentos, dos quais o primeiro já tem o echo .

Neste caso particular e na maioria dos casos, isso será funcionalmente equivalente.

O segundo significa menos trabalho para o shell analisar o comando e armazená-lo em argumentos antes de executar echo e menos trabalho para echo passar por seus argumentos.

É improvável que isso faça uma diferença muito significativa. Em meus testes, vejo uma pequena diferença com algumas combinações de echo / shell como bash com sua integração, mas quase nenhuma em outras.

Outras razões pelas quais você pode querer passar um argumento em vez de vários:

  • Se você quiser mais do que um espaço entre os argumentos: echo a b produziria a b , você precisaria de echo 'a b' para a saída a b .
  • Em coisas como echo "$opt" is an invalid option , com algumas implementações echo como echo incorporadas de bash , que não funcionariam com opt=-e (ou -E ou -neE ...) echo "$opt is an invalid option" seria OK.
  • Em echo foo bar , você está passando 2 argumentos de 3 bytes de comprimento cada, ou seja, 2 ponteiros (8 bytes cada em sistemas de 64 bits) e 6 bytes (22 bytes no total em sistemas de 64 bits). Embora seja um ponteiro e 7 bytes para echo 'foo bar' (15 bytes no total). Ao chamar o executável echo externo com uma lista grande de argumentos, isso pode fazer com que você atinja o limite do tamanho dos argumentos mais rapidamente (embora muitos sistemas também tenham um limite no tamanho máximo de um único argumento).

Em qualquer caso aqui, para dados arbitrários (como $var cujo conteúdo não sabemos (embora no contexto aqui possamos derivar que contém apenas alnums e sublinhados)), você deseja usar printf , não echo :

printf '%s\n' "Variable $var is not initialised."

Ou:

printf 'Variable %s is not initialised.' "$var"

E, nesse caso, ao lado do formato, tem que ser um único argumento passado para printf .

    
por 25.08.2016 / 18:49