Bash как получить вывод команды

Содержание
  1. Сценарии Bash, часть 4: ввод и вывод
  2. Стандартные файловые дескрипторы
  3. СТАНДАРТ
  4. STDOUT
  5. STDERR
  6. ▍Перенаправить поток ошибок
  7. ▍Ошибка перенаправления и выходных потоков
  8. Перенаправление вывода в скриптах
  9. ▍Временное перенаправление вывода
  10. ▍Постоянное перенаправление вывода
  11. Перенаправление ввода в сценариях
  12. Создайте собственное перенаправление вывода
  13. Создание файловых дескрипторов для ввода данных
  14. Закрыть файловые дескрипторы
  15. Получение информации об открытых дескрипторах
  16. Подавить вывод
  17. Результаты
  18. Памятка по основным командам Bash
  19. Основное
  20. Справка
  21. Транспортир
  22. Фильтр output
  23. Очистка экрана
  24. Система
  25. Информация о системе
  26. Работа с процессами
  27. Сменить пользователя
  28. Копировать и вставлять в буфер обмена
  29. Переменные и путь
  30. Файлы и каталоги
  31. Изменить текущий каталог
  32. Содержимое каталога
  33. Загрузка файла из Интернета
  34. Создайте каталог
  35. Скопируйте, перемещение и удаление
  36. Права доступа и владельцы
  37. Поиск файлов
  38. Расчет контрольной суммы SHA256 файла
  39. Сжатие и распаковка файлов TAR/ZIP
  40. Свободное место на диске
  41. Просмотр содержимого файла

Сценарии Bash, часть 4: ввод и вывод

В прошлый раз в части 3 этой серии сценариев bash мы говорили об опциях и параметрах командной строки. Наша сегодняшняя тема — ввод, вывод и все, что с этим связано.

Вы уже знакомы с двумя способами обработки вывод сценария командной строки:

  • Отображает выходные данные на экране.
  • Перенаправить вывод в файл.

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

Стандартные файловые дескрипторы

Все в Linux является файлом, включая ввод и вывод. Операционная система идентифицирует файлы по идентификаторам.

Каждому процессу разрешено использовать до девяти дескрипторов открытых файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот их значение.

  • 0, STDIN является стандартным вводом.
  • 1, STDOUT: стандартный выходной ток.
  • 2, STDERR является стандартной ошибкой.

Эти три специальных идентификатора обрабатывают ввод и вывод данных в сценарии.
Вы должны правильно понимать стандартные последовательности. Их можно сравнить с базой, на которой скрипты взаимодействуют с внешним миром. Рассмотрим их подробнее.

СТАНДАРТ

STDIN — это стандартный поток ввода оболочки. Это стандартный ввод для терминала клавиатура. Когда сценарии используют символ — для перенаправления ввода, Linux заменяет стандартный дескриптор входного файла тем, который указан в команде. Система загружает файл и обрабатывает данные, как если бы они были введены с клавиатуры.

Многие команды bash принимают ввод из стандартного ввода, если в командной строке не указан файл для ввода. Например, так обстоит дело с командой cat.

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

STDOUT

STDOUT — это стандартный поток вывода оболочки. По умолчанию это экран. Большинство команд bash отправляются в STDOUT, что приводит к их отображению на консоли. Данные можно перенаправить в файл, добавив их к его содержимому с помощью >> .

Итак, у нас есть файл данных, в который мы можем добавить больше данных с помощью этой команды:

Любой вывод из pwd будет добавлен в myfile, и данные останутся там.

Перенаправить вывод команды в файл

Пока все хорошо, но что, если вы попытаетесь сделать что-то вроде следующего с файлом x, который не существует, потому что вы думаете все дело в том, чтобы поместить сообщение об ошибке в myfile?

Сообщения об ошибках появятся на экране после выполнения этих команд.

Он попытался получить доступ к несуществующему файлу

Попытка доступа к несуществующему файлу файла приводит к ошибке, но оболочка не перенаправляет сообщения об ошибках в файл, выводя их на экран. Но мы хотели, чтобы сообщения об ошибках попадали в файл. Делать? Ответ прост: используйте третий стандартный дескриптор.

STDERR

STDERR — это стандартный поток ошибок оболочки. По умолчанию этот обработчик указывает на то же самое, на что указывает STDOUT, поэтому при возникновении ошибки на экране отображается сообщение.

Допустим, мы хотим перенаправить сообщения об ошибках, скажем, в файл журнала. или что-то вместо этого, чтобы они отображались на экране.

Читайте также:  Sea battle 2 как получить алмазы

▍Перенаправить поток ошибок

Как вы знаете, файловый дескриптор STDERR равен 2. Мы можем перенаправить ошибки, поставив этот дескриптор перед команда перенаправления:

Сообщение об ошибке теперь отправляется в мой файл.

Сообщение об ошибке перенаправления файла

▍Ошибка перенаправления и выходных потоков

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

Ошибки перенаправления и стандартный вывод

Оболочка перенаправляет то, что команда ls обычно отправляет в STDOUT, правильный файл содержимого благодаря 1> . Сообщения об ошибках, которые отправляются в STDERR, попадают в файл содержимого ошибок из-за команды перенаправления 2>. .

При необходимости STDERR и STDOUT можно перенаправить в один и тот же файл с помощью &> :

Перенаправить STDERR и STDOUT на того же файла

После выполнения команды то, что предназначено для STDERR и STDOUT, находится в файле содержимого.

Перенаправление вывода в скриптах

Есть два способа перенаправления вывода в сценариях командной строки:

  • временное перенаправление или однострочное перенаправление вывода.
  • Постоянно перенаправлять или перенаправлять весь или часть вывода в сценарии.

▍Временное перенаправление вывода

Вы можете перенаправить одну строку вывода в STDERR в сценарии. Для этого просто используйте команду перенаправления, указав дескриптор STDERR с амперсандом (&) перед номером дескриптора:

Если вы запустите скрипт, он отобразит обе строки, потому что, как вы знаете, форма отображает ошибки по умолчанию в том же месте, что и обычные данные.

Запустите скрипт, чтобы вывод STDERR перешел в файл.

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

Сообщения об ошибках записываются в файл

▍Постоянное перенаправление вывода

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

Перенаправить весь вывод в файл

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

Команду exec можно использовать не только в начале скрипта, но и в другом месте:

Это происходит после того, как мы запустите скрипт и посмотрите файлы, в которые мы перенаправили вывод.

Перенаправление вывода в другие файлы

Сначала команда exec перенаправляет вывод STDERR в файл myerror . Вывод различных эхо-команд затем отправляется на STDOUT и выводится на экран. Затем команда exec отправляет то, что идет в STDOUT, в myfile, и, наконец, мы используем перенаправление на команду echo STDERR в команде, что приводит к записи соответствующей строки в файл myerror.

Как только вы закончите на него можно выводить редирект куда угодно. Теперь давайте поговорим о перенаправлении ввода.

Перенаправление ввода в сценариях

Вы можете использовать ту же технику для перенаправления ввода, которую мы использовали для перенаправления производства. Например, команда exec позволяет вам создать источник данных для STDIN из некоторого файла:

Эта команда сообщает оболочке, что входными данными должен быть файл myfile, а не только STDIN. Давайте посмотрим на перенаправление ввода в действии:

Это появится на экране после запуска скрипта.

В предыдущем посте вы узнали, как использовать команду чтения для чтения пользовательского ввода. с клавиатуры. Если вы перенаправляете ввод в файл в качестве источника данных, команда чтения, когда она пытается прочитать данные из STDIN, читает их из файла, а не с клавиатуры.

Некоторые администраторы Linux используют этот подход для чтения а потом обрабатывать файлы журналов.

Создайте собственное перенаправление вывода

Вы не ограничены тремя стандартными файловыми дескрипторами при перенаправлении ввода и вывода в сценариях. Как упоминалось ранее, у вас может быть открыто до девяти ручек. Остальные шесть, пронумерованные от 3 до 8, могут использоваться для перенаправления ввода или вывода. Любой из них можно присвоить файлу и использовать в коде

Вы можете присвоить идентификатор выходным данным с помощью команды exec:

Читайте также:  Как можно открыть энергетические каналы

После выполнения скрипта часть вывод перемещается на экран и частично в файл дескриптора 3 .

Перенаправление вывода с помощью пользовательского обработчика

Создание файловых дескрипторов для ввода данных

Вы можете перенаправить ввод в скрипт так же, как вы можете перенаправить вывод. Прежде чем перенаправить ввод, сохраните STDIN под другим идентификатором.

После того, как вы закончите чтение файла, вы можете восстановить STDIN и использовать его как обычно:

В этом примере файловый дескриптор 6 использовался для сохранить ссылку на STDIN. После выполнения перенаправления ввода файл стал источником данных для STDIN. Входные данные для команды чтения поступили из перенаправленного STDIN, то есть из файла.

После чтения файла мы сбрасываем STDIN в исходное состояние, перенаправляя на дескриптор 6. Теперь проверяем, что все работает правильно, сценарий задает пользователю вопрос, ожидая ввода с клавиатуры и обрабатывая введенный текст

Закрыть файловые дескрипторы

Оболочка автоматически закрывает файловые дескрипторы после завершения сценария. В некоторых случаях это однако вы должны вручную закрыть дескрипторы до завершения сценария. Чтобы закрыть дескриптор, вам нужно перенаправить на &- . я знаю, что это выглядит так:

После запуска скрипта появляется сообщение об ошибке.

Попытка доступа к закрытому дескриптору файла

Это потому, что мы пытаемся получить доступ к несуществующему дескриптору.

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

Получение информации об открытых дескрипторах

Чтобы получить список всех открытых дескрипторов в Linux, вы можете использовать команду lsof. Многие дистрибутивы, такие как Fedora, имеют утилиту lsof в /usr/sbin. Эта команда очень полезна, так как она выводит информацию о каждом драйвере, открытом в системе. Это включает в себя то, что открывается фоновыми процессами, и то, что открывается вошедшими в систему пользователями.

У этой команды много ключей, давайте рассмотрим самые важные.

  • — p Le you позволяет вам ввести идентификатор процесса.
  • -d Позволяет указать номер дескриптора, о котором вы хотите получить информацию.

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

Ключ -a используется для выполнить логическую операцию И над возвращенными результатами, используя два других модификатора:

Вывести информацию о открытые дескрипторы

Тип файлов, связанных с STDIN, STDOUT и STDERR, — CHR (символьный режим). Поскольку все они указывают на один терминал, имя файла соответствует имени устройства, присвоенному терминалу. Три стандартных файла доступны как для чтения, так и для записи.

Давайте посмотрим, как вызвать команду lsof из сценария с открытыми нестандартными дескрипторами:

Вот что происходит, когда вы запускаете этот скрипт.

Показать файловые дескрипторы, открытые скриптом

Открыть скрипт с двумя выходными дескрипторами (3 и 6) и одним входным дескриптором (7). Здесь также перечислены пути к файлам, используемым для настройки дескрипторов.

Подавить вывод

Иногда необходимо убедиться, что команды в сценарии, который может выполняться как фоновый процесс, например, ничего не отображать на экране. Для этого вы можете перенаправить вывод на /dev/null. Это что-то вроде «черной дыры».

Вот, например, как подавить сообщения об ошибках:

Тот же подход используется, если, например, вам нужно удалить файл без удаления:

Результаты

Сегодня вы узнали, как работает ввод и вывод в сценариях командной строки. Теперь вы знаете, как обращаться с файловыми дескрипторами, как их создавать, просматривать и закрывать, вы знаете о вводе, выводе и перенаправлении ошибок. Все это очень важно при разработке сценариев bash.

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

Уважаемые читатели! В этой статье описаны основы работы с потоками ввода, вывода и ошибок. Мы уверены, что среди вас есть профессионалы, которые расскажут вам все это, что приходит только с опытом. Если это так, мы сообщим об этом.

Источник

Памятка по основным командам Bash

Независимо от того, являетесь ли вы разработчиком программного обеспечения, специалистом по данным, менеджером ИТ-инфраструктуры или просто любителем компьютеров, вам необходимо знать, как использовать Терминал в Linux и macOS. Но сложность в том, что нужно запомнить слишком много команд. А если у вас не чудесная память, то время от времени приходится искать ту или иную команду в интернете.

Читайте также:  5 байтов как получить бит

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

Основное

Справка

Забыли аргументы для cp? Что такое опция для команды mkdir? Вот вам подсказка:

Транспортир

Часто используется для перенаправления вывода одной команды на ввод другой или для присвоения команды файлу:

Фильтр output

Бывает, что команда выдается слишком долго. В этом случае вы разбиваете страницу на плюс или меньше или печатаете строки, содержащие специальное слово или фразу с помощью grep :

Очистка экрана

Слишком много текста в терминале? Просто введите и продолжайте работать.

Система

Информация о системе

Вы можете легко получить все сведения о своем компьютере с помощью следующих команд:

Работа с процессами

Следующие команды предоставляют обзор всех процессов, запущенных в система. В macOS и некоторых дистрибутивах Linux htop не установлен, поэтому перед использованием его необходимо установить с помощью стандартного менеджера пакетов (для macOS — Homebrew):

Сменить пользователя

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

Копировать и вставлять в буфер обмена

Вы можете копировать и вставьте текст из/в терминал с помощью , выделив их и нажав Ctrl + C или Ctrl + V. Однако иногда требуется прямой доступ к буферу обмена. И, как вы можете видеть ниже, это не так просто в Linux или macOS.

Переменные и путь

Есть два способа определить переменные внутри оболочки: в режиме реального времени, введя соответствующую команду в терминале или определив их в файле .bashrc в вашем домашнем каталоге, где они будут храниться вечно.

Еще один замечательный инструмент — псевдоним, ярлык для длинных команд. Давайте посмотрим, как это устроено:

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

Файлы и каталоги

Изменить текущий каталог

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

Содержимое каталога

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

Загрузка файла из Интернета

Самый простой способ загрузить файл с веб-серверов с помощью команды wget.

Создайте каталог

Если вы хотите создать папку, используйте команду mkdir.

Скопируйте, перемещение и удаление

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

Права доступа и владельцы

Права доступа и владельца файла или каталога можно изменить с помощью команд chmod и chown.

Поиск файлов

Забыли, где находится файл contact.json? Хотите просмотреть все файлы PDF в папке? Вы можете сделать это и многое другое с помощью команды find.

Расчет контрольной суммы SHA256 файла

При загрузке любой программы из Интернета рекомендуется проверить контрольную сумму SHA, чтобы убедиться, что все скачался правильно. И гораздо проще сделать это через терминал:

Сжатие и распаковка файлов TAR/ZIP

Неважно, есть ли у вас файл TAR или ZIP, вы можете распаковать его с помощью терминал или создайте одну из существующих папок:

Свободное место на диске

Хотите узнать, сколько свободного места на вашем жестком диске? Или снаружи? Или в текущем каталоге? Команда df помогает решить эти проблемы.

.

Просмотр содержимого файла

Через терминал можно не только просматривать содержимое файла, но и выполнять анализ, такой как сортировка и изменение порядка строк по содержимому, подсчет количества строк, слов, символов и выделение столбцов, если это табличный файл. Давайте посмотрим на них в действии:

Источник

Поделиться с друзьями
Решатор