Команда eval в Bash и ее типичное использование

Written on 19 Декабря 2008. Posted in Linux

Введение

BASH — Bourne-Again SHell (что может переводится как "перерожденный шел", или "Снова шел Борна(создатель sh)"), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов.

break выход из цикла for, while или untilcontinue выполнение следующей итерации цикла for, while или untilecho вывод аргументов, разделенных пробелами, на стандартное устройство выводаexit выход из оболочкиexport отмечает аргументы как переменные для передачи в дочерние процессы в средеhash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращенииkill посылает сигнал завершения процессуpwd выводит текущий рабочий каталогread читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\return заставляет функцию оболочки выйти с указанным значениемshift перемещает позиционные параметры налевоtest вычисляет условное выражениеtimes выводит имя пользователя и системное время, использованное оболочкой и ее потомкамиtrap указывает команды, которые должны выполняться при получении оболочкой сигналаunset вызывает уничтожение переменных оболочкиwait ждет выхода из дочернего процесса и сообщает выходное состояние.И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе

Читайте также:  Как запретить пользователям ssh выполнять команды Linux

Архивация в несколько потоков

Понадобилось по работе делать снапшоты несколько-GB-тных логов и нетлистов прогонов синтеза под ПЛИС, есть несоклько архиваторов использующих многопоточность/многоядерность, попробовал pbzip2, установим:

1 sudo yum install y pbzip2.x86_64

Сама строка из мейкфайла:

1 tar cpS syn/out/* syn/log/*.rpt $(LOG) | pbzip2 7 compress force read m2000 p16 > ~/work/$(shell date +%Y%m%d%H%M%S)$(FPGA_TARGET)$(shell git revparse abbrevref HEAD).tar.bz2

тут делаем tar’ом из нескольких файлов один и передаем в pbzip2, конечный файл называем текущей датой, именем проекта и текущей веткой гита, подробнее про опции pbzip2:

  • 7 — степень компрессии 1..9(лучше,медленне),  по факту — размер блока 7 = 700 КБ
  • force — перезаписать если файл уже существует
  • read — означает зачитать входной файл в ОЗУ и там разбить по процессорам
  • m2000 — сколько оперативки в МБ использовать. 2ГБ — это практический максимум
  • p16 — принудительное задание сколько ядер юзать

Команды в Git Bash консоли

clear — Очистить консоль

pwd — Показать текущий каталог ls — Показать файлы в данной папке, кроме скрытых ls -f — Показать файлы в данной папке, включая и скрытые cd c:/ — Перейти в конкретный каталог cd — — Вернуться назад cd .. — Выйти на 1 уровень вверх cd ../.. — Выйти на 2 уровня вверх

Создание каталогов

mkdir — Создать папку cd !$ — Перейти в только что созданную папку mkdir -p {app1,app2} — Создать сразу несколько папок mkdir -p app/{css,js} — Создать сразу несколько вложенных папок

Создание файлов

touch — Создать файл touch app/{css/,js/,} — Создать сразу несколько файлов, никаких лишних пробелов быть не должно

Удаление файлов

touch — позволяет создавать файлы rm test — Удалить пустую папку test rm -r test — Удалить папку test с файлами внутри неё

Перемещение файлов

mv app1/*.* app2 — Переместить все файлы из папки app1 в папку app2

eval перед “нормальным” кодом является NOP

$ eval a=b $ eval echo $a b

В приведенном выше примере первые утверждения eval не имеют никакой цели и могут быть устранены. eval бессмысленна в первой строке, потому что нет никакого динамического аспекта для кода, т.е. он уже разбирается в конечных строках кода bash, поэтому он будет идентичен нормальному выражению кода в сценарии bash. Второй eval тоже бессмыслен, потому что, хотя есть шаг анализа, переводящий $a в его литерал-эквивалент строки, нет никакой косвенности (например, без ссылки через строковое значение фактического имени bash или bash-проведенной переменной скрипта), поэтому он будет вести себя одинаково как строка кода без префикса eval.

Пример 2:

Переменные и параметры скрипта

Приведу как пример небольшой пример, который мы разберем:

#!/bin/bash #указываем где у нас хранится bash-интерпретатор parametr1=$1 #присваиваем переменной parametr1 значение первого параметра скрипта script_name=$0 #присваиваем переменной script_name значение имени скрипта echo "Вы запустили скрипт с именем $script_name и параметром $parametr1" # команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной. echo ‘Вы запустили скрипт с именем $script_name и параметром $parametr1’ # здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных. exit #Выход с кодом 0 (удачное завершение работы скрипта)

Результат выполнения скрипта:

Читайте также:  Bashhub - открывает доступ к истории терминала из любой точки

[email protected]:~$ ./ qwerty Вы запустили скрипт с именем ./ и параметром qwerty Вы запустили скрипт с именем $script_name и параметром $parametr1

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

$DIRSTACK — содержимое вершины стека каталогов $EDITOR — текстовый редактор по умолчанию $EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как… $UID — реальный идентификатор, который устанавливается только при логине. $FUNCNAME — имя текущей функции в скрипте. $GROUPS — массив групп к которым принадлежит текущий пользователь $HOME — домашний каталог пользователя $HOSTNAME — ваш hostname $HOSTTYPE — архитектура машины. $LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов $OLDPWD — прежний рабочий каталог $OSTYPE — тип ОС $PATH — путь поиска программ $PPID — идентификатор родительского процесса $SECONDS — время работы скрипта(в сек.) $# — общее количество параметров переданных скрипту $* — все аргументы переданыне скрипту(выводятся в строку) [email protected] — тоже самое, что и предыдущий, но параметры выводятся в столбик $! — PID последнего запущенного в фоне процесса $$ — PID самого скрипта