LINUX.ORG.RU
решено ФорумTalks

избыточность cat

 ,


0

1

на stackoverflow на какие-то темки наткнулся, где ненужность cat в некоторых конвейерах обсуждалась. походу вопрос несколько философски-технический возник

какой вариант православнее для получения количества строк в файле в переменную

lines=$(wc -l /path/to/file | cut -f1 -d' ')

или

lines=$(cat /path/to/file | wc -l)

кому какой шустрее/читабельнее/etc?

★★★★★

хотя самое правильное было-бы - опция wc для нормального выхлопа

ananas ★★★★★
() автор топика

кому какой .../читабельнее/etc?

cat /path/to/file | wc -l
SaBo ★★
()
Ответ на: комментарий от RazrFalcon

не используй. я не возражаю

ananas ★★★★★
() автор топика

православнее

Православнее (идеалистичнее), очевидно, первый. Даже устойчивое выражение есть — не суйте котов в трубу.

кому <...> шустрее

Шустрее не может быть «кому», шустрее — это объективная метрика.

читабельнее

А вот читабельнее (и писабельнее) мне однозначно второй вариант, хоть он и избыточный, потому что сохраняется порядок действий слева направо: возьми ФАЙЛ-ИСХОДНИК, сделай ДЕЙСТВИЕ, сделай ещё ДЕЙСТВИЕ, положи в ФАЙЛ-РЕЗУЛЬТАТ.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

ну, порядок действий везде сохраняется, иначе не получишь результат

ananas ★★★★★
() автор топика

Насчёт шустрее не знаю, а второй способ лучше читается и понятнее. Не требуется помнить опции cut

anonymous_incognito ★★★★★
()

Я стараюсь пользоваться первым. В какой-то момент почувствовал, что гораздо проще дописать файл в конец команды, чем возвращаться в начало, писать cat, имя файла, палку и т.д.

h31 ★★★★
()

использую cat даже перед | tar, потому что между ними можно в любой момент засунуть openssl encrypt/decrypt и прочее.

Spoofing ★★★★★
()
Ответ на: комментарий от te111011010

А поцчему wc добавляет имя файла к выводу

потому что файлов может быть указано больше одного

ananas ★★★★★
() автор топика
lines=0
while read; do ((lines++)); done < /path/to/file
vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от ananas
lines=$(wc -l < file)


вот он, идеал

Идеал это когда опечатка в один символ вместо подсчёта количества строк в файле затрёт этот файл (и в качестве вишенки — подвесит скрипт)? Имел я в виду такие идеалы. Мне хватило одного бакапа БД затёртого приглашением восстановлялки бекапа чтобы понять что коты в трубах это не-круто, но практично (и потому эстетично). Благо бекапы делались на удалённую машину, и затёр я принесённую оттуда копию. А ведь бывают и локальные бекапы (дампнул базу, пошаманил с данными, если не понравилось накатал дамп)

MrClon ★★★★★
()
Ответ на: комментарий от ananas

Интерактив тоже предлагаешь сначала на тестинге обкатывать, а потом каждую команду заботливо копипастить на прод?
Да и даже безотносительно этого: нафига использовать практики которые повышают вероятность накосячить? Ради экономии в пару символов?

MrClon ★★★★★
()

lines=$(grep -c ^ /path/to/file)

imul ★★★★★
()
Ответ на: комментарий от MrClon

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

ananas ★★★★★
() автор топика
Ответ на: комментарий от ananas

Зачем использовать разные варианты реализации одного и тот-же в скриптах и в интерактиве? Зачем в принципе использовать вариант который располагает к выстрелу в ногу, вместо варианта который не располагает к выстрелу в ногу?

MrClon ★★★★★
()
Ответ на: комментарий от ananas

кто будет в интерактиве загонять результаты команды в промежуточные переменные

Сам не проверял, но вангую что в том же apache zeppelin при использовании shell интерпретатора в этом появляется смысл.

phoen ★★
()
Ответ на: комментарий от MrClon

Зачем использовать разные варианты реализации одного и тот-же в скриптах и в интерактиве?

затем, что задачи обычно решаются несколько разные. скрипт - автоматизация постоянных рутинных операций. а интерактив - разовые операции. и во втором случае значительно проще распарсить выхлоп вообще глазами.

Зачем в принципе использовать вариант который располагает к выстрелу в ногу, вместо варианта который не располагает к выстрелу в ногу?

зачем вообще код оптимизировать?

ananas ★★★★★
() автор топика
Ответ на: комментарий от ananas

Зачем держать в уме два варианта вместо одного и тратить лишние такты своего интракраниального CPU на выбор одного из них?

зачем вообще код оптимизировать?

А ты уверен что оно вообще быстрее/экономичнее? Если да то: а ты уверен что разница хоть сколько-то значима в твоём случае? Если да то: а ты уверен что тут всё-ещё стоит использовать bash?

MrClon ★★★★★
()

Сат отлично заходит. Просто и понятно.

Иногда, конечно, понтануться можно, когда через плечо сидят глядят во время демонстрации, зафигарить этих галочек.

Deleted
()

где ненужность cat в некоторых конвейерах обсуждалась

И ты их прочитал? Если да, то в чём вопрос, если нет, то зачем ты сюда пришёл, чтобы тебе то же самое написали?

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.