Командная​ ​строка​ ​Ubuntu: ​команды​ ​bash

Оригинал: Working with Command Arguments by Dave Taylor

ответа

Используйте source или . для загрузки в файл.

source /path/to/file

или

. /path/to/file

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

3 ответ дан muru 23 May 2018 в 13:00 поделиться

Я использую этот …

#!/bin/bash CFG_FILE=/etc/ CFG_CONTENT=$(cat $CFG_FILE | sed -r ‘/[^=]+=[^=]+/!d’ | sed -r ‘s/\s+=\s/=/g’) eval «$CFG_CONTENT»

Файл Conf разбирается с sed, а затем оценивается как простые переменные asignments

Первые значения ключа синтаксического анализа (также поддерживает = окруженный пробелами)

Второй sed удаляет пробелы вокруг знака = для допустимого значения переменной

Может быть добавлено лечение Futher sed

Все остальные, не соответствующие тексту в файле conf будут удалены (включая # или; комментарий и другие)

Имейте в виду, что команды одиночной строки можно также оценить из этого конфигурационного файла!

0 ответ дан smARTin 23 May 2018 в 13:00 поделиться

  • 1 Бесполезное использование cat . Почему вы дважды вызываете sed дважды? Вы можете сгруппировать команды sed следующим образом: sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' David Foerster 24 February 2017 в 19:16
  • 2 Кроме того, эта команда sed будет генерировать пустой вывод для записей файла конфигурации образца в вопросе. -1 David Foerster 24 February 2017 в 19:18
  • 3 Еще одно возможное улучшение: используйте команду . и перенаправление процесса вместо временных переменных, чтобы удерживать вывод подпроцесса: . <(sed … "$CFG_FILE") David Foerster 24 February 2017 в 19:32
  • 4 Конечно, в моем примере используется ключ = значение, например, файл конфигурации. Лучше практика, чем «ключевое значение». Используя ключ = значение мой пример работает. Я признаю, что цепочки команд sed лучше, но команда source ожидает файл, поэтому мы можем использовать: eval $(sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' "$CFG_FILE"), что лучше понять, что происходит. smARTin 27 February 2017 в 18:40
  • 5 Да, . ожидает, что подстановка файла и процесса будет расширена до файла. . <(echo echo foo) работает так же, как ожидалось в Bash В небольших примерах это, вероятно, не имеет значения. Однако я бы предпочел не передавать несколько килобайт через подстановку команд. David Foerster 27 February 2017 в 19:00

[F1] 0 ответ дан Drakonoved 23 May 2018 в 13:00 поделиться

Обработка нескольких аргументов командной строки в shell-скрипте

Для наглядности представим, что существует простой скрипт. Он работает в качестве обёртки к чему-то на подобии curl: если передать в него ссылку, то содержимое web-страницы будет скачано и сохранено в файле на локальном диске. К тому же, с помощью воображаемого флага -a можно увидеть ход работы.

Команда для выполнения сценария в bash будет выглядеть следующим образом:

-a

Аргументы командной строки инициализируются в том же порядке: $0 = , $1 = -a, $2 = и их общее количество $# = 2.

Стоит помнить, что $# – количество всех аргументов, а не сумма слов в команде. Можно подумать, что если скрипт вызывается без каких-либо параметров, то $# должно равняться 1 (учитывая имя сценария), однако на самом деле $#=0.

Читайте также:  Выбираем ОС для майнинга криптовалют на видеокартах

Подобная особенность нумерации существует с зари развития UNIX и известна под названием “проблема нулевого индекса”. Так, в массивах первое значение можно получить по индексу 0 или array[0]. Для многих разработчиков это понятно, для других же – вызывает затруднение. Начинающие программисты могут даже игнорировать нулевой индекс в языке C и начинать использовать ячейки массива с 1, а не 0.

После успешной проверки на наличие флага -a для первого аргумента ($1) следует переместить все значения остальных параметров ($2) на одну позицию влево ($1=$2). Тогда в остальной части программы можно будет считать, что в $1 находится адрес ссылки. Отпадает необходимость избыточных проверок на наличие или отсутствие флага.

Это можно сделать с помощью команды сдвига (shift). В итоге получаем правильный способ обработки одного опционального аргумента командной строки в shell-скрипте:

flag_a=0 if [ "$1" = "-a" ]; then flag_a=1 shift fi url=$1

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

Решить эту задачу можно немного изменив предыдущий пример:

outputspecified=0 if [ "$1" = "-o" ]; then outputspecified=1 outputfilename="$2" shift 2 fi

Таким образом, команда shift принимает одно число. Оно указывает на сколько позиций необходимо сдвинуть значения аргументов командной строки. Это легко продемонстрировать, если вывести их до и после выполнения блока кода с shift 2:

$ sh -o какая-то-ссылка $# = 3 $1 = -o $2 = $3 = какая-то-ссылка —— выполнение команды shift 2 —— $# = 1 $1 = какая-то ссылка $2 = $3 =

Изначально все три аргумента заданы и их количество ($#) равно 3. После выполнения shift 2 все значения сместились на две позиции и их количество также уменьшилось.

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

Linux, bash. Однострочники

Собственно, начало пары.

|, &&, ||

Уже разбирали. Повторяем.

| — перенаправление вывода одной команды на вход другой. Пример:

man bash | less

|| — ленивое логическое «или». Используется для выполнения операции, если предыдущая завершилась с ошибкой:

cd /root || echo Доступ запрещён

&& — ленивое логическое «и». Используется для выполнения операции, если предыдущая завершилась успешно:

cd $HOME && echo Чуи, мы дома!

cat, head, tail, grep

cat — конкатенация содержимого файлов и вывод:

cat ~/.bash* | less

head — вывести начало файла (по умолчанию 10 строк):

head /etc/passwd

tail — вывести конец файла (по умолчанию 10 строк):

tail /var/log/syslog

— полезно для чтения логов — там как раз последнее — самое интересное. Также часто используется:

tail -f /var/log/syslog

— выводить по мере поступления новых строк в файл.

grep — великая утилита для фильтрации входного потока:

cat /etc/passwd | grep root grep root /etc/passwd # есть вариант указать в аргументах файлы

ДЗ: пишем anti-head-tail — 2 аргумента: с какой по какую строку отправлять на вывод. +5 баллов в карму.

xargs

Отдельная заметка про xargs.

Если коротко:

ls | xargs file # передать спиок вывода ls аргументом утилите file.

# Склеить строки echo «a b c» | xargs a b c

regexp

Oh, shi~~

Короче, есть главная проблема программирования — «придумать название переменной».

За ней ровным строем идут регулярные выражения/грамматики, инвалидация кеша и реляционная алгебра.

Я вам не скажу за главную проблему, но за регулярные выражения немного поясню.

Читайте также:  Какой Linux выбрать? Лучшие дистрибутивы Linux

Мы уже встречались с прекрасными подстановками типа * и, например, *.txt. Видели забавные mkdir -p ./test/{a,s,d/{q,w,e}}, но что, если я скажу, что подобным образом можно искать?!

Как-то мы уже использовали grep для поиска подстроки в строке:

grep roo /etc/passwd

— ищем «roo» в файле passwd. Но это не так круто, как искать по шаблону!

grep ‘^root:’ /etc/passwd

— находим запись пользователя root.

Отмечу, что в каком-то виде regexp (regular expressions) есть практически во всех языках программирования, поэтому мозголомка ниже будет полезна. Понимание regexp сродни пониманию сложения — рассказывать об этом также сложно, ибо уже не помнишь, в чём проблемы восприятия (поэтому жду вопросов).

Регулярные выражения содержат 3 базовых возможности:

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

    ab

  2. Объединение (операция or / ||) — большое выражение соответствует строке, соответствуйщей одному из маленьких выражений, содержащихся в нём.

    a|b

  3. Замыкание — маленькое выражение может быть «повторено» ноль или более раз, чтобы соответствовать входу.

    a*

Примеры регулярных выражений

Конкатенация трёх выражений «f», «oo|ee», «t». Само же выражение «oo|ee» — объединение выражений «oo» и «ee»:

f(oo|ee)t # соответствуют foot или feet

Закрытие/замыкание/кложура и тд:

a+ # соответствует «a» один или более раз a* # соответствует «a» 0 или более раз a? # соответствует «a» 0 или 1 раз a{2,5} # сооветствует от 2 до 5 раз «a» a{2} # 2 раза a{2,} # от 2 раз a{,5} # до 5 раз

Делаем одно и то же разными способами:

a(0|1|2|3|4|5|6|7|8|9) # соотвествует a0, a1 … a9 a[0-9] # то же самое, что и a(0|1|2|3|4|5|6|7|8|9), но используя класс символов a[[:digit:]] # то же самое, что выше, но с альтернативным синтаксисом a\\d # то же самое, но через «сокращённое написание»

Полезно знать:

^ # символ начала строки $ # символ конца строки (не путать с \n — переводом строки) . # любой символ

Помните [[:digit:]]? Такого много:

[:alnum:] [:cntrl:] [:lower:] [:space:] [:alpha:] [:digit:] [:print:] [:upper:] [:blank:] [:graph:] [:punct:] [:xdigit:]

С чем это едят:

[[ «sad day» =~ (sad|happy) ]] && echo «Что-то о настроении» grep ‘^root:’ /etc/passwd # запись пользователя root awk ‘/false$/ {print $0}’ /etc/passwd # найти всех, кто логинится в false cat /etc/passwd | sed ‘/ *#/d; /^ *$/d’ # убрали комментарии из /etc/passwd и вывели

И это только базовое. Советую читать PCRE для понимания всего ужаса используемых в реальной жизни регулярок.

Команды консоли Ubuntu

В Ubuntu команды используются для выполнения разных задач. Посмотреть список всех команд и дополнительную информацию вы можете в документации Ubuntu.

Мы рассмотрим основные команды терминала Ubuntu, с которыми сталкивается каждый пользователь:

Команда ls

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

Команда cd

Переходит в другую указанную директорию или папку.

Команда cp

Копирует файлы и папки в любое место файловой системы.

Команда mv

Перемещает файлы и папки в любое место файловой системы.

Команда rm

Удаляет файлы и папки.

Команда mkdir

Создаёт новую пустую директорию.

Команда cat

Отображает содержимое файла в консоли.

Команда nano и команда vim

Открывают текстовые редакторы nano и vim, в которых можно редактировать файл прямо в консоли.

Постоянные переменные и псевдонимы Bash

Мы видели, как вы можете временно устанавливать переменные и как, для чего-то более постоянного, вы можете включать их в свои собственные скрипты. Но разве нельзя постоянно устанавливать переменные в Bash? Ответ — большое «да!» и вам нужно отредактировать только один файл: «~/.bashrc».

Читайте также:  Как установить бета-версию прошивки iOS на iPhone и iPad

Откройте файл «~/.bashrc» в вашем любимом текстовом редакторе. Поскольку я предпочитаю нано, я сделал это с помощью:

nano ~/.bashrc

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

myname=»Odysseas Kourafalos»

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

source ~/.bashrc

Постоянные переменные и псевдонимы Bash

Теперь вы можете использовать вновь установленную переменную в сеансе Bash:

echo $myname

Вы можете установить столько переменных, сколько захотите, и значительно упростить свои ежедневные приключения в Bash.

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

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

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

Основные команды для написания bash скрипта

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

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

Apache

Веб-сервер чуть медленнее, чем Nginx. Один из самых популярных в интернете.

Одна из ключевых особенностей — .htaccess файлы дополнительной конфигурации. Можно управлять отдельными папками. Размещаете этот файл в папке и прописываете в нём правила.

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

service apache2 restart — перезапуск Apache

service apache2 reload — применение новых конфигов без перезапуска сервера.

service apache2 stop — остановка веб-сервера