Cat ошибка записи

Введение

Стандартные потоки ввода и вывода в Linux являются одним из наиболее распространенных средств для обмена информацией процессов, а перенаправление >>> и | является одной из самых популярных конструкций командного интерпретатора.

В данной статье мы ознакомимся с возможностями перенаправления потоков ввода/вывода, используемых при работе файлами и командами.

Требования

  • Linux-система, например, Ubuntu 20.04

Потоки

Стандартный ввод при работе пользователя в терминале передается через клавиатуру.

Стандартный вывод и стандартная ошибка отображаются на дисплее терминала пользователя в виде текста.

Ввод и вывод распределяется между тремя стандартными потоками:

  • stdin — стандартный ввод (клавиатура),
  • stdout — стандартный вывод (экран),
  • stderr — стандартная ошибка (вывод ошибок на экран).

Потоки также пронумерованы:

  • stdin — 0,
  • stdout — 1,
  • stderr — 2.

Из стандартного ввода команда может только считывать данные, а два других потока могут использоваться только для записи. Данные выводятся на экран и считываются с клавиатуры, так как стандартные потоки по умолчанию ассоциированы с терминалом пользователя. Потоки можно подключать к чему угодно: к файлам, программам и даже устройствам. В командном интерпретаторе bash такая операция называется перенаправлением:

  • < file — использовать файл как источник данных для стандартного потока ввода.
  • > file — направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существует — перезаписан сверху.
  • 2> file — направить стандартный поток ошибок в файл. Если файл не существует, он будет создан, если существует — перезаписан сверху.
  • >>file — направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существует — данные будут дописаны к нему в конец.
  • 2>>file — направить стандартный поток ошибок в файл. Если файл не существует, он будет создан, если существует — данные будут дописаны к нему в конец.
  • &>file или >&file — направить стандартный поток вывода и стандартный поток ошибок в файл. Другая форма записи: >file 2>&1.

Стандартный ввод

Стандартный входной поток обычно переносит данные от пользователя к программе. Программы, которые предполагают стандартный ввод, обычно получают входные данные от устройства типа клавиатура. Стандартный ввод прекращается по достижении EOF (конец файла), который указывает на то, что данных для чтения больше нет.

EOF вводится нажатием сочетания клавиш Ctrl+D.

Рассмотрим работу со стандартным выводом на примере команды cat (от CONCATENATE, в переводе «связать» или «объединить что-то»).

Cat обычно используется для объединения содержимого двух файлов.

Cat отправляет полученные входные данные на дисплей терминала в качестве стандартного вывода и останавливается после того как получает EOF.

Пример

cat

В открывшейся строке введите, например, 1 и нажмите клавишу Enter. На дисплей выводится 1. Введите a и нажмите клавишу Enter. На дисплей выводится a.

Дисплей терминала выглядит следующим образом:

test@111:~/stream$ cat
1
1
a
a

Для завершения ввода данных следует нажать сочетание клавиш Ctrl + D.

Стандартный вывод

Стандартный вывод записывает данные, сгенерированные программой. Когда стандартный выходной поток не перенаправляется в какой-либо файл, он выводит текст на дисплей терминала.

При использовании без каких-либо дополнительных опций, команда echo выводит на экран любой аргумент, который передается ему в командной строке:

echo Пример

Аргументом является то, что получено программой, в результате на дисплей терминала будет выведено:

Пример

При выполнении echo без каких-либо аргументов, возвращается пустая строка.

Пример

Команда объединяет три файла: file1, file2 и file3 в один файл bigfile:

cat file1 file1 file1 > bigfile

Команда cat по очереди выводит содержимое файлов, перечисленных в качестве параметров на стандартный поток вывода. Стандартный поток вывода перенаправлен в файл bigfile.

Стандартная ошибка

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

Пример

Рассмотрим пример стандартной ошибки с помощью команды ls, которая выводит список содержимого каталогов.

При запуске без аргументов ls выводит содержимое в пределах текущего каталога.

Введем команду ls с каталогом % в качестве аргумента:

ls %

В результате должно выводиться содержимое соответствующей папки. Но так как каталога % не существует, на дисплей терминала будет выведен следующий текст стандартной ошибки:

ls: cannot access %: No such file or directory

Перенаправление потока

Linux включает в себя команды перенаправления для каждого потока.

Команды со знаками > или < означают перезапись существующего содержимого файла:

  • > — стандартный вывод,
  • < — стандартный ввод,
  • 2> — стандартная ошибка.

Команды со знаками >> или << не перезаписывают существующее содержимое файла, а присоединяют данные к нему:

  • >> — стандартный вывод,
  • << — стандартный ввод,
  • 2>> — стандартная ошибка.

Пример

В приведенном примере команда cat используется для записи в файл file1, который создается в результате цикла:

cat > file1
a
b
c

Для завершения цикла нажмите сочетание клавиш Ctrl + D.

Если файла file1 не существует, то в текущем каталоге создается новый файл с таким именем.

Для просмотра содержимого файла file1 введите команду:

cat file1

В результате на дисплей терминала должно быть выведено следующее:

a
b
c

Для перезаписи содержимого файла введите следующее:

cat > file1
1
2
3

Для завершения цикла нажмите сочетание клавиш Ctrl + D.

В результате на дисплей терминала должно быть выведено следующее:

1
2
3

Предыдущего текста в текущем файле больше не существует, так как содержимое файла было переписано командой >.

Для добавления нового текста к уже существующему в файле с помощью двойных скобок >> выполните команду:

cat >> file1
a
b
c

Для завершения цикла нажмите сочетание клавиш Ctrl + D.

Откройте file1 снова и в результате на дисплее монитора должно быть отражено следующее:

1
2
3
a
b
c

Каналы

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

Пример

Введите команду:

ls | less

В результате каждый файл текущего каталога будет размещен на новой строке:

file1
file2
t1
t2

Перенаправлять данные с помощью каналов можно как из одной команды в другую, так и из одного файла к другому, а перенаправление с помощью > и >> возможно только для перенаправления данных в файлах.

Пример

Для сохранения имен файлов, содержащих строку «LOG», используется следующая команда:

dir /catalog | find "LOG" > loglist

Вывод команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле loglist в виде списка (например, Config.log, Logdat.svd и Mylog.bat).

При использовании нескольких фильтров в одной команде рекомендуется разделять их с помощью знака канала |.

Фильтры

Фильтры представляют собой стандартные команды Linux, которые могут быть использованы без каналов:

  • find — возвращает файлы с именами, которые соответствуют передаваемому аргументу.
  • grep — возвращает только строки, содержащие (или не содержащие) заданное регулярное выражение.
  • tee — перенаправляет стандартный ввод как стандартный вывод и один или несколько файлов.
  • tr — находит и заменяет одну строку другой.
  • wc — подсчитывает символы, линии и слова.

Как правило, все нижеприведенные команды работают как фильтры, если у них нет аргументов (опции могут быть):

  • cat — считывает данные со стандартного потока ввода и передает их на стандартный поток вывода. Без опций работает как простой повторитель. С опциями может фильтровать пустые строки, нумеровать строки и делать другую подобную работу.
  • head — показывает первые 10 строк (или другое заданное количество), считанных со стандартного потока ввода.
  • tail — показывает последние 10 строк (или другое заданное количество), считанные со стандартного потока ввода. Важный частный случай tail -f, который в режиме слежения показывает концовку файла. Это используется, в частности, для просмотра файлов журнальных сообщений.
  • cut — вырезает столбец (по символам или полям) из потока ввода и передает на поток вывода. В качестве разделителей полей могут использоваться любые символы.
  • sort — сортирует данные в соответствии с какими-либо критериями, например, арифметически по второму столбцу.
  • uniq — удаляет повторяющиеся строки. Или (с ключом -с) не просто удалить, а написать сколько таких строк было. Учитываются только подряд идущие одинаковые строки, поэтому часто данные сортируются перед тем как отправить их на вход программе.
  • bc — вычисляет каждую отдельную строку потока и записывает вместо нее результат вычисления.
  • hexdump — показывает шестнадцатеричное представление данных, поступающих на стандартный поток ввода.
  • strings — выделяет и показывает в стандартном потоке (или файле) то, что напоминает строки. Всё что не похоже на строковые последовательности, игнорируется. Команда полезна в сочетании с grep для поиска интересующих строковых последовательностей в бинарных файлах.
  • sed — обрабатывает текст в соответствии с заданным скриптом. Наиболее часто используется для замены текста в потоке: sed s/было/стало/g.
  • awk — обрабатывает текст в соответствии с заданным скриптом. Как правило, используется для обработки текстовых таблиц, например, вывод ps aux и т.д.
  • sh -s — текст, который передается на стандартный поток ввода sh -s. может интерпретироваться как последовательность команд shell. На выход передается результат их исполнения.
  • ssh — средство удаленного доступа ssh, может работать как фильтр, который подхватывает данные, переданные ему на стандартный поток ввода, затем передает их на удаленный хост и подает на вход процессу программы, имя которой было передано ему в качестве аргумента. Результат выполнения программы (то есть то, что она выдала на стандартный поток вывода) передается со стандартного вывода ssh.

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

Пример

Команда tee, как правило, используется для просмотра выводимого содержимого при одновременном сохранении его в файл.

wc ~/stream | tee file2

Пример

Допускается перенаправление нескольких потоков в один файл:

ls -z >> file3 2>&1

В результате сообщение о неверной опции «z» в команде ls будет записано в файл t2, поскольку stderr перенаправлен в файл.

Для просмотра содержимого файла file3 введите команду cat:

cat file3

В результате на дисплее терминала отобразиться следующее:

ls: invalid option -- 'z'
Try 'ls --help' for more information.

Заключение

Мы рассмотрели возможности работы с перенаправлениями потоков >>> и |, использование которых позволяет лучше работать с bash-скриптами.

Я запускаю несколько скриптов с командами, имеющими конвейер cat с grep, например:

cat file.txt | grep "pattern"

В большинстве случаев проблем нет. Но иногда я получаю ошибку ниже:

кот: ошибка записи: Сломанная труба

Итак, как мне узнать, когда команда вызывает эту проблему и почему?

person
Vishal-Lia
  
schedule
05.04.2018
  
source
источник


Ответы (2)

Причина в том, что канал закрывается grep, когда у него еще есть данные для чтения из cat. Сигнал SIGPIPE ловится котом и выходит.

Что обычно происходит в конвейере, так это то, что оболочка запускает cat в одном процессе и grep в другом. Стандартный вывод cat подключен к концу записи канала, а стандартный ввод grep к концу чтения. Что произошло, так это то, что grep наткнулся на несуществующий поиск по шаблону и немедленно вышел, в результате чего конец канала для чтения был закрыт, что cat не нравится, поскольку у него есть еще данные для записи в канал. Поскольку действия записи происходят с другим, который был закрыт на другом конце, SIGPIPE перехватывается cat, на котором он немедленно выходит.

Для такого тривиального случая вы можете полностью отказаться от использования конвейера и запустить его как grep "pattern" file.txt, когда содержимое файла станет доступным через стандартный ввод grep, из которого он может читать.

person
Inian
  
schedule
05.04.2018

Вы можете использовать только grep без трубы следующим образом:

grep "pattern" file.txt

Я думаю, что лучше решить эту проблему

person
ramzieus
  
schedule
09.09.2019

I have a script where I recursively copy the contents of the files in a folder using cat command as follows

test -f /tmp/$F || cat $F > /tmp/$F

I get the following error

cat: read error: Invalid argument

I want to know how can I suppress this error. I only have access to shell interpreter (no bash).

Thanks

Gilles Quénot's user avatar

Gilles Quénot

175k41 gold badges226 silver badges226 bronze badges

asked Nov 27, 2014 at 21:34

user27396's user avatar

2

Send error messages to /dev/null.

cat $F 1>/tmp/$F 2>/dev/null

answered Feb 6, 2017 at 1:58

Bart Louwers's user avatar

Модераторы: Warderer, Модераторы разделов

Аватара пользователя

Bish

Сообщения: 291

Решено: не работает команда cat

Может быть я что-то не так делаю, читаю Пецке «Linux от понимания к применению» урок по командам echo и cat.
Пишу хоть так:
cat пример (или)
cat > пример «смотрим» — в обоих случаях текст сразу же выводится на экран. Хотя текст заключен в кавычки.
А вот с командой echo все в порядке. В чем косяк?

Аватара пользователя

Bizdelnick

Модератор
Сообщения: 20461
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: не работает команда cat

Сообщение

Bizdelnick »

Вы хотите записать текст в файл? Тогда надо так:

$

$ cat > file
текст
здесь
^D

Пишите правильно:

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

Аватара пользователя

drBatty

Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит…
ОС: Slackware-current
Контактная информация:

Re: Решено: не работает команда cat

Сообщение

drBatty »

Bish писал(а): ↑

17.06.2013 21:23

Хотя текст заключен в кавычки

а в bash обычный текст воспринимается одинаково, что так, что «так», и ‘так’. Кавычки только на спецсиволы действуют.

Аватара пользователя

Bish

Сообщения: 291

Re: Решено: не работает команда cat

Сообщение

Bish »

Наверное нет, делаю все по книге. А вот, что получилось:

Код:

aniro@debian:~$ cat > проверка <<
bash: syntax error near unexpected token `newline'
aniro@debian:~$ su
Пароль:
root@debian:/home/aniro# cat > проверка <<
bash: syntax error near unexpected token `newline'
root@debian:/home/aniro#

Аватара пользователя

drBatty

Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит…
ОС: Slackware-current
Контактная информация:

Re: Решено: не работает команда cat

Сообщение

drBatty »

Bizdelnick
вам не кажется, что вы тут три сущности в одой команде замешали?

ТС спрашивал про cat? Или про перенаправление? Или про встроенные документы?

Давайте определимся, какую главу и какой книжки мы изучаем?

Аватара пользователя

Bish

Сообщения: 291

Re: Решено: не работает команда cat

Сообщение

Bish »

Bizdelnick так проходит, странно, почему в книге об этом не сказано? :) там то по другому.
drBatty книга называется Пецке «Linux от понимания к применению» стр 95 Перенаправление вывода.
Вот пример с командой echo

Код:

aniro@debian:~$ echo >тыц "проверка записи в файл"
aniro@debian:~$ cat тыц
проверка записи в файл
aniro@debian:~$

Такой же пример дан и с командой cat но тут косяк выходит, перенаправление вывода не работает а текст сразу же появляется в окне терминала.

Аватара пользователя

drBatty

Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит…
ОС: Slackware-current
Контактная информация:

Re: Решено: не работает команда cat

Сообщение

drBatty »

Bish писал(а): ↑

17.06.2013 21:56

$ su

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

Bish писал(а): ↑

17.06.2013 22:05

почему в книге об этом не сказано

потому-что << в данном случае — встроенный документ bash.

Bish писал(а): ↑

17.06.2013 22:05

Перенаправление вывода.

а… тогда рекламная пауза: http://emulek.blogspot.ru/2013/04/cat.html

Аватара пользователя

Bish

Сообщения: 291

Re: Решено: не работает команда cat

Сообщение

Bish »

результат от удара головой в закрытую дверь, совершенно не зависит от того, есть у вас ключи в кармане, или их нет. очень хорошо сказано, я всегда замечал что продвинутые Гуру выражаются простым языком. ;)
drBatty ничего я не понял в Вашем ответе. SU я понимаю, от рута или бакса вводить команды, да не в этом дело то. скажите в двух словах — в чем косяк? почему не проходит команда, которую я читаю по книге?

Аватара пользователя

Bizdelnick

Модератор
Сообщения: 20461
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: не работает команда cat

Сообщение

Bizdelnick »

Bish писал(а): ↑

17.06.2013 22:15

почему не проходит команда, которую я читаю по книге?

Вероятно, потому что книге слишком много лет. Команда с echo хоть и рабочая, но тоже нетривиальная. Обычно пишут echo «some text» > file.
А может быть, Вы неправильно поняли, что должно происходить. Ваша команда должна скопировать содержимое файла «смотрим» в файл «пример». Хотя, опять-таки, более общепринятая и легкочитаемая форма записи — cat смотрим > пример.

Пишите правильно:

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик

Аватара пользователя

Bish

Сообщения: 291

Re: Решено: не работает команда cat

Сообщение

Bish »

Да, наверное Вы правы, книга старенькая. Ладно пойду читать дальше :)
Может скинуть книгу в PDF сами посмотрите? стр.97
http://zalil.ru/34588467

Да нет, вроде все ok, попробовал с переносом:

Код:

aniro@debian:~$ cat > тыц
"проверка слов на ошибки"
aniro@debian:~$ cat тыц
"проверка слов на ошибки"
aniro@debian:~$

Тему можно закрыть.

Я пытаюсь использовать VS1053, аудиодекодер, в Linux 4.14 для воспроизведения музыки. Это устройство обменивается данными через шину SPI, и я разработал драйвер и зарегистрировал VS1053 как символьное устройство, спасибо за https://github.com/rvp-nl/vs10xx-linux. Вот и проблема.

Способ воспроизведения музыки:

cat musicfile.mp3 > /dev/VS1053_device

Когда закидываю на устройство музыкальный файл WAV, все ок, и музыка играет хорошо. Однако, когда я закидываю на устройство музыкальный файл в формате mp3, Linux выдает ошибку

cat: ошибка записи: на устройстве не осталось места

Я искал причину на многих сайтах. Многие говорили: проверьте свободное место и свободный индекс в файловой системе, но вот мой результат:

root@s32v234sbc:~# df -i                                                        
Filesystem     Inodes IUsed  IFree IUse% Mounted on                             
/dev/root      956592 10795 945797    2% /                                      
devtmpfs       234285   308 233977    1% /dev                                   
tmpfs          234333   205 234128    1% /run                                   
tmpfs          234333    10 234323    1% /var/volatile                          
root@s32v234sbc:~# df -h                                                        
Filesystem      Size  Used Avail Use% Mounted on                                
/dev/root        15G  412M   14G   3% /                                         
devtmpfs        916M     0  916M   0% /dev                                      
tmpfs           916M   84K  916M   1% /run                                      
tmpfs           916M   28K  916M   1% /var/volatile                             
root@s32v234sbc:~# 

Размер музыкального файла ограничен 100 МБ, пространство не может быть использовано.

Я попытался написать программу для печати файлов, заменяющую «кот», но это тоже не сработало. Понятия не имею, почему и как произошла эта ошибка.

Я очень благодарен, если кто-нибудь мог мне помочь в этом!!!

Понравилась статья? Поделить с друзьями:
  • Cas cl5000j ошибка ацп
  • Case 695st ошибка 4039
  • Cbs logs log ошибка windows 10 c windows
  • Cat ошибка 261 13
  • Cas ci 5010a ch02 ошибка