Антипаттерн: useless cat
Есть такой антипаттерн программирования в командной строке как useless cat. Переводится не «бесполезная кошка» (хотя для смеха можно переводить и так), а как «бесполезная [команда] cat».
Несмотря на то, что многие команды — awk, sed, cut и прочие умеют самостоятельно читать из файла, программисты почему-то стараются передать им данные через пайп, используя cat. Это загромождает код и неэффективно, ведь cat это не просто команда, это программа, которая располагается на диске в директории /bin, её шеллу ещё запустить надо.
# неправильно:
cat /etc/passwd | cut -d: -f1
# правильно:
cut -d: -f1 /etc/passwd
Если команда не умеет принимать имя файла в качестве параметра, то и в этом случае cat не нужен, достаточно воспользоваться перенаправлением. Тут могут быть детали, так как синтаксис перенаправления гораздо богаче, чем используемое в 90% случаев простое перенаправление из файла и в файл и размер этого богатства разный в разных шеллах, я приведу пример для bash:
# плохо (пример для bash):
cat /etc/passwd | read firstline && echo $firstline
# можно так (такой синтаксис bash поддерживает не в полном объёме):
</etc/passwd read firstline && echo $firstline
# лучше так:
read firstline </etc/passwd && echo $firstline
Вообще, стоит изучить внимательно синтаксис перенаправлений, потому что он позволяет делать такие вот вещи без лишних команд (опять bash):
# читаем файл /etc/passwd в массив, разделители элементов в файле — двоеточие
IFS=: passwd=($(</etc/passwd))
# читаем первые десять байт из последних десяти строк файла /etc/passwd
dd bs=1 count=10 if=<(tail -10 /etc/passwd) 2>&-
Единственное где я сумел отбить привычку вызывать cat это grep и то потому что ищу обычно рекурсивно и там cat уже сложно прикручивать.
А так комбинацию типа cat file | sort | uniq > file2 выжечь из мозга не получается )
Хм, у тебя граватар приоритетнее чем паватар. Бида.
Комментарий для hshhhhh.name:
Надо просто прекратить использовать cat. Везде.
А в чём беда? :)
Комментарий для hshhhhh.name:
Я имею ввиду, что надо просто забыть на время, что такая команда есть.
С cat как-то проще писать и воспринимать код — символ «|» воспринимается как разделитель между обработчиками потоков. Такой код можно писать не приходя в сознание.
Комментарий для Sphinkx:
Ну так инициируйте поток символом „<“. Делов-то:
< /etc/passwd grep -v test | wc -l
Комментарий для Sphinkx:
Я вот согласен с товарищем что когда у меня используются пайпы то мозг работает в режиме «один обработчик -- одно действие» и мне проще написать ’cat file | sort | uniq’ чем ’sort file | uniq’.
Да ,оно короче и типабыстрее, но так сорт делает сразу две вещи что меня просто люто пугает и мозг приходиться для этого уже включать.
Комментарий для Евгения Степанищева:
Аватарка изменилась, не ожидал :).
Комментарий для hshhhhh.name:
Надо всё выкинуть и написать: sort -u file :)