Приемы написания скриптов в bash

zkbd

При первом запуске zsh нередко оказывается, что часть кнопок вроде F1/Backspace/Delete/курсора работает некорректно. Это связано с тем, что абсолютное большинство консольных приложений использует readline и корректная настройка этих кнопок считывается из и , а zsh этого не делает.

Проблема решается в лоб — нужно посмотреть, какие escape-последовательности выдают нужные кнопки в вашем терминале и задать в нужные обработчики для этих escape-последовательностей. Примерно так:

Смотреть выдаваемые кнопками последовательности можно запустив и нажимая перед нужной кнопкой. (И таки да, занимаясь этим в 2017 я чувствовал себя немного странно…) Но в комплекте с zsh идёт вспомогательная утилита , которая автоматизирует этот процесс. Для этого необходимо подключить её в , после чего у вас появится ассоциативный массив содержащий нужные escape-последовательности:

Я не уточняю детально какие команды (вроде ) на какие кнопки назначать потому, что во-первых назначать надо не все подряд, а только те, которые у вас из коробки не заработают, и во-вторых если мнения насчёт того, что должны делать Home или Backspace у всех сходятся, то вот поиск в истории по Up и Down может выполняться довольно разными способами, и функции в этих случаях на эти кнопки надо назначать тоже разные.

(Кстати, задавать символ Escape () в параметре bindkey можно и настоящим символом, вводя его через , и двумя обычными символами , и двумя символами .)

Настройка Zsh

Для запуска командной оболочки выполните такую команду:

При первом запуске Zsh предложит вам настроить вашу оболочку. Здесь вам нужно нажать клавишу 1 чтобы попасть в меню настройки:

1. Настройка истории

В этом меню давайте начнём с первого пункта. Там находятся настройки истории команд. Нажмите 1, затем, чтобы изменить количество команд, которые будут хранится в истории нажмите 3 (Number of lines of history to save to $HISTFILE) и введите нужное число:

Например, я увеличил количество хранимых строк до 5000. Чтобы вернуться в главное меню нажмите (Remember changes and return to main menu).

2. Автодополнение

Дальше надо настроить автодополнение. Здесь можно выбрать пункт 1 чтобы оставить все настройки по умолчанию — Turn on completion with default options:

3. Раскладка клавиатуры

В третьем пункте настроек можно изменить как будут обрабатываться нажатия клавиш клавиатуры во время набора и редактирования команд. По умолчанию используется стиль Emacs, однако, вы можете включить стиль Vim если вы используете этот редактор. Для этого сначала нажмите 3, затем 1 для редактирования раскладки и выберите v для Vim:

4. Другие опции

В четвёртом пункте собраны другие опции оболочки. Их можно включить или отключить:

  • Change directory given just path — менять директорию если вы введете в терминале путь к не исполняемому файлу;
  • Use additional pattern matching features — разрешить использовать дополнительные символы при составлении шаблонов поиска совпадений, сюда входят символы #, ~ и ^, кроме стандартных * и ?;
  • Unmatched patterns cause an error — выдавать ошибку если шаблон не совпадает;
  • Beep on errors — сигнал при ошибке;
  • Immediately report changes in background job status — сообщать об изменении статуса фоновых задач.

Чтобы активировать опцию нажмите её цифру, а затем нажмите s (set), для деактивации нажмите u (unset).

5. Сохранение настроек

Когда завершите, возвращайтесь в главное меню. Там, для сохранения всех изменений нажмите 0. Утилита предупредит, что в конфигурационный файл были добавлены строки настройки и редактировать их не стоит, можно редактировать только то, что до или после них. Если же вы захотите исправить что-то в них, снова запустите команду zsh-newuser-install.

После завершения настройки вы попадёте в оболочку.

6. Приглашение оболочки

Наверное, визитная карточка любой оболочки — это приглашение ввода. Именно его мы постоянно видим во время работы с оболочкой. По умолчанию приглашение выглядит слишком просто. Шаблон основного приглашения находится в переменной $PS1 или $PROMPT. Это приглашение ввода показывается при вводе любой команды и его интереснее всего настроить. Доступны такие переменные:

  • %m — имя хоста;
  • %n — имя пользователя;
  • %? — код возврата последней команды;
  • %d — текущая директория;

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

%{$назначение%}

В качестве назначения можно использовать fg, fg_bold или bg. А в качестве цвета:

  • white — белый;
  • black — чёрный;
  • green — зеленый;
  • cyan — фиолетовый;
  • red — красный;
  • yellow — желтый;
  • magenta — оранжевый.

Для сброса цвета используйте конструкцию %{$reset_color%}. Дальше можно собрать своё приглашение ввода, например:

Для того чтобы это заработало в файл ~/.zshrc надо добавить не только эту строчку, но и следующую:

В результате вы получите такое приглашение ввода:

7. Установка oh my zsh

Если всего этого вам мало, то можно установить скрипт oh my zsh, который реализует множество дополнительных возможностей в zsh. Тут можно выбирать различные темы приглашения, добавлять плагины, например, git, добавлены различные возможности автодополнения и многое другое. Для установки этого скрипта выполните:

Скрипт установит все плагины и темы oh my zsh в вашу домашнюю папку, а также полностью заменит файл .zshrc на свой:

8. Настройка темы

Одна из самых интересных возможностей oh my zsh — темы. Темы определяют цвета текста, внешний вид приглашения и многое другое. Все доступные темы можно найти в папке ~/.oh-my-zsh/themes:

Затем можно перезапустить zsh:

Но для работы конкретно этой темы надо установить пакет шрифтов:

9. Оболочка по умолчанию

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

Утилита попросит пароль, а затем путь к исполняемому файлу оболочки, которую вы хотите использовать:

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

Использование переменных и входных данных

Использование позиционных параметров

useradd lisauseraddlisa $1$2Листинг 1

lisalori bob

Листинг 2

В Листинге 2 представлены два новых элемента, которые относятся к аргументам:

  • $# — это счетчик, который показывает, сколько аргументов было использовано при запуске скрипта.
  • $@ — список всех аргументов, которые использовались при запуске скрипта.

forfor for i in $@$@$ido doneecho Давайте попробуем воспользоваться скриптом из листинга 2 в этом примере:

  1. Введите vi argument, чтобы создать файл argument и скопируйте содержимое из скрипта листинга 2 в этот файл.
  2. Сохраните файл и сделайте его исполняемым.
  3. Запустите команду ./argument a b c. Вы увидите, что отобразятся три строки.
  4. Запустите команду ./argument a b c d e f. Вы увидите, что помимо a b c отобразятся и d e f.

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

Список встроенных команд интерпретатора: helpПомощь по команде: <команда> —helpМануал по команде: man <команда>Версия команды: <команда> —versionСписок доступных оболочек: cat /etc/shellsСписок пользователей и их оболочек: cat /etc/passwdТекущая директория: pwdСписок файлов текущей директории: ls -laТекущий пользователь: idПеременные среды: setВерсия ОС: cat /etc/os-releaseВерсия ядра: uname -aПолучить привилегии суперпользователя: sudo su -Установка программы в Debian: apt install mcПосмотреть утилизацию(загрузку): topСвободное место: df -hСколько занимает директория: du -ks /var/logКонфигурация сетевых интерфейсов: ifconfig -aОбъем оперативной памяти: free -mИнформация о блочных устройствах(дисках): lsblkИнформация о процессорах: cat /proc/cpuinfoСписок установленных пакетов: apt list —installedСписок и статус сервисов: service —status-allПерезапуск сервиса: service apache2 restartСкачать файл: wget https://www.gnu.org/graphics/gplv3-with-text-136×68.pngПолучить веб-страницу по URL: curl https://www.google.comПоказать задания планировщика: crontab -lРедактировать задания планировщика: crontab -eВывести новые сообщения в системном логе: tail -f /var/log/syslogПодсчитать количество строк в выводе команды: <команда> | wc -lИзменить права доступа к файлу (разрешить выполнение всем): chmod a+x <файл>Список процессов: ps -efПроверить, запущен ли процесс: ps -ef | grep <процесс>Перейти в предыдущий каталог: cd -Завершить процесс (сигнал kill): kill -9Удаление файла: rm <имя файла>Удаление директории: rm -rf <имя директории>Редактировать файл: nano <имя_файла>Топ 10 процессов по использованию памяти: ps aux | awk ‘{print $6/1024 » MB\t\t» $11}’ | sort -nr | head

Резюмируем

Краткая сводная таблица для 6 вышерассмотренных командных оболочек:

Командная оболочка Путь Приглашение (обычный пользователь) Приглашение (root)
sh (Bourne Shell) /bin/sh и /sbin/sh $ #
bash (Bourne-Again Shell) /bin/bash имя_пользователя@имя_хоста:~$ имя_пользователя@имя_хоста:~#
ksh (Korn Shell) /bin/ksh $ #
csh (C Shell) /bin/csh % #
tcsh (TENEX C Shell) /bin/tcsh имя_хоста:~> #
zsh (Z Shell) /bin/zsh % #

Примечание: Помимо представленных выше оболочек, есть еще и такие оболочки, как:

   mksh — оболочка, основной упор в которой сделан на написание скриптов;

   dash — более легковесная в сравнении с bash оболочка, но из-за этого обладающая ограниченной функциональностью;

   fish — «новая» оболочка, написанная в 2005 году, отличительной чертой которой является упор на комфорт использования и упрощение командного языка;

   и другие.

autoload -Uz

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

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

При вызове никаких файлов с диска не считывается, и даже не проверяется их наличие — всё это произойдёт при первом вызове функции. Практически всегда необходимо передавать аргументы (отменяет эффект текущих alias-ов для загружаемого файла, потому что нередко alias-ы настроенные пользователем могут нарушать работу сторонних функций) и (необязательное уточнение что загружаемый файл — в формате zsh, но безопаснее его всегда задавать).

При этом содержимое файла может быть в одном из этих трёх форматов:

Терминал

Итак, начнем с клавиш из настроек терминала. Их можно посмотреть, выполнив команду:♯

А перенастроить, например, так:♯

Ctrl-c – сигнал SIGINT

Первые две комбинации клавиш достаточно важные, и часто «недавно перешедшие с Windows на Linux» НЕправильно их используют: продолжая, как в DOS, для завершения команд использовать комбинацию «Ctrl-z», что неверно. В Linux же для того, чтобы попросить (команде посылается сигнал SIGINT) приложение прервать свою работу, используется .

Ctrl-z – сигнал SIGTSTP

А комбинация используется, чтобы попросить (команде посылается сигнал SIGTSTP) приложение остановить свою работу (не завершая) – «поставить на паузу». Ну, а «разбудить» его можно командой «fg» (или «bg»).

Ctrl-d – EOF(окончание ввода данных)

Далее разберем комбинацию . В выводе «stty -a» эта комбинация значится как «EOF», что означает «окончание ввода данных». Для примера покажу, как можно создать текстовый файл с определенным текстом без использования текстового редактора:

^^^ Здесь видно, что любой набираемый текст перенаправляется в файл /tmp/File.txt, и нет никакой фразы (типа «Горшочек, не вари»), которую бы команда cat восприняла как «окончание ввода» – точнее, для этого как раз и надо нажать .

Также пользуюсь комбинаций для того, чтобы выйти из консоли (например, после того как переключился командой su под другого пользователя или зайдя по ssh на другую машину) – вместо набора команды «exit» или «logout»:

^^^ В правом терминале отображаю историю команд.

…(а внимательный зритель догадается, какой «супер-секретный» пароль у root’а на стенде)

Ctrl-v – ввод следующего символа

Комбинация позволяет вставить в командную строку следующий за ней символ, не воспринимая его как спецсимвол. (Параметр в выводе «stty -a»)

^^^ Здесь для примера показываю, как в скрипте выводить строку текста с использованием табуляции (знаю, что можно использовать \t в команде echo: , но не у всех утилит есть такая возможность, а подобная необходимость вставить «спецсимвол» случается).

^^^ А в этом примере у меня есть файл «New Text Document.txt», созданный в ОС Windows при помощи программы Notepad в директории, которую я затем открыл на доступ по сети и примонтировал в Linux в директорию /mnt. Программа Notepad (в отличии от Notepad++) создает файл в DOS-формате – в конце каждой строки использует дополнительный символ «Возврат каретки». Терминалы часто по умолчанию этот символ не отображают, но он есть, и поэтому, например, команда » не выведет строку, заканчивающуюся на букву «m». Команда cat с опцией «-v» отображает этот символ. А для того, чтобы при выводе заменить или удалить это символ, воспользовался командой tr (хотя можно было бы использовать специальную для этого утилиту unix2dos).

setopt и emulate

  • В именах опций регистр и подчёркивания значения не имеют, плюс перед любой опцией можно добавить префикс «no».
  • Вызов для одной и той же опции с префиксом «no» и без «no» (равно как и наоборот!) делают одно и то же.
  • В выводе используются маленькие буквы без подчёркиваний, в документации используются большие буквы с подчёркиваниями. Это создаёт некоторое неудобство — при поиске в документации нужно догадаться, где вставлять подчёркивания чтобы найти нужную опцию.
  • Команда позволяет массово установить группу опций в состояние совместимости с sh, ksh, csh или в состояние по умолчанию для zsh. Многие функции в zsh начинаются командой , что позволяет на время выполнения функции привести ключевые опции в состояние по умолчанию для zsh — без этого большинство нетривиальных функций может ломаться из-за выставленных пользователем опций (например, есть опция которая управляет тем, как индексируются массивы — от 1 или от 0).

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

Ещё есть опция , и формально для привычной работы после bash её тоже надо включить, но я бы этого не рекомендовал: поведение zsh без этой опции более удобное и логичное, лучше сразу к нему привыкать. Она отвечает за то, как сработает если значение это строка содержащая пробелы: в bash получит несколько аргументов, а в zsh — один (как если бы вызвали ). А если это массив, то zsh передаст по одному аргументу на каждый не пустой элемент массива (даже если эти элементы содержат пробелы).

(В основном, эта статья описывает поведение zsh с опциями по умолчанию, иначе каждое второе предложение пришлось бы уточнять в стиле «но вот при таких-то опциях всё это работает иначе».)

Использование условий и циклов

  • if… then… else — используется для выполнения кода, если определенное условие выполняется
  • for — используется для выполнения команд для диапазона значений
  • while — используется для выполнения кода, если выполняется определенное условие
  • before — используется для выполнения кода, пока не выполнено определенное условие
  • case — используется для оценки ограниченного количества конкретных значений

if then elsetestif if… then… fi

else if elsetestЛистинг 4 if then else

|| и &&

if… then||&&||&&Рассмотрим эти две строки:

$1ping pingif &&||if… then… else&& ||Упражнение if… then… else

  1. Запустите редактор и создайте скрипт с именем filechk.
  2. Скопируйте содержимое из листинга 4 в этот скрипт.
  3. Запустите с ним пару тестов, такие как ./filechk /etc/hosts, ./filechck /usr, ./filechk non-existing-file.

KornShell

Обычно известный как ksh, KornShell — это популярная альтернативная оболочка Linux, созданная Bell Labs в 1980-х годах. Существует не так много различий между bash и ksh, но у каждого есть незначительные преимущества перед другим. Ksh, например, имеет команду cd old new. Если вы были в каталоге / Downloads / foo / bar / one / foobar и вам нужно было перейти в / Downloads / foo / bar / two / foobar, вам просто нужно ввести:

CD один два

Ветераны ksh будут пропагандировать его превосходство, упоминая его преимущества сценариев. Это включает:

  • Лучший синтаксис цикла
  • Естественные способы повторения команд
  • Ассоциативные массивы

В отличие от bash, сложно найти помощь для ksh в Интернете. Если вы хотите попробовать ksh, введите:

sudo apt установить ksh ksh

Как узнать какая оболочка у меня установлена?

Если вы только начинаете свое знакомство с Linux и не меняли оболочку, то наиболее вероятно, что в вашей системе используется bash. Самый простой способ узнать, какая оболочка используется в данный момент — это обратиться к переменной окружения :

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

Не трудно заметить, что в настоящее время используется оболочка bash. Для просмотра всех доступных оболочек в вашей системе, необходимо обратиться к содержимому файла etc/shells:

1.3 Функции оболочки

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

Функции описываются с испольэованием следующего синтаксиса:

Когда функция выполняется, ее аргументы становятся поэиционными
параметрами времени ее выполнения. Специальный параметр # содержит
количество позиционных параметров. Позиционный параметр 0 неизменный.

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

Автодополнение

Tab – автодополнение (в контексте)

Во многих командных интерпретаторах (и в bash в том числе) используется такая возможность, как автодополнение. Как минимум нужно знать, что по нажатию клавиши дописывается название команды. В bash по умолчанию обычно настроено так, что если имеется только один вариант дополнения, то он дописывается по нажатию (также можно использовать и ). Когда вариантов дополнения много, то по первому нажатию дописывается только общая часть (если она есть). А по второму нажатию отображается список всех доступных вариантов. Дальше можно набрать еще символов – уточнить, какое из дополнений нужно, и снова нажать . То же самое с другими дополнениями: имен файлов, имен переменных.

^^^ Здесь, например, смотрю (нажав дважды ), что есть несколько команд, начинающихся с «if», добавив «c» и нажав , получаю набранной команду «ifconfig».

^^^ В этом примере дополняю аргументы команды (здесь имена файлов). Также видно, что в случае, когда вариантов много и все не умещаются в окне терминала, их список отображается утилитой для постраничного просмотра (также при очень большом списке вариантов выдается запрос вида «Display all 125 possibilities? (y or n)» или, как в этом примере, при малом количестве — «—More—».

Дополнения имен пользователей, переменных

Часто, когда дописываются аргументы команд по , дописываются имена файлов. Но стоит также отметить, что, в зависимости от контекста, по дописываются и имена переменных (аргументы, начинающиеся с символа «$»), имена пользователей (аргументы, начинающиеся с символа «~»),…

^^^ Здесь, чтобы набрать «$HISTFILESIZE», вместо 13 символов набрал 8 символов ( ). Помимо того, что так быстрее, это еще и позволяет допускать меньше ошибок при наборе команд, так как не просто печатаю текст, а выбираю из списка установленных переменных.

^^^ Здесь дописываю имена пользователей (фактически пишу адрес домашней директории).

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

Список того, что может дополнять bash, можно посмотреть командой:

Так, например, видно, что:

  • – покажет список имен пользователей, начинающихся с набранных символов, а дополнить комбинацией ;

  • – список имен машин (согласно /etc/hosts), начинающихся с набранных символов, а дополнить – ;

  • – список имен переменных, заданных в этой сессии (можно их также посмотреть командой set), а дополнить – ;

  • – список команд (согласно доступных: $PATH, alias, функций, встроенных команд), а дополнить – ;

  • – список имен файлов, а дополнить – .

Alt-* – вставить дополнения, Ctrl-x * – развернуть шаблон

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

В примерах ниже разворачиваю список файлов:

Вариант с :

Вариант с :

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

Термины

  • Параметр: обычная переменная — скаляр (строка, целое, дробное), массив, ассоциативный массив (хеш). А переменными называют в основном переменные окружения, т.е. экспортированные скалярные параметры.
  • Аргумент: параметр (в традиционном смысле) вызываемой команды или функции (аргументы функции доступны через параметры , , …).
  • Шаблон: глоб. Как правило шаблоны подразумевают совпадение с реально существующими файлами, но в некоторых случаях они применяются к строке или значению параметра. Поддержка полноценных регулярок тоже есть, но в основном везде в качестве шаблонов для совпадения или поиска/замены используются глобы.
  • Флаги: задаются в круглых скобках перед тем, на что они должны влиять. Для параметров задаются между открывающей фигурной скобкой и именем параметра: . Для шаблонов могут быть в начале или середине: .
  • Квалификаторы: задаются в круглых скобках после шаблона, уточняя его свойствами не связанными с именем файла: .
  • Модификаторы: задаются каждый после двоеточия, применяются по очереди изменяя текущее значение. Для параметров задаются после имени параметра: , . Для шаблонов задаются перед закрывающей круглой скобкой квалификаторов: .

Какой Linux Shell лучше для меня?

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

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

Когда вы остановитесь на оболочке Linux, убедитесь, что вы знакомы с основами сценариев оболочки.

Команда chsh

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

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

Чтобы установить оболочку входа в систему, используйте без параметров:

chsh

Вам будет предложено ввести пароль. Затем вы должны ввести путь к новой оболочке и нажать Enter.

Если мы сделаем удаленное соединение с этим тестовым компьютером с другого, мы окажемся в Shell, как только мы вошли в систему.

Для изменения вашей интерактивной оболочки используйте с (оболочка) вариант. Передайте путь к новой оболочке в командной строке:

chsh -s /usr/bin/fish

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

Переменная окружения теперь содержит путь к вашей новой оболочке по умолчанию:

echo $SHELL

1.6 Важнейшие отличия от оболочки Борна

Bash реализует практически такую же грамматику, подстановку
параметров и переменных, перенаправление и использование кавычек и
апострофов, как и в оболочке Борна. Bash опирается на стандарт Posix
1003.2 как спецификацию того, как эти возможности должны быть
реализованы. Однако, имеются некоторые отличия между обычной оболочкой
Борна и стандартом POSIX; этот раздел описывает некоторые наиболее
значительные отличия. Некоторые другие отличия будут упомянуты в
других разделах этого документа.

Bash использует ключевой символ «!» для отрицания значения,
возвращаемого конвейером. Очень полезно, когда выражение if
выполняется только при возвращении ненулевого значения.

Bash включает brace-расширение (см. раздел 2.2 ).

Bash включает шаблоны образцов Posix и ksh- стиля, убирая
конструкции %% и ## для удаления ведущей или завершающей подстроки из
переменных.

Обеспечиваются Posix и ksh форма подстановки команд $(), наряду с
конструкцией ` ` из оболочки Борна (которая также обеспечивается для
совместимости).

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

Поддерживается расширение ${#xx}, которое возвращает длину $xx.

Переменная IFS используется для разделения не всех слов, а только
результатов расширения. Это закрывает давнее отверстие в защите
оболочки.

Могут быть переменная и функция с одним и тем же именем: sh не
разделяет два пространства имен.

В функциях Bash могут быть локальные переменные, таким образом можно
писать весьма полезные рекурсивные функции.

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

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

Встроенная команда builtin позволяет избирательное выключение
функций при выполнении поиска команд.

Отдельные встроенные команды могут выть включены или выключены при
использовании встроенной команды enable.

Функции могут быть переданы потомку через среду.

Встроенная команда read читает окончание строки в \ с помощью опции
-r и использует переменную $REPLY по умолчанию, если аргументы не даны.

Встроенная команда return может быть использована для прекращения
выполнения скриптов, выполненных встроенными командами . или source.

Встроенная команда umask позволяет символизировать аргументы
аналогично chmod.

Встроенная команда test незначительно отличается от той, что
обеспечивается стандартом Posix 1003.2, которая описывает поведение,
исходя из числа аргументов.

Вперед

Спонсоры:

Хостинг:

Maxim ChirkovДобавить, Поддержать, Вебмастеру

Общие слова и замечания

Большинство продемонстрированных клавиш стандартны для «командной строки Linux», но часть из этих комбинаций специфичны для bash (поэтому и пометил это в заголовке). На текущий момент BASH – наиболее распространенный командный интерпретатор, используемый по умолчанию в большинстве Linux-дистрибутивов. В других командных интерпретаторах или, проще говоря, shell’ах (рекомендую попробовать zsh и fish) могут быть небольшие отличия в работе. Также часть комбинаций прописана в «настройках по умолчанию» (например, в файле /etc/inputrc или в /etc/bashrc), которые тоже могут различаться в разных дистрибутивах. И бывает, что некоторые клавиши могут быть настроены и перехватываться графической оболочкой, в которой запущен командный интерпретатор.

Часть демонстрируемых клавиш относятся к «настройкам терминала». А часть – клавиши из командного интерпретатора BASH, и их можно посмотреть, почитав мануал по bash’у (огромный текст – пользуйтесь поиском):

^^^ На приведенном фрагменте из мануала: Запись «(C-r)» означает , а «M->» означает .

Для демонстраций нажатых клавиш использую утилиту «screenkey».

При этом стоит упомянуть, что по умолчанию bash использует emacs-режим редактирования командной строки и поэтому многие комбинации клавиш пришли из редактора emacs. Для знающих редактор vi, могу порекомендовать переключить (добавив «set -o vi» в ~/.bashrc) bash в vi-режим редактирования и пользоваться привычными комбинациями из vi.

История команд

«Работа с историей команд» – классическая тема обычно из любого начального курса по Linux (по крайней мере, среди тех курсов, которые читаются у нас в «Сетевой Академии ЛАНИТ»). И многие, кто имеет хотя бы небольшой опыт работы с командной строкой, историей команд пользуются – как минимум знают, что она есть, и используют стрелки «вверх» (отобразить предыдущую команду) и «вниз» (отобразить следующую после отображаемой команду в истории команд), чтобы выбрать, какую из ранее введенных команд либо снова выполнить, либо подредактировать и запустить отредактированную. Но помимо стрелок еще есть ряд полезных комбинаций клавиш, которые позволяют работать с историей команд, – быстрее находить нужные команды.

Ctrl-r – Поиск по истории

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

^^^ В этом примере мне понадобилось из истории вытащить команду, содержащую текст «su»: нажав и набрав искомый текст «su», я увидел самую недавнюю команду, содержащую «su»; при повторном нажатии отображается предыдущая команда, содержащая «su» и т.д. При необходимости изменить команду жму стрелку «вправо» и правлю текст, а чтобы запустить команду — нажимаю .

PgUp/PgDown – Поиск по истории

– отображает предыдущую команду начинающуюся с уже введенного текста, – следующую.

^^^ В этом примере перемещаюсь между командами, начинающимися с «cat». (Часто также ищу команды, начинающиеся с «sudo». Или если мне нужно снова отредактировать какой-то файл, который недавно редактировал: набираю «vi», жму несколько раз , а затем .)

Alt-_/Alt-./Alt— – вставка аргументов

Комбинация (выполняется нажатием , , ) – вставляет последний аргумент из предыдущих команд. (Аналогично работает комбинация или, что то же самое, )

^^^ В данном примере видно, как повторные нажатия вставляют аргументы от пред-пред-…-идущих команд.

Комбинация – позволяет указать (порядковый номер с конца), какой аргумент вставить клавишей из предыдущей команды.

^^^ В данном примере вставляю в командную строку различные аргументы из предыдущей команды.

Alt-# – текущую команду преобразовать в комментарий

Бывает, во время набора очень длинной команды понимаю, что мне нужно что-нибудь посмотреть или дополнительно сделать (например, глянуть, какие файлы есть в определенной директории, прочитать мануал по команде, установить нужный пакет…). Что делать с уже набранным текстом? Хотелось бы посмотреть нужную информацию и продолжить набирать команду, а не начинать печатать её сначала. (выполняется нажатием , , . Также можно использовать ) – преобразует текущую набранную команду в комментарий в истории – добавляет символ «#» в начало строки и добавляет полученную строку в историю команд.

Ctrl-o – повтор команд из истории

Комбинация позволяет повторять серию команд из истории. То есть нужно из истории команд стрелками выбрать первую команду из серии и нажать – это выполнит текущую команду и выведет из истории следующую. Дальше можно продолжать нажимать с тем же эффектом.

^^^ В примере я написал три команды: одна увеличивает на 1 переменную, которой соответствует год; вторая выводит переменную-год; третья показывает, сколько дней в феврале в указанном году. Дальше, нажимая , повторяю эту серию из трех команд много раз (один кадр соответствует трем нажатиям).

Редактирование

Ctrl-w/u/k – вырезать слово/начало/конец строки

– вырезать слово (от текущего положения курсора до ближайшего ранее в строке пробела/табуляции). Вырезанное можно затем вставить комбинацией

– вырезать начало строки (от текущего положения курсора. Если курсор в конце строки, то вырежет целиком строку). Вырезанное можно затем вставить комбинацией .

– вырезать конец строки (от текущего положения курсора. Если курсор в начале строки, то вырежет целиком строку). Вырезанное можно затем вставить комбинацией .

Ctrl-y – вставить вырезанное

– вставить вырезанный фрагмент командной строки. (В bash используется свой буфер для хранения вырезанных фрагментов – называется «kill ring»).

Важно: Удобно использовать с (позволяет «прокручивать» варианты вставки из буфера)

Ctrl-x Ctrl-e – редактировать в $EDITOR

Нажав комбинацию , можно редактировать командную строку в любом внешнем редакторе (по умолчанию часто используется редактор vim; переназначить редактор можно, указав в переменной EDITOR). Часто редакторы имеют больше продвинутых возможностей в редактировании текста. Особенно удобно, если редактор умеет подкрашивать синтаксис команд и имеет различные встроенные инструменты для быстрого поиска и исправления ошибок.

Также эту возможность часто использую, когда набранную команду, разросшуюся до нескольких строк, хочу сохранить в виде отдельного скрипта – тогда переключаю редактирование команды в редактор и в нём сохраняю набранный текст в файл, как в примере ниже:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: