Полезно, например, при редактировании конфигурации веб-сервера: удобно, внеся изменения, тут же дать команду для перезапуска, а потом вернуться в редактор на то же самое место, где остановился. Делается это с помощью оператора &
и команды fg
. Пример:
vi somefile &
- запускаем редактор vi в фоновом режимеfg
- переключаемся на vi- находясь в интерфейсе vi, нажимаем Ctrl+Z и возвращаемся в командную строку
- чтобы попасть из командной строки в vi, снова набираем
fg
Вместо первых трёх шагов можно просто запустить программу и, находясь в ней, нажать Ctrl+Z.
Можно держать в фоне несколько программ и переключаться между ними по номерам, например, fg %1
. Весь список можно посмотреть с помощью команды jobs
. При завершении работы программы (например, выходе из редактора) она исчезает из списка.
(Подготовлено по материалам статьи на howtogeek, раздел "Bash Job Control".)
Очистка экрана, которая обычно достигается нажатием Ctrl+L
, реально состоит из двух команд:
- очистить экран - ANSI-последовательность
\033[2J
- передвинуть курсор в начало строки - '\033[H'
Использовать очистку экрана бывает удобно при отладке PHP-скриптов через консоль, чтобы при каждом запуске вывод печатался "с чистого листа". Для этого в самом начале нужно дать команду
echo "\033[2J\033[H"; // здесь нужны именно двойные кавычки
Источник - stackoverflow.com.
Для начала нужно посмотреть, какая оболочка используется. Эта информация хранится в системной переменной $SHELL
:
> echo $SHELL
/bin/sh
Изменить основную оболочку можно с помощью команды chsh
(change shell), которой нужно указать исполняемый файл оболочки:
sudo chsh -s /bin/bash
Можно просмотреть имеющиеся оболочки, они перечислены в файле cat /etc/shells
.
Для настройки системного приглашения нужно установить значение переменной PS1
. Например:
PS1="something> "
something>
В состав приглашения могут входить управляющие конструкции. Например, \u
- имя пользователя, \n
- перевод строки, и др.:
PS1="\u>\n"
username>
С помощью $(команда)
можно подставлять результаты выполнения команд. Например:
PS1="$(pwd) >\n"
/home/username>
Чтобы приглашение обновлялось каждый раз, нужно занести команду в переменную PROMPT_COMMAND
:
PROMPT_COMMAND='PS1="$(pwd) >\n"'
Чтобы приглашение принимало свой вид автоматически, нужно поместить команду его задания в файл /home/пользователь/.bash_profile
- файл настроек оболочки bash
, который читается из каталога каждого пользователя (не путать с .bashrc
, который выполняется, только если bash
вызывается в явном виде).
(setf
- это не то же самое, что setaf
; использовать эту команду не нужно).
О дополнительных возможностях настройки при работе с git
см. тут.
Для управления цветом текста в терминале, в т.ч. цветом системного приглашения, используются два способа:
https://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html
Подкоманды:
setaf
- установить цвет текста по его кодуsetab
- цвет фона
Можно использовать как минимум восемь различных цветов (иногда 256), каждый из которых имеет свой номер (красный - 1, синий - 4; распечатать восемь доступных цветов в порядке от 0 до 7 - printf '\e[%sm▒' {30..37} 0; echo
(подробнее см. тут).
Например, tput setaf 1
сделает цвет текста красным. tput bold
- жирным. tput srg0
сбрасывает все настройки форматирования (эту команду необходимо использовать, иначе цветным будет не только приглашение, но и сами команды, а также их вывод).
Пример системного приглашения - текущий каталог красным текстом, в конце перевод строки:
PS1="$(tput setaf 1) $(pwd) $(tput sgr0) \n"
Управляющие последовательности имеют вид \[\e[9(номер цвета)m\]
с номерами от 1 до 7. 0m
- сброс цвета:
PS1="\[\e[91m\] $(pwd) \[\e[0m\] \n"
- очистить содержимое файла при редактировании -
:1,$d
(см. stackexchange) - заменить текст до конца строки -
C
(Shift+C), бывает удобно вместе с?...
(поиск по строке) :5
- перейти к строке № 5, аналогично для любого числа- показать номера строк -
:set number
или:set nu
; спрятать -:set nonumber
или:set nu!
- передвинуть строку в начало -
:m 0
, в конец -:m $
, после 1-й строки -:m 1
; тут есть еще - скопировать строку в буфер обмена консоли -
yy
, вставить -p
(не путать с буфером обмена ОС); еще проy
тут
Хорошая статья: https://www.cs.colostate.edu/helpdocs/vi.html
Backspace ведет себя привычным образом в vim, но не в vi. Их легко перепутать, т.к. оба вызываются командой vi
.
- в режиме редактирования нельзя удалять написанный текст клавишей Backspace, она просто перемещает курсор назад
- в режиме редактирования нельзя переходить по границам слов: Ctrl+стрелки не работают, а b и w (очевидно) дают прямой ввод
- нет нумерации строк (вместо этого сочетание Ctrl+G, показывающее общее количество строк и текущую строку, которое действует только в режиме просмотра)
- нет подсветки синтаксиса
vi хорошо подходит для внесения точечных изменений в небольшие файлы типа конфигураций и прочего.
du -A -B 1 -h -s [путь]
Используемые параметры:
-A
- отображать реальный размер файлов вместо выделенного под них пространства (оно всегда больше, т.к. округляется вверх с точностью до размера дискового блока операционной системы, который обычно имеет размер несколько килобайт); на некоторых системах поддерживается только полная запись ключа ---apparent-size
-h
- удобочитаемый формат размера (типа 120B, 30К, 2.4M и т.п. вместо количества блоков)-B 1
- размер блока для расчета (если не указывать, округлит вверх до 512 байт)-s
- отображать только суммарный размер указанного каталога, то же, что-d 0
; в случае файла этот параметр не играет роли (для alias лучше использовать-d 0
, т.к. его можно переназначить в последующей части команды, а-s
- нет)-d число
- глубина дерева для отображения;0
- только указанный каталог,1
- подкаталоги первого уровня и файлы и т.д.
Если не указывать аргумент - путь к файлу или каталогу - будет взят текущий каталог.
В качестве пути можно также указывать маску. В этом случае может быть полезен параметр -c
- выведет общий размер:
du -A -B 1 -h -s -c *.php
Для получения сводной информации о свободном и занятом месте на дисковой системе можно использовать команду df -h
.
- `find <каталог> -name="*.txt" - найти в некоем каталоге все txt-файлы
find . \! -perm -g=w,u=w
- найти все файлы в текущем каталоге и его дочерних, у которых нет разрешения на запись у группы или пользователя-владельца-user имя
- ограничить файлы принадлежащими указанному владельцу-ls
- выводить полный список (почему-то действует только в конце, раньше ломает другие опции)
Команда find
, данная без параметров, выведет список всех файлов в системе.
Параметр -delete
приведет к удалению найденных файлов.
- скачивание пакетов с github -
curl -O -L (ссылка)
:-L
- следовать по редиректам (в случае github нужно обязательно)-O
- сохранить имя файла из ссылки; если нужно указать своё имя, вместо-O
использовать-o имя_файла
- ВНИМАНИЕ! ссылка должна быть вида https://github.com/(user)/(repository)/**raw**/(path), она находится на кнопке "Raw" на странице просмотра/редактирования файла
- скачивание с помомщью
curl
без проверки сертификата --k
- скачать веб-страницу, отключив progress meter (
-s
), и показать первые 5 строк:curl -s http://manclassic.local | head -n5
grep -rl 'что найти' . | sed -i 's/что найти/чем заменить/g'
Для BSD- и Mac-систем перед -i
нужно добавить ''
(см. ниже).
Если замену нужно проводить только среди какого-то ограниченного типа файлов, нужно добавить grep
опцию --include
(например, --include="*.php"; или же
--exclude`, если какой-то тип файлов нужно исключить).
Пояснения
Можно было "натравить" sed
и на целые каталоги, но быстрее сначала выбрать с помощью grep
файлы, где встречается указанная строка, а затем передать только их sed
для обработки, хоть и приходится дублировать строку поиска в двух частях команды.
grep
:
-r
- искать рекурсивно во всех вложенных каталогах
-l
- выводить только путь к файлу (путь будет относительным)sed
:
-i
- обработать указанный файл, запустив отдельный экземпляр программы (в данном случае существенно только то, что через этот аргументsed
получает имя файла для обработки)
В BSD- и Mac-системахsed
требует указать суффикс для создания резервных копий файлов. Допустимо передавать пустой суффикс (тогда резервных копий не останется) - в этом и состоит назначение дополнительной пустой строки перед-i
(stackoverflow.com).
g
в конце выражения замены предписывает заменить все найденные фрагменты (в противном случае будет заменён только первый из найденных)
-
cd -
- переключение в предыдущий каталог -
символические ссылки:
ln -s имя_ссылки файл/или/каталог
cp -RP link link2
- копирование символической ссылки (а не подлежащего файла/каталога)
-
поиск по страницам мануалов (
man ...
) - так же, как в vi:- нажимаем
/
, вводим искомую строку (поиск с учётом регистра) и нажимаемEnter
- для поиска следующего совпадения нажиаем
n
(next)
- нажимаем
-
распаковываем архив tar.gz:
tar -x -z -f файл.tar.gz
(можно сокращенно --xzf файл...
-x
- распаковать архив-z
- использовать gzip-f
- использовать в качестве архива-источника файл, указанный в командной строке- если нужно распаковать в указанный каталог, а не в текущий - использовать
-C каталог
; каталог должен существовать!
-
добавление пути в переменную
PATH
:- а) в
~/.bashrc
или~/.profile
добавляем командуexport PATH="новый_путь:$PATH"
- б) редактируем файл
/etc/environment
(см. stackoverflow) Второй способ выглядит предпочтительней, т.к. в этом случае изменения устанавливаются один раз на уровне всей ОС (а не производятся каждый раз при запуске shell, как во втором случае), однако он применим не ко всем операционным системам, т.к. расположение файла в них может отличаться. Кроме того, для редактирования файла нужны права рута.
- а) в
-
выполнение подкоманды:
$(команда)
Результат выполнения будет вставлен в "родительскую". Например:echo $(echo 1)
.
Использование круглых скобок ($()
) предпочтительней использования обратных кавычек (`
), подробнее см. bashFAQ и stackoverflow. -
ls
: вывод файлов по дате последнего изменения - ключ-t
, сначала будут самые новые в обратном порядке (сначала - старые) --tr
-
date +%F
: вывод текущей даты в форматеYYYY-MM-DD
; то же, чтоdate +%Y-%m-%d
date +%T
: выводе времениhh:mm:ss
date "+%F %T"
: дата и время
mysql -s -r -e "SELECT ..." > file.blob