Автор - Лукас Вестерман (Lucas Westermann)

Случалось ли вам спрашивать себя, есть ли более простой способ найти команду в истории команд, чем перебирать их одну за другой? Такой способ есть. Более того, есть ещё немало полезных трюков, упрощающих работу с терминалом и оболочкой. Заметьте, что я использую термины «терминал» и «оболочка». Я знаю, что многие считают, что это одно и то же. Позвольте объяснить различие.

Терминал — это та программа, которая показывает приглашение оболочки, но саму оболочку можно легко сменить. Любые настройки приглашения производятся именно для оболочки, а не для терминала. Две наиболее распространённые оболочки — это Bash (Bourne Again Shell), которая часто установлена оболочкой по умолчанию, и Zsh (с творческим названием «Z Shell»). Чтобы попробовать новую оболочку, просто установите её и запустите из работающей оболочки bash, например:

zsh

Если новая оболочка вам понравится, то её можно сделать основной:

sudo chsh <имя_пользователя>

Здесь <имя_пользователя> — это, очевидно, имя пользователя. На экране появится следующее:

Изменение командной оболочки для <имя_пользователя> Введите новое значение или нажмите ВВОД для выбора значения по умолчанию Командная оболочка [/bin/zsh]:

Здесь нужно указать путь к файлу оболочки (обычно это /bin/). Запись в квадратных скобках — это ваша текущая регистрационная оболочка (как видите, я использую оболочку Z shell).

Вернёмся к нашей теме. История команд порой бывает очень длинной и запутанной (в моей истории сейчас около 1000 команд, а ведь я не так давно очищал её). Я частенько запускаю команды по несколько раз, иногда с большим количеством аргументов, иногда с меньшим. Для длинных команд я обычно произвожу поиск в списке истории команд. Например:

history|grep cd

возвращает:

996 cd Dropbox/Scripts/C

То есть эта команда отображает полный список команд «cd», которые я запускал. Обратите внимание на номер слева, в моём случае это 996. Если мы хотим ещё раз выполнить какую-то команду, то у нас есть несколько способов. Можно скопировать и вставить строчку (честно говоря, это не очень эффективно, ведь придётся оторваться от клавиатуры), а можно сделать так:

!996

таким образом автоматически будет выполнена команда из списка истории команд под номером 996. Ага, я вновь в каталоге с моими сценариями на Си, как просто! Понадобилось всего четыре символа, чтобы запустить эту команду. Я ленив, и такой способ мне очень нравится. И это гораздо быстрее, чем перелистывать команды в истории клавишами «Вверх» и «Вниз» в поисках нужной. Надеюсь, вам понравился этот способ. Отмечу также, что можно запустить:

!cd

чтобы выполнить последнюю команду cd.

Ещё одна очень полезная функция, с которой я познакомился, — это возможность добавлять собственные команды в оболочку Bash (в Z shell это тоже работает). Откройте свой файл .bashrc (в gedit, vim, nano или любом другом текстовом редакторе). Я буду использовать vim.

vim .bashrc

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

update

чтобы выполнить:

sudo apt-get upgrade

то я рекомендовал бы использовать алиасы, так как это просто способ набирать меньше текста. Лично для меня количество нажатий клавиш критично. Итак, чтобы создать алиас, в файл .bashrc нужно добавить следующую строку (я добавил ещё и комментарий, чтобы было понятнее).

#Алиас для обновления системы
alias update="sudo apt-get upgrade"

Ещё один алиас, который я часто использую:

#Алиас для более подробного вывода команды ls
alias ls="ls -la --color=always --classify"

Как вы, должно быть, заметили, я заменил команду ls на вариант с более подробным выводом. Вы спросите: «А что если я захочу использовать просто команду ls без аргументов?» Ответ прост:

\ls

Обратный слэш аннулирует алиасы, привязанные к этому имени, и просто запускает команду ls.

Теперь рассмотрим функции. Функции — это сценарии, добавленные непосредственно в конфигурационный файл оболочки, что бывает весьма удобно. Пример, который я буду использовать, находится на странице 7. Не волнуйтесь, я приведу объяснение.

Время от времени я пользуюсь этим сценарием, чтобы конвертировать аудио из формата .m4a в формат .mp3. Мне страшно представить, что я мог бы вручную запускать эти команды (неважно, как редко). В первой строке мы определяем m4a как функцию, а после первой фигурной скобки следует сам сценарий. Сначала мы проверяем, что сценарий запущен с двумя аргументами, и если это не так, то будет выдано сообщение об ошибке (самый конец сценария, вторая строка снизу). Если же аргументы указаны, мы проверяем, существует ли первый файл, а затем создаём файл_на_выходе (в данном случае файл .mp3). Если файл не существует, печатаем «файл <имя_файла> не существует!». После этого мы проверяем, существует ли файл mp3, чтобы удостовериться, что первая часть сценария прошла успешно. Если он не существует, то мы не предпринимаем попыток его переместить. Далее мы перемещаем файл .m4a в каталог Music, при этом используем указанное имя mp3-файла (чтобы знать, какой m4a какому mp3 соответствует) с заменой расширения с mp3 на m4a. Выдаём сообщение о том, что файл перемещён, и перемещаем файл mp3. Предварительно мы проверяем, существует ли каталог Music/m4a (оператор if перед комментарием). Если не существует, то мы его создаём. Надеюсь, мой сценарий кому-нибудь пригодится. У меня самого осталось несколько m4a-файлов из коллекции iTunes, и я конвертирую их, когда нахожу. Должен заметить, что эта функция требует указывать имена файлов в кавычках, иначе имена с пробелами и подобными символами не будут работать. Функцию нужно запускать так:

m4a "2-10 You're the Inspiration.m4a" "You're the Inspiration.mp3"

В результате файлы будут помещены в каталог Music (и подкаталог m4a). Однако в mp3-файлах будут отсутствовать id3-теги.

Исправление этого недостатка я оставляю как задачку для моих читателей. Существуют инструменты командной строки для работы с тегами. Дам подсказку: пакет perl-mp4-info для archlinux (в репозитории Arch User Repository на сайте) — это инструмент, позволяющий читать теги из файлов m4a. Этот пакет должен быть доступен и для Ubuntu. Если вы дополните сценарий возможностью автоматического копирования тегов из m4a в mp3 и захотите поделиться со мной решением, пришлите мне код по почте, и я добавлю его в следующую статью (конечно, упомянув имя автора). Сам я такой сценарий ещё не написал (и мне не на чем его протестировать — похоже, что все свои m4a-файлы я уже переконвертировал), но у меня есть чёткое представление о том, как это можно сделать. Ваш код я сравню со своим алгоритмом и в следующей статье расскажу, соответствовал ли он моим представлениям, или же я даже не думал о таком способе. Насколько мне известно, ffmpeg не копирует такую информацию.

Надеюсь, эти советы помогут вам и хотя бы немного пригодятся. Благодаря им мне приходится вводить значительно меньше текста, а работа в командной строке стала гораздо более эффективной (я даже использую Awesome [ред.: динамический оконный менеджер, есть в репозитории] на своей системе, поэтому к мыши я теперь притрагиваюсь крайне редко). С нетерпением жду писем от тех, кто возьмётся за решение задачки по улучшению функции.