команда 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
есть идеи, почему он так себя ведет?
1 ответов
файл содержит подстановочный знак (возможно *
), а когда эхо его у вас нет двойной кавычки $file
ссылка на переменную. Когда оболочка расширяет ссылку на переменную подобным образом, она возвращается через значение и анализирует ряд вещей: пробелы (рассматриваемые как разделители между аргументами), подстановочные знаки (которые заменяются соответствующим списком имен файлов) и т. д. Помещение ссылки на переменную в двойные кавычки позволяет избежать дополнительного анализа. В общем, это хорошая идея чтобы поместить все ссылки на переменные в двойные кавычки, если вы специально не хотите дополнительный разбор по какой-то причине.
кстати, я тоже предпочитаю $()
над backquotes - они делают по существу то же самое, но версия в скобках намного легче читать. Кроме того, в этом контексте bash позволит вам пропустить cat
команда и просто использовать <
перенаправление (обратите внимание, что это функция только для bash).
#!/bash/bin
file=$(</proc/net/arp)
echo "$file"