Skip to content

Instantly share code, notes, and snippets.

@1234ru
Last active February 9, 2024 22:02
Show Gist options
  • Save 1234ru/0f61b757fa46435c4d204f9ed92fa92d to your computer and use it in GitHub Desktop.
Save 1234ru/0f61b757fa46435c4d204f9ed92fa92d to your computer and use it in GitHub Desktop.
Полезное для работы в командной строке unix

Командная строка

Переключение между программами

Полезно, например, при редактировании конфигурации веб-сервера: удобно, внеся изменения, тут же дать команду для перезапуска, а потом вернуться в редактор на то же самое место, где остановился. Делается это с помощью оператора & и команды fg. Пример:

  1. vi somefile & - запускаем редактор vi в фоновом режиме
  2. fg - переключаемся на vi
  3. находясь в интерфейсе vi, нажимаем Ctrl+Z и возвращаемся в командную строку
  4. чтобы попасть из командной строки в 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.

Назначение bash основной оболочкой терминала

Для начала нужно посмотреть, какая оболочка используется. Эта информация хранится в системной переменной $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 см. тут.

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

1. Команда tput

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"

2. Прямое указание управляющих ANSI-последовательностей

Управляющие последовательности имеют вид \[\e[9(номер цвета)m\] с номерами от 1 до 7. 0m - сброс цвета:

PS1="\[\e[91m\] $(pwd) \[\e[0m\] \n"

Редактор vi/vim

  • очистить содержимое файла при редактировании - :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 - информация о занимаемом месте на диске

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

  • `find <каталог> -name="*.txt" - найти в некоем каталоге все txt-файлы
  • find . \! -perm -g=w,u=w - найти все файлы в текущем каталоге и его дочерних, у которых нет разрешения на запись у группы или пользователя-владельца
  • -user имя - ограничить файлы принадлежащими указанному владельцу
  • -ls - выводить полный список (почему-то действует только в конце, раньше ломает другие опции)

Команда find, данная без параметров, выведет список всех файлов в системе.

Параметр -delete приведет к удалению найденных файлов.

curl

  • скачивание пакетов с 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

Извлечение тела двоичного файла из таблицы

mysql -s -r -e "SELECT ..." > file.blob
  • -s - --silent, отключает форматирование вывода табуляциями
  • -r - --raw, отключает экранирование специальных символов
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment