ZyX писал(а): ↑09.06.2012 19:22
strace говорит, что cat плевать на строчки, читает и пишет она у меня блоками по 32768 байт.
ну и что? у меня ЕМНИП по 65536 читала. смысл ей читать именно по строчкам, если в данной ситуации можно и так? Кстати, макрос fgetc(3) тоже читает у меня по 65536 байт, и что?
>Я же всегда считал файлами только то, что находится в файловой системе (точнее, не существует без неё). Дескрипторы же наличия файловой системы не требуют. Так что, если брать определение из wikipedia, то я здесь неправ.
ну тогда все мои вышесказанные слова вы поняли неправильно. Ибо я файлом считал сущность, у которой есть файловый дескриптор, и в которую можно читать/писать, например тем же макросом fgetc(3) (и другими). stdin по определению подходит, ибо есть getchar(3), которая как раз и читает из потока stdin. Ну а поток (FILE*) как известно привязан к файловому дескриптору, а следовательно и к файлу, в моём понимании конечно.
Что там в вике написано - меня тоже абсолютно не волнует.
>Не нужна, нужна только над содержимым — использую. К тому же, могу быть уверен, что cat | … будет воспринято правильно и файл изменён не будет. Можете ответить, зачем мне давать программе информацию, в которой она совершенно не нуждается для выполнения данной задачи?
конечно могу: вы зачем-то cat эту информацию даёте, а другой команде - не даёте. С другой стороны, признайтесь, что случай по умолчанию таки удобнее, как например просто удобно просматривать распакованный файл командой less. А уж если вам так хочется скрыть эту информацию, то вот тут-то cat и пригодится.
Однако, в случае ТСа, и в большинстве практических случаев, скрывать не нужно.
ZyX писал(а): ↑09.06.2012 19:22
Всегда использовал vim в данном случае.
а если надо исправить 40 файлов, причём одинаковым способом? Это вполне себе случай из практики. Вот как работает пакетный режим в vim - лично я не помню, как-то хитро, ибо vim не для того предназначен.
ZyX писал(а): ↑09.06.2012 19:22
Но если хотите, есть sponge из moreutils.
нету. ну вот нету на серверах. да и на десктопе тоже нет. И качать/компилять/ставить мне лень.
ZyX писал(а): ↑09.06.2012 19:22
vim. Он умеет и хранить такие бэкапы в одном месте, и имеет persistent undo, благодаря которому оные мне ни разу ни требовались.
это я всё знаю. и даже ещё и использую.
ZyX писал(а): ↑09.06.2012 19:22
Точно так же присутствует почти везде и, помимо прочего, может всё, что может sed.
не всё. Пакетный режим в vim совершенно неюзабельный. Что надеюсь очевидно. Если вам это не нужно - так вообще зачем вы заладили этот спор? Мы же в конце концов про командную строку...
Кстати, вы тоже пишете cat file | vim, или тут без cat? А что ж так? (:
ZyX писал(а): ↑09.06.2012 19:22
1. С какой радости та же cut вообще обязана открывать файл? Это не её задача.
не знаю...
NAME
cut - remove sections from each line of files
если что: Report cut bugs to bug-coreutils@gnu.org
ZyX писал(а): ↑09.06.2012 19:22
Здесь штопор и бутылки то же стандартные, просто вы используете штопор, в который вставили насос, а я открываю бутылку обычным штопором и вставляю насос так.
у меня нет никаких "насосов", просто штопор и всё.
ZyX писал(а): ↑09.06.2012 19:22
2. Это не неожиданность, но если мне надо что‐то распаковать, я сам скажу об этом.
да? вы мне сейчас с ходу расскажите, где в моей системе выставляется раскраска для ls? или расскажите о том почему less в моей системе, и в CentOS5 распаковывает gz, а вот в Debian - не хочет?
ZyX писал(а): ↑09.06.2012 19:22
1.Скажите, что проще понять — cat | head -n 10 | sed s/// или sed '10q;s///'?
2.Мало удовольствия учить зашифрованные в одну букву команды, когда есть нормально выглядящие аналоги.
3.Как я полагаю, tail будет чем‐то вроде 1,$-5d? Это действительно лучше tail -n 4?
1. ну тут я не знаю. Я-бы написал возможно head | sed s///, так ИМХО проще и понятнее. Что до q10, то не надо мне тут было рассказывать, что sed такого не умеет, это не вам было сказано.
2. вопрос привычки. Речь ведь про cat, она тут лишняя по любому, ВНЕЗАПНО head тоже умеет имена файлов.
3. неправильно полагаете, sed просматривает файл 1 раз, и у неё нет подключения к libastral.so, что-бы догадаться, что _через_ 10 строк будет EOF (может вы там ручками набиваете строки?). Потому приходится применять дополнительный буфер, как и в tail.