команда cat выводит весь каталог при использовании в скрипте bash

у меня scirpt такой:

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

и когда я запускаю скрипт, он выводит всю папку, где скрипт такой:

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

есть идеи, почему он так себя ведет?

5
задан Carl B
источник

1 ответов

файл содержит подстановочный знак (возможно *), а когда эхо его у вас нет двойной кавычки $file ссылка на переменную. Когда оболочка расширяет ссылку на переменную подобным образом, она возвращается через значение и анализирует ряд вещей: пробелы (рассматриваемые как разделители между аргументами), подстановочные знаки (которые заменяются соответствующим списком имен файлов) и т. д. Помещение ссылки на переменную в двойные кавычки позволяет избежать дополнительного анализа. В общем, это хорошая идея чтобы поместить все ссылки на переменные в двойные кавычки, если вы специально не хотите дополнительный разбор по какой-то причине.

кстати, я тоже предпочитаю $() над backquotes - они делают по существу то же самое, но версия в скобках намного легче читать. Кроме того, в этом контексте bash позволит вам пропустить cat команда и просто использовать < перенаправление (обратите внимание, что это функция только для bash).

#!/bash/bin
file=$(</proc/net/arp)
echo "$file"
2
отвечен Gordon Davisson 2013-04-13 17:16:47
источник

Другие вопросы bash cat