cat produz o diretório inteiro quando usado em um script bash

0

Eu tenho um scirpt assim:

#!/bash/bin
file='cat /proc/net/arp'
echo $file

E quando eu executo o script, ele exibe toda a pasta em que o script é assim:

IP address HW type Flags HW address Mask Device 192.168.1.102 0x1 0x2 a0:88:b4:e3:f6:6c naloga1.png naloga1.txt naloga1.txt~ naloga2.png naloga2.txt naloga2.txt~ naloga3.png naloga3.sh naloga3.sh~ naloga3.txt naloga3.txt~ naloga4.png naloga4.txt naloga5.png naloga5.sh naloga5.sh~ naloga5.txt naloga6.png naloga6.txt naloga6.txt~ naloga7.png naloga7.txt naloga7.txt~ naloga8.sh naloga8.sh~ porocilo.odt tekst.txt tekst.txt~ eth0 192.168.1.1 0x1 0x2 58:6d:8f:15:fd:c3 naloga1.png naloga1.txt naloga1.txt~ naloga2.png naloga2.txt naloga2.txt~ naloga3.png naloga3.sh naloga3.sh~ naloga3.txt naloga3.txt~ naloga4.png naloga4.txt naloga5.png naloga5.sh naloga5.sh~ naloga5.txt naloga6.png naloga6.txt naloga6.txt~ naloga7.png naloga7.txt naloga7.txt~ naloga8.sh naloga8.sh~ porocilo.odt tekst.txt tekst.txt~ eth0

Alguma idéia de por que está agindo dessa maneira?

    
por Kajzer 13.04.2013 / 17:11

1 resposta

2

O arquivo contém um caractere curinga (provavelmente * ) e, quando você faz eco, você não tem aspas duplas em torno da referência da variável $file . Quando o shell expande uma referência de variável como essa, ele volta pelo valor e analisa várias coisas: espaços (tratados como separadores entre argumentos), curingas (que são substituídos pela lista apropriada de nomes de arquivos), etc. Colocando a variável referência dentro de aspas duplas evita essa análise extra. Em geral, é uma boa ideia colocar todas as referências de variáveis entre aspas duplas, a menos que você queira especificamente a análise extra por algum motivo.

BTW, eu também prefiro $() sobre backquotes - eles fazem essencialmente a mesma coisa, mas a versão entre parênteses é muito mais fácil de ler. Além disso, nesse contexto, o bash permitirá que você pule o comando cat e use apenas um redirecionamento < (note que esse é um recurso somente bash, no entanto).

#!/bash/bin
file=$(</proc/net/arp)
echo "$file"
    
por 13.04.2013 / 17:37

Tags