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

Прочитав эту статью, вы узнаете что такое bash (стандартный командный интерпретатор линукс), научитесь обращаться со стандартными командами: ls, cp, mv… поймете назначение инодов, жестких и символических ссылок и многое другое.

Подробный обзор

Основные

Помощь

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

help nano # кратко о команде “nano” man nano # подробная информация о “nano”

Конвейер

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

a | b # конвейер: передать вывод команды a на ввод b a > # сохранить вывод команды a в (перезаписать) a >> # сохранить вывод команды a в (добавить) echo «Hello!» | xargs echo # направить вывод первой команды, как аргумент второй

Фильтрация вывода

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

cat | more # постранично показывает содержимое cat | постранично показывает содержимое , и позволяет перемещаться по файлу cat | grep “I love you” # показывает строчку, где расположена строка “I love you”

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

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

clear # очистка терминала

Что такое bash

Bash расшифровывается как Bourne again shell (что можно перевести как «Еще одна оболочка Борна»), название частично заимствованно от более ранней версии командной оболочки UNIX, которая называлась просто Bourne shell («Оболочка Борна» – по фамилии разработчика Стивена Борна).

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

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

$ eval a=b $ eval echo $a b

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

Пример 2:

Несколько основных команд bash

Рассмотрим наиболее популярные команды:

Команда CD используется для того, чтобы перемещаться между каталогами в системе Линукс. Перемещение в домашний каталог будет выполнено после введения команды:

cd /home/YOUR_USER_NAME или проще: cd ~

Соответственно команда cd позволяет перейти в каталог, который расположен выше.

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

Как это работает?

К примеру, вы хотите получить доступ к каталогу, у которого очень длинное название — freebestwebhosting. Нет потребности полностью вводить название выбранного каталога. Достаточно просто ввести «free», после этого нажать «tab», это позволит интерпретатору самостоятельно дополнить выбранную вами команду.

Команда CAT

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

cat

Команда GREP

Есть потребность в проверке логов доступа на определенный сайт? Тогда команда GREP станет оптимальным вариантом. Как это работает? Вам необходимо проверить, чем занимался на вашем компьютере пользователь с ІР Для этого достаточно просто ввести команду:

cat /var/log/apache2/ | grep

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

Команда TAIL

Одна из наиболее полезных команд в Линуксе. Она позволяет оперативно просматривать изменяемые файлы в реальном времени. Можно получить доступ к необходимым вам логам без особых проблем и временных затрат. Чтобы просмотреть определенный лог в реальном времени, необходимо воспользоваться следующей командой:

tail -f /var/log/apache2/

Команда SSH

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

ssh [email protected] и нажмите enter.

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

SSH имеет свой стандартный порт «22». Сегодня большинство администраторов пытаются надежно защитить свой сервер от посягательств посторонних людей, полностью закрывая доступ к нему через «порт 22». Создается альтернативный порт, позволяющий получать кратковременный доступ. От того, где именно размещен ваш сервер, напрямую зависит то, как будет выглядеть исходная команда. В данном случае, с отказом от стандартного и использованием альтернативного «порта 2213», команда будет выглядеть следующим образом:

ssh [email protected] -p2231

Основные команды

Команда интерпретатора Bash man

Отображает руководства по командам. К примеру, последующая команда выдаст вам все данные о команде cat:

$ man cat

Команда интерпретатора Bash cat

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

Команда интерпретатора Bash echo

Осуществляет вывод своих аргументов по стандартному каналу вывода.

$ echo Hello World Hello World

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

Команда интерпретатора Bash head

Читает лишь первые десять строк любого переданного текста, выводя их по стандартному каналу. Можно изменить количество выводимых строк:

$ head -50

Команда интерпретатора Bash tail

Работает аналогично head, однако читает строки с конца:

Основные команды

$ tail -50

Читайте также:  Основные команды Linux: справочник команд Linux

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

$ tail -f

Команда интерпретатора Bash less

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

$ less $ ps aux | less

Кстати, о символе | мы расскажем ниже в блоке про команду интерпретатора Bash history.

Команды интерпретатора Bash true и false

Первая всегда возвращает ноль в качестве выходного статуса для индикации успеха, вторая, соответственно, не ноль в качестве выходного статуса для индикации неудачи.

$? — это переменная, содержащая выходной статус последней запущенной команды. Выходной статус — код возврата программы. В нашем случае 0 будет означать успешное выполнение программы, а любое значение, которое больше нуля, будет отражать факт возникновения ошибок в процессе выполнения. Кстати, именно по этой причине в интерпретаторе Bash истиной (true) считается 0, а ложью (false) — всё, что не ноль.

$ true $ echo $? $ false $ echo $? 1

Команда интерпретатора Bash grep

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

$ cat user:student password:123 user:teacher password:321 $ grep 'student` user:student password:123

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

Команда интерпретатора Bash sed

Потоковый редактор, который преобразует входные текстовые данные. Используется для замены выражений следующим образом: s/regexp/replacement/g. К примеру, в следующем коде произойдёт замена всех слов «Hello» на «Hi»:

$ cat Hello World $ sed 's/Hello/Hi/g' Hi World

Руководство по sed.

Команда интерпретатора Bash history

Выводит историю командной строки. Часто используется совместно с grep при поиске конкретной команды. В коде ниже будут найдены все команды, которые содержат строку g++:

$ history | grep g++ 155 g++ 159 g++

Кстати, здесь тоже можно увидеть символ | — это конвейер (pipe). С его помощью происходит перенаправление вывода одной команды на вход другой. Так, в вышеописанном примере вся история (в обычном режиме она выводится с помощью history непосредственно в вывод терминала), перенаправляется в grep в качестве входных данных. То есть мы не увидим вывод команды history, зато увидим вывод команды grep.

Команда интерпретатора Bash export

Устанавливает переменные окружения для их передачи дочерним процессам. Допустим, так мы можем передать переменную name, имеющую значение student:

$ export name=student

Команда интерпретатора Bash ps

Выводит данные о запущенных процессах.

Основные команды

$ ps PID TTY TIME CMD 35346 pts/2 00:00:00 bash

В результате выведутся 4 элемента: — PID (ID процесса), — TTY (тип терминала), — TIME (время работы процесса), — CMD (имя команды, запустившей процесс).

Команда интерпретатора Bash awk

Находит и меняет текст в файлах на основании заданного шаблона: awk ‘pattern {action}’

Команда интерпретатора Bash wget

Закачивает файлы из интернета, помещая их в текущий каталог.

$ wget -cs100

Команда интерпретатора Bash nc

Утилита для отладки сети. Вот руководство.

Команда интерпретатора Bash ping

Служит для тестирования сетевого подключения.

$ ping PING (74) 56(84) bytes of data. 64 bytes from (74): icmp_req=1 ttl=57 time=7.82 ms — ping statistics — 1 packets transmitted, 1 received, % packet loss, time 8ms rtt min/avg/max/mdev = 7.794/ ms

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

Статья написана специально для курса по Linux на основании материалов Bash-Cheatsheet.

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

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

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

Читайте также:  Как использовать приложение Blood Oxygen на Apple Watch Series 6

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

[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 самого скрипта

Заключение, несколько советов

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

Двойной символ & (амперсанд)

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

команда1 && команда2 && команда3

Вертикальная черта | (pipe)

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

ps axu | grep имя_процесса

Стрелки вверх и вниз на клавиатуре

Помогают осуществлять навигацию по последним командам. Стрелка вверх — предыдущая выполненная команда, стрелка вниз — следующая.

history — история

Если вы забыли, как вы выполнили действие пять дней назад, а вот оно снова потребовалось, выполните history, и терминал выведет на экран последнюю тысячу команд.

Новая вкладка bash

Не всегда удобно иметь несколько окон. Терминал, как браузер, дает возможность открыть несколько вкладок сочетанием клавиш Ctrl+Shift+T.

Копирование и вставка, прерывание команды

Пробовали ли вы копировать текст и вставлять в терминал? Пробовали Ctrl+C? Ctrl+C прервет выполнение текущей команды, например таблицы процессов, сбросит текст, введенный в строку. Скопировать текст из bash — Ctrl+Shift+C. Вставить текст в bash — Ctrl+Shift+V.

cat > ФАЙЛ <<_EOF_

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

  • > (перенаправление вывода в файл)
  • << (here document, то есть многострочный ввод)

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

cat > ФАЙЛ <<_EOF_ foo bar bar bar foo foo _EOF_

В результате выполнения этого кода, в ФАЙЛ будут записаны строки

foo bar bar bar foo foo

Причём если ФАЙЛ уже существует, то он будет стёрт и заменён указанным содержимым.

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