Linux вывод команды в переменную

Обновлено: 05.07.2024

let это встроенная функция bash, которая позволяет производить базовые арифметические операции.

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

let <арифметическая операция>

Рассмотрим примеры в скрипте let_example.sh

Разберём команды по очереди:

Строка 4 - Это простейшая форма записи без кавычек.

Помните, что если вычисление идёт без кавычек - ставить пробелы нельзя

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

Строка 10 - Увеличиваем значение на 1. Это аналог "a = a + 1".

Строка 16 - В выражение можно включить и другие переменные.

Таблица основных операторов

expr похож на let за исключением того, что вместо сохранения результата в переменную expr по умолчанию печатает ответ.

В отличие от let не нужно заключать выражения с пробелами в кавычки

Нужно ставить пробелы вокруг операторов.

expr item1 operator item2

Рассмотрим простой пример:

expr_example.sh

Разберём этот пример пошагово:

Строка 4 - Это базовый синтаксис. Обратите внимание на пробелы и на отсутствие кавычек.

Строка 6 - Если заключить выражение в кавычки его в таком виде и выведет в терминал.

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

Строка 10 - Некоторые символы нужно экранировать.

Строка 12 - Это деление по модулю. Результатом будет остаток от целочисленного деления двух чисел.

Строка 14 - Пример выполнения command substitution чтобы сохранить результат в переменную a.

Двойные скобки

Результат выполнения команды можно легко сохранить в переменную.

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

Рассмотрим примеры в скрипте

expansion_example.sh

Разберём этот скрипт:

Строка 4 - Базовый синтаксис. Можно ставить пробелы без использования кавычек.

Строка 7 - Работает и без пробелов.

Строка 19 - Увеличение переменной на 3. Это краткая форма записи b = b + 3.

Строка 19 - В отличие от других способов символ * не нужно экранировать.

Двойные скобки дают довольно много свободы в форматировании кода.

Они доступны в Bash по умолчанию и их эффективность немного выше. Хотя заметить разницу на современных компьютерах будет непросто.

В этой статье вы узнаете как выполнять команды Linux и Windows из кода на Python 3.

Создайте файл subprocess_lesson.py и копируйте туда код из примеров.

Запустить файл можно командой python3 subprocess.py

Простой пример

Пример программы, которая выполняет Linux команду ls

Простой пример Windows

Пример программы, которая выполняет в Windows команду dir

У меня пока что не работает

Bash команда с опциями

Чтобы выполнить Bash команду с опциями, например, ls - la нужно добавить shell = True

У использования shell = True есть одна важная особенность: нужно особенно внимательно следить за безопастностью.

Рекомендуется использовать shell = True только если вы передаёте параметры самостоятельно.

Избежать использования shell = True можно передав команду и параметры списком:

Передать переменную в аргумент команды

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

import subprocess text = "Visit TopBicycle.ru to support my website" subprocess.run([ "echo" , text])

args, returncode, stdout

Разберём subprocess более подробно

Чтобы не выводить результат в терминал а сохранить в переменную, нужно воспользоваться опцией capture_output = True

Если byte вывод вам не нравится его можно декодировать

total 12 drwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 . drwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 .. -rw-rw-r-- 1 andrei andrei 101 Nov 30 18:46 subprocess_lesson.py

Или можно использовать опцию text=True

total 12 drwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 . drwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 .. -rw-rw-r-- 1 andrei andrei 101 Nov 30 18:46 subprocess_lesson.py

Ещё один вариант перенаправления вывода stdout=subprocess.PIPE

total 12 drwxrwxr-x 2 andrei andrei 4096 Nov 30 18:41 . drwxrwxr-x 3 andrei andrei 4096 Nov 30 18:40 .. -rw-rw-r-- 1 andrei andrei 101 Nov 30 18:46 subprocess_lesson.py

Обработка ошибок

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

Обратите внимане, что Python в этом примере не выдаёт никаких ошибок

Чтобы Python информировал об ошибках во внешних командах используйте опцию check = True

Обратите внимане, что теперь Python выдаёт ошибку, а до print(p1.returncode) и print(p1.stderr) дело уже не доходит

Передача аргументов в скрипт

Допустим, нужно вызвать скрипт с несколькими аргументами

Ещё пример: из python скрипта вызвать sed и обрезать число строк, которое сам скрипт получает как аргумент

Эту задачу можно решить на чистом Python решение

Логи с помощью subprocess

Если запускать код в какой-то среде, где лог в файл неудобен а лог с помощью print невозможен, можно использовать echo из bash

import subprocess text = "Andrei Log: robot/src/libraries/TestController.py is running" subprocess.run ([ "echo" , text ])

Сравнить два файла

Если запускать код в какой-то среде, где лог в файл неудобен а лог с помощью print невозможен, можно использовать echo из bash

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

Интерфейс командной строки системы или командная оболочка , используемая в большинстве систем Linux, носит имя bash , которое расшифровывается как Bourne again shell (название "Born again shell" - "возрожденная командная оболочка" было изменено с целью упоминания автора оригинальной командной оболочки sh Стивена Борна). Командная оболочка bash реализует возможности командных оболочек sh (оригинальная командная оболочка Стивена Борна), csh (командная оболочка Билла Джоя с поддержкой сценариев, синтаксис которых основан на синтаксисе языка программирования C), а также ksh (командная оболочка Дэвида Корна).

В данной главе для демонстрации возможностей командной оболочки будет периодически использоваться команда echo . Команда echo является достаточно простой командой: она всего лишь осуществляет вывод переданных ей данных.

Аргументы

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

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

Удаление пробелов

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

Это полностью объясняет эквивалентность следующих четырех команд после их раскрытия средствами командной оболочки .

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

Одинарные кавычки

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

Двойные кавычки

Вы также можете предотвратить удаление пробелов из строки команды, поместив ее в двойные кавычки. Как и в примере выше, команда echo примет только один аргумент .

Позднее при обсуждении переменных в рамках данной книги мы разберемся с важными различиями между одинарными и двойными кавычками.

Команда echo и кавычки

Строки, помещенные в кавычки, могут содержать специальные обозначения символов, идентифицируемые командной echo (в случае использования команды echo -e ). В примере ниже продемонстрирована методика использования обозначения символа \n для вставки символа переноса строки, а также обозначения символа \t для вставки символа табуляции (обычно эквивалентного восьми символам пробела).

Команда echo может генерировать и другие символы помимо символов пробелов, табуляции и переноса строки. Обратитесь к странице руководства для ознакомления со списком допустимых обозначений символов.

Команды

Внешние или встроенные команды?

Не все исполняемые командной оболочкой команды являются внешними ; некоторые из них являются встроенными . Внешние команды реализованы в форме программ, представленных отдельными бинарными файлами, которые размещены в какой-либо директории файловой системы. Многие бинарные фалы, реализующие функции внешних команд, размещаются в директории /bin или /sbin . Встроенные команды являются неотъемлемой частью самого приложения командной оболочки.

Команда type

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

Как вы можете заметить, команда cd является встроенной , а команда cat - внешней .

Также вы можете использовать данную команду для установления того, является ли введенная команда псевдонимом команды .

Исполнение внешних команд

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

Команда which

Команда which осуществляет поиск бинарных файлов в директории, заданной с помощью переменной окружения $PATH (переменные будут рассматриваться позднее). В примере ниже устанавливается, что cd является встроенной командой, а ls , cp , rm , mv , mkdir , pwd и which - внешними командами.

Псевдонимы команд

Создание псевдонима команды

Командная оболочка позволяет вам создавать псевдонимы команд ( aliases ). Псевдонимы команд обычно используются для создания лучше запоминающихся имен для существующих команд или для упрощения передачи параметров команд.

Сокращения команд

Команда создания псевдонима команды ( alias ) также может оказаться полезной в случае необходимости сокращения длины имени существующей команды.

Стандартные параметры команд

Псевдонимы команд могут использоваться для передачи командам стандартных параметров. Например, ниже показана методика передачи параметра -i по умолчанию при вводе команды rm .

В некоторых дистрибутивах используются стандартные псевдонимы команд для защиты пользователей от случайного удаления файлов ('rm -i', 'mv -i', 'cp -i').

Просмотр объявлений псевдонимов команд

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

Команда unalias

Также вы можете прекратить использование псевдонима команды, воспользовавшись командой unalias .

Вывод информации о раскрытии команд командной оболочкой

Вы можете активировать режим вывода информации о раскрытии команд командной оболочкой с помощью команды set -x и остановить вывод этой информации с помощью команды set +x . У вас может возникнуть потребность в использовании данной возможности как при изучении данного курса, так и в случаях, когда возникают сомнения насчет того, как командная оболочка обрабатывает переданную вами команду.

Практическое задание: команды и аргументы

1. Сколько аргументов передается с помощью данной строки команды (не считая самой команды)

2. Является ли команда tac встроенной?

3. Существует ли действующий псевдоним команды rm ?

4. Прочитайте страницу руководства для команды rm и убедитесь в том, что вы поняли предназначение параметра -i этой команды. Создайте и удалите файл для проверки работоспособности параметра -i .

5. Выполните команду: alias rm='rm -i' . Проверьте работоспособность вашего псевдонима команды на тестовом файле. Работает ли он так, как ожидается?

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

7a. Создайте псевдоним команды 'city', позволяющий вывести название вашего города.

7b. Используйте ваш псевдоним команды для того, чтобы убедиться в его работоспособности.

8. Выполните команду set -x для активации режима вывода информации о раскрытии каждой из команд командной оболочкой.

9. Проверьте работоспособность команды set -x , воспользовавшись созданными ранее псевдонимами команд city и rm .

10. Выполните команду set +x для прекращения вывода информации о раскрытии команд командной оболочкой.

11. Удалите созданный ранее псевдоним команды city.

12. В каких директориях расположены бинарные файлы, являющиеся реализациями команд cat и passwd ?

15. Выведите строку "A B C" с двумя пробелами между буквами B и C.

16 (Необязательное задание). Создайте команду (без использования символов пробелов) для формирования следующего вывода: 17. Используйте команду echo для формирования следующего вывода:

Найдите два решения с использованием одинарных кавычек, два решения с использованием двойных кавычек и одно решение без использования кавычек (и поблагодарите Rene и Darioush из компании Google за это дополнение).

18. Используйте одну команду echo для вывода трех слов в трех строках.

Корректная процедура выполнения практического задания: команды и аргументы

1. Сколько аргументов передается с помощью данной строки команды (не считая самой команды)

Ответ: три аргумента

2. Является ли команда tac встроенной?

3. Существует ли действующий псевдоним команды rm ?

4. Прочитайте страницу руководства для команды rm и убедитесь в том, что вы поняли предназначение параметра -i этой команды. Создайте и удалите файл для проверки работоспособности параметра -i .

5. Выполните команду: alias rm='rm -i' . Проверьте работоспособность вашего псевдонима команды на тестовом файле. Работает ли он так, как ожидается?

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

7a. Создайте псевдоним команды 'city', позволяющий вывести название вашего города.

7b. Используйте ваш псевдоним команды для того, чтобы убедиться в его работоспособности.

8. Выполните команду set -x для активации режима вывода информации о раскрытии каждой из команд командной оболочкой.

9. Проверьте работоспособность команды set -x , воспользовавшись созданными ранее псевдонимами команд city и rm .

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

10. Выполните команду set +x для прекращения вывода информации о раскрытии команд командной оболочкой.

11. Удалите созданный ранее псевдоним команды city.

12. В каких директориях расположены бинарные файлы, являющиеся реализациями команд cat и passwd ?

После интерпретации команды echo командной оболочкой будет задействована встроенная реализация команды echo . Ввод команды /bin/echo приведет к исполнению бинарного файла echo , расположенного в директории /bin .

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

(Параметр -n может не работать в командной оболочке Korn shell).

15. Выведите строку "A B C" с двумя пробелами между буквами B и C.

16 (Необязательное задание). Создайте команду (без использования символов пробелов) для формирования следующего вывода: Решение заключается в использовании символов табуляции с помощью специального обозначения \t. 17. Используйте команду echo для формирования следующего вывода:

Найдите два решения с использованием одинарных кавычек, два решения с использованием двойных кавычек и одно решение без использования кавычек (и поблагодарите Rene и Darioush из компании Google за это дополнение).

Если четвёртый символ это - то файл не является исполняемым.

Сделать его исполняемым можно командой

chmod u+x script_1

-rwxrw-r--. 1 andrei andrei 5252 Nov 26 12:29 script_1

Обратите внимание на -rwx теперь четвёртый символ это x

В моей CentOS настроена подсветка исполняемых файлов, поэтому он теперь зелёный

Теперь выполнить скрипт можно командой

Конкретно этот скрипт должен принимать аргументы из командной строки , поэтому мы выполним

word1 добавится в log.txt а word2 нет, потому что word1 это первый аргумент а word2 второй.

Чтобы записывать вообще все аргументы заменим $1 на $*

Добавим в лог время выполнения команд (подробности здесь)

2020-09-20 17:48:27,404 one two three

Как вызвать скрипт из другого скрипта

Допустим из скрипта parent.sh вам нужно вызвать скрипт child.sh

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

Как назвать скрипт

Проверить не занято ли имя системой можно командой type.

Например, вы решили назвать свой скрипт test

test is a shell builtin

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

Вывод команды в переменную

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

Чтобы сделать это воспользуйтесь синтаксисом

Например, вам нужно проанализировать лог на количество ошибок и предупреждений

wc это команда, которая подсчитывает число слов

Аргументы из командной строки

Скрипт может принимать аргументы из командной строки

Первый аргумент обозначается как $1 второй как $2 и так далее

Рассмотрим пример ar.sh

Этот скрипт ждёт один внешний аргумент и присваивает его значение переменной AR

Затем это же значение выводится три раза

В C аналогичную функцию выполняет int argc, char* argv[]

Цикл for

В самом привычном виде цикл for можно записать так

Объединить строки

Конкатенация строк может быть сделана следующим образом

Функции

Чтобы не писать длинные команды вручную можно объединить их в функции.

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

Перезайдите в терминал.

Теперь, чтобы поменять экраны местами достаточно выполнить

Ещё один пример - функция внутри обычного скрипта, она может принимать аргументы, но пока что просто возвращает hi

Читайте также: