Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11

Что еще есть в терминале Linux: 7 команд, которые экономят кучу времени

Очередная подборка «ТОП лучших команд Linux для новичков»? Нет, спасибо. Если уже используете grep и awk, умеете в циклы и не боитесь регулярных выражений — эта статья для вас.

1К открытий6К показов
Что еще есть в терминале Linux: 7 команд, которые экономят кучу времени

Сколько статей про «полезные команды Linux» вы уже прочитали? Алиасы, history, базовые горячие клавиши — факты для джунов, которые опытным админам уже снятся. Если свободно пользуетесь grep и awk, создаете циклы, применяете регулярные выражения — эта статья для вас.

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

  • про встроенные bash-операции, которые заменяют пайплайны,
  • про способы работы с файловыми дескрипторами,
  • про wildcards, которые избавляют от сложных конструкций с find.

Каждая команда в подборке решает конкретную проблему:

  • массовая обработка файлов,
  • отладка скриптов,
  • работа с длинными путями.

1. Bash variable expansions

Что еще есть в терминале Linux: 7 команд, которые экономят кучу времени 1

Вместо basename, cut для простых операций со строками можно использовать встроенные возможности Bash:

			filename="backup_database_2024.tar.gz"
echo ${filename%.*}        # backup_database_2024.tar
echo ${filename%%.*}       # backup_database_2024
echo ${filename##*.}       # gz
echo ${filename#*.}        # tar.gz
		

% режет справа до первого совпадения, %% — до последнего. Символ # работает слева направо.

В реальной работе это помогает при массовой обработке файлов. Например, есть 1000 логов, и нужно каждый переименовать.

Если использовать basename, запустится 1000 отдельных процессов. Variable expansions работают без fork/exec, без задержек на создание процессов.

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

2. Here-string (<<<)

Что еще есть в терминале Linux: 7 команд, которые экономят кучу времени 2
 

Here-string упрощает передачу строковых данных в команды без создания временных файлов или использования echo с пайпом.

			# Вместо: echo "SELECT * FROM users;" | mysql -u admin -p database
mysql -u admin -p database <<< "SELECT * FROM users;"

# Или с переменной:
SEARCH_TERM="error"
grep -i <<< "$SEARCH_TERM" logfile.txt

# Передача JSON в API:
curl -X POST -H "Content-Type: application/json" \
  -d <<< '{"name": "John", "age": 30}' \
  https://api.example.com/users

# Многострочный SQL лучше передавать через here-document:
mysql -u admin -p database << EOF
SELECT username, last_login
FROM users
WHERE active = 1
ORDER BY last_login DESC;
EOF
		

Реальная экономия времени проявляется при отладке и модификации скриптов. Например, когда SQL-запрос или конфигурация зашиты в here-документ. С here-string данные собраны в одном месте, легко редактируются и переиспользуются.

Работает не только с базами данных. Отправка в API, конфигурирование сетевых устройств через expect, передача команд в Docker — через <<< код будет понятнее, а сопровождение проще.

3. /proc/$$/fd

Что еще есть в терминале Linux: 7 команд, которые экономят кучу времени 3

Каждый процесс имеет стандартные дескрипторы 0 (stdin), 1 (stdout), 2 (stderr), которые представлены как символические ссылки. Директория /proc/$$/fd предоставляет доступ к файловым дескрипторам текущего процесса:

			# Посмотреть текущие дескрипторы
ls -la /proc/$$/fd

# Запись в stderr через дескриптор
echo "Ошибка" >&2

# Или напрямую:
echo "Ошибка" > /proc/$$/fd/2
		

Переменная $$ содержит PID текущего процесса, поэтому /proc/$$/fd ведет к дескрипторам именно вашего шелла.

Практическое применение — отладка перенаправлений и работа с дескрипторами в сложных скриптах:

			# Сохранить оригинальный stdout
exec 3>&1

# Перенаправить stdout в файл
exec 1>logfile.txt

# Вывести что-то в оригинальный stdout
echo "Это пойдет в терминал" >&3

# Посмотреть, куда указывают дескрипторы
readlink /proc/$$/fd/1  # покажет logfile.txt
readlink /proc/$$/fd/3  # покажет терминал
		

4. Wildcards с диапазонами

Что еще есть в терминале Linux: 7 команд, которые экономят кучу времени 4

Про * и ? говорят чаще, чем про диапазоны в квадратных скобках. Такие маски используют реже, а зря — они решают массу задач по отбору файлов.

			# Файлы с цифрами 1-5 в имени
ls file[1-5].txt

# Все файлы кроме backup'ов (не начинающиеся на b)
ls [^b]*

# Логи с номерами 1-5 (например, по дням недели)
ls access_log_[1-5].log

# Файлы с заглавными буквами в начале
ls [A-Z]*
		

Wildcards автоматически раскрываются шеллом в список подходящих файлов — это их основная функция. Кавычки нужны только когда передаете символы [, ] как литеральные:

			# Ищет паттерн "file[1-5]" в тексте
grep 'file\[1-5\]' document.txt

# Ищет слово "file1" в файлах file1.txt, file2.txt и т.д.
grep file1 file[1-5].txt
		

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

5. sudo !!

Что еще есть в терминале Linux: 7 команд, которые экономят кучу времени 5

Набрали длинную команду, нажали Enter, получили «Permission denied». Рука на рефлексе тянется к стрелке вверх и Home, чтобы добавить sudo в начало.

Вот способ в разы быстрее:

			systemctl restart nginx
# Permission denied

sudo !!
# Выполнится: sudo systemctl restart nginx
		

Двойное восклицание !! — это ссылка на предыдущую команду целиком. Bash подставит всю строку со всеми аргументами и ключами. Кажется мелочью, но для админа, который 10 раз в день забывает sudo, это серьезная оптимизация.

Двойное восклицание универсально и работает не только с sudo:

  • time !! для замера времени выполнения,
  • nohup !! & для запуска в фоне,
  • strace !! для отладки.

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

6. ^старое^новое

Что еще есть в терминале Linux: 7 команд, которые экономят кучу времени 6

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

			ping goggle.com
# Опечатка в домене

^goggle^google
# Выполнится: ping google.com
		

Символ ^ ищет первое вхождение слова и заменяет его. Работает с последней командой.

Заменяется только первое вхождение. Если ошибочное слово встречается несколько раз, способ не сработает. В таких случаях придется использовать классическое редактирование или history expansion.

7. Alt+.

Что еще есть в терминале Linux: 7 команд, которые экономят кучу времени 7

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

			mkdir /var/log/application/detailed/debug/session_2024
cd [Alt+.]  # Вставится путь из предыдущей команды
		

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

Экономия времени проявляется при работе с файлами и директориями. Например: распаковали архив, теперь нужно зайти в созданную папку, затем посмотреть содержимое, потом изменить права. Вместо того, чтобы 3 раза печатать один путь, можно 3 раза нажать Alt+.

Еще этой комбинацией вставляются:

  • имена пользователей,
  • IP-адреса,
  • названия сервисов,
  • параметры конфигурации. 

Alt + точка работает в большинстве шеллов. Привыкнув к ней, начинаешь использовать на автомате.

Что запомнить

  • ${filename%.*} и встроенные операции со строками работают быстрее внешних утилит. % режет справа, # — слева. Полезно при работе с циклами для массовой обработки файлов.
  • <<< — here-string удобен для передачи коротких строковых данных в команды. С многострочными данными лучше использовать here-document или переменные.
  • /proc/$$/fd — доступ к файловым дескрипторам текущего процесса. Ускоряет отладку перенаправлений и работу с дескрипторами.
  • file[1-5] и [^b]* — диапазоны в wildcards для точного отбора файлов. Кавычки нужны только для передачи литеральных символов.
  • sudo !! — повторяет последнюю команду с sudo. Также работает с time !!, nohup !! &. Если между нужной командой и !! выполнялись другие операции, используйте !строка для поиска конкретной команды в истории.
  • ^старое^новое — заменяет первое вхождение в предыдущей команде. Работает только с последней командой и заменяет первое совпадение.
  • Alt+. — вставляет последний аргумент предыдущей команды. Повторное нажатие перебирает аргументы из истории команд. Экономит время при работе с длинными путями.
Следите за новыми постами
Следите за новыми постами по любимым темам
1К открытий6К показов