Антипаттерн: 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>&-
Поделиться
Отправить
9 комментариев
hshhhhh (hshhhhh.name)

Единственное где я сумел отбить привычку вызывать cat это grep и то потому что ищу обычно рекурсивно и там cat уже сложно прикручивать.

А так комбинацию типа cat file | sort | uniq > file2 выжечь из мозга не получается )

hshhhhh (hshhhhh.name)

Хм, у тебя граватар приоритетнее чем паватар. Бида.

Евгений Степанищев (bolknote.ru)

Комментарий для hshhhhh.name:

Единственное где я сумел отбить привычку вызывать cat это grep и то потому что ищу обычно рекурсивно и там cat уже сложно прикручивать.

Надо просто прекратить использовать cat. Везде.

Хм, у тебя граватар приоритетнее чем паватар. Бида.

А в чём беда? :)

Евгений Степанищев (bolknote.ru)

Комментарий для hshhhhh.name:

Я имею ввиду, что надо просто забыть на время, что такая команда есть.

Sphinkx

С cat как-то проще писать и воспринимать код — символ «|» воспринимается как разделитель между обработчиками потоков. Такой код можно писать не приходя в сознание.

Евгений Степанищев (bolknote.ru)

Комментарий для Sphinkx:

Ну так инициируйте поток символом „<“. Делов-то:

< /etc/passwd grep -v test | wc -l

hshhhhh (hshhhhh.name)

Комментарий для Sphinkx:

Я имею ввиду, что надо просто забыть на время, что такая команда есть.

С cat как-то проще писать и воспринимать код — символ «|» воспринимается как разделитель между обработчиками потоков.

Я вот согласен с товарищем что когда у меня используются пайпы то мозг работает в режиме «один обработчик -​-​ одно действие» и мне проще написать ’cat file | sort | uniq’ чем ’sort file | uniq’.

Да ,оно короче и типабыстрее, но так сорт делает сразу две вещи что меня просто люто пугает и мозг приходиться для этого уже включать.

hshhhhh (hshhhhh.name)

Комментарий для Евгения Степанищева:

А в чём беда? :)

Аватарка изменилась, не ожидал :).

Евгений Степанищев (bolknote.ru)

Комментарий для hshhhhh.name:

Да ,оно короче и типабыстрее, но так сорт делает сразу две вещи что меня просто люто пугает и мозг приходиться для этого уже включать.

Надо всё выкинуть и написать: sort -u file :)

Популярное