Антипаттерн: 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>&-
12 февраля 2013 20:45

hshhhhh (hshhhhh.name)
12 февраля 2013, 23:22

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

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

hshhhhh (hshhhhh.name)
12 февраля 2013, 23:24

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

bolk (bolknote.ru)
13 февраля 2013, 06:06, ответ предназначен hshhhhh (hshhhhh.name):

Единственное где я сумел отбить привычку вызывать cat это grep и то потому что ищу обычно рекурсивно и там cat уже сложно прикручивать.
Надо просто прекратить использовать cat. Везде.
Хм, у тебя граватар приоритетнее чем паватар. Бида.
А в чём беда? :)

bolk (bolknote.ru)
13 февраля 2013, 06:07, ответ предназначен hshhhhh (hshhhhh.name):

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

Sphinkx (инкогнито)
13 февраля 2013, 13:37

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

bolk (bolknote.ru)
13 февраля 2013, 15:22, ответ предназначен Sphinkx

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

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

hshhhhh (hshhhhh.name)
13 февраля 2013, 16:22, ответ предназначен Sphinkx

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

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

hshhhhh (hshhhhh.name)
13 февраля 2013, 16:22, ответ предназначен bolk (bolknote.ru):

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

bolk (bolknote.ru)
13 февраля 2013, 16:50, ответ предназначен hshhhhh (hshhhhh.name):

Да ,оно короче и типабыстрее, но так сорт делает сразу две вещи что меня просто люто пугает и мозг приходиться для этого уже включать.
Надо всё выкинуть и написать: sort -u file :)

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)