Книга «Linux. Командная строка. Лучшие практики»

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
image Привет, Хаброжители!

Перейдите на новый уровень работы в Linux! Если вы системный администратор, разработчик программного обеспечения, SRE-инженер или пользователь Linux, книга поможет вам работать быстрее, элегантнее и эффективнее. Вы научитесь создавать и запускать сложные команды, которые решают реальные бизнес-задачи, обрабатывать и извлекать информацию, а также автоматизировать ручную работу.

Узнайте, что происходит внутри командной оболочки Linux. Вне зависимости от используемых команд, вы повысите эффективность работы в Linux и станете более конкурентоспособным специалистом.

Для кого эта книга
Предполагается, что у вас есть опыт работы с Linux, поскольку эта книга не знакомит с Linux. Она предназначена, прежде всего, для пользователей, которые хотят улучшить свои навыки работы с командной строкой, таких как студенты, системные администраторы, разработчики программного обеспечения, IT-инженеры, тестировщики и энтузиасты операционной системы Linux. Опытные пользователи Linux также смогут найти для себя полезный материал, особенно если они учились методом проб и ошибок и хотят улучшить свое понимание командной строки.

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

• Создание и редактирование текстовых файлов с помощью редакторов vim (vi), emacs, nano, pico.

• Основные команды для работы с файлами, такие как cp (копирование), mv (перемещение или переименование), rm (удаление), chmod (изменение прав доступа).

• Основные команды для просмотра фалов, такие как cat (вывод содержимого файла) и less (постраничный вывод текста).

• Основные команды для работы с каталогами, такие как cd (переход в другой каталог), ls (вывод списка файлов и каталогов), mkdir (создание каталога), rmdir (удаление каталога), pwd (вывод пути к текущему каталогу).

• Основы сценариев командной оболочки: хранение команд Linux в файле, создание исполняемого файла (с помощью chmod 755 или chmod +x) и его запуск.

• Просмотр встроенной документации Linux, известной как man-страницы, с помощью команды man (например, man cat отображает документацию по команде cat).

Перемещение по файловой системе


В фильме «Приключения Бакару Банзая в восьмом измерении», классической американской комедии 1984 года, лихой главный герой произносит следующие мудрые слова в духе дзен: «Помни, куда бы ты ни пошел… ты здесь». Бакару вполне мог говорить о файловой системе Linux:

$ cd /usr/share/lib/etc/bin    Куда бы ты ни пошел
$ pwd
/usr/share/lib/etc/bin    ...ты здесь.

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

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

Чтобы освежить в памяти ваши знания о каталогах Linux, см. Приложение A. Если вы используете оболочку, отличную от bash, то найдете дополнительную информацию в Приложении Б.

Лучшие способы перехода в нужный каталог


Если вы спросите десять опытных пользователей Linux, что самое утомительное в командной строке, не менее семи из них ответят: «Ввод длинных путей к каталогам». В конце концов, если ваши рабочие файлы находятся в /home/smith/Work/Projects/Apps/Neutron-Star/src/include, финансовые документы лежат в /home/smith/Finances/Bank/Checking/Statements, а ваши видео — в /data/Arts/Video/Collection, утомительно вводить эти пути снова и снова. В этом разделе вы узнаете, как удобнее всего перейти к заданному каталогу.

Переход в домашний каталог

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

$ pwd
/etc    Вы начали где-то в файловой системе
$ cd    Запустите cd без аргументов...
$ pwd
/home/smith    ...и вы снова в домашнем каталоге

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

$ cd $HOME/Work

Еще один способ — это символ тильда (~):

$ cd ~/Work

И $HOME, и ~ являются выражениями, вычисляемыми оболочкой. Это можно проверить с помощью стандартного вывода:

$ echo $HOME ~
/home/smith /home/smith

Тильда также может привести к домашнему каталогу другого пользователя, если помещена непосредственно перед его именем:

$ echo ~jones
/home/jones

Перемещайтесь быстрее с автозавершением командной строки

Когда вы вводите команду cd, не печатайте путь полностью. Вместо этого нажмите клавишу Tab, чтобы автоматически подставлять имена каталогов. В качестве тренировки посетите каталог, содержащий подкаталоги, например /usr:

$ cd /usr
$ ls
bin games include lib local sbin share src

Предположим, вы хотите перейти в подкаталог share. Введите sha и один раз нажмите Tab:

$ cd sha<Tab>

Командная оболочка дополнит имя каталога за вас:

$ cd share/

Это полезное сокращение называется автозавершением командной строки (tab completion). Оно срабатывает сразу, когда введенный вами текст приходит в соответствие с именем одного из каталогов. Когда текст соответствует именам нескольких каталогов, вашей оболочке требуется дополнительная информация. Предположим, вы набрали только s и нажали Tab:

$ cd s<Tab>

Оболочка не может завершить имя каталога share (пока что), потому что имена других каталогов тоже начинаются с s: sbin и src. Нажмите Tab второй раз, и оболочка выведет все возможные варианты завершения, чтобы помочь вам:

$ cd s<Tab><Tab>
sbin/ share/ src/

Теперь она будет ожидать вашего следующего действия. Чтобы устранить дву-смысленность, введите символ h и еще раз нажмите клавишу Tab:

$ cd share/

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

Автозавершение с помощью клавиши Tab отлично подходит для ускорения навигации. Вместо того чтобы вводить длинный путь, такой как /home/smith/Projects/Web/src/include, введите столько символов, сколько считаете нужным, и продолжайте нажимать клавишу Tab. Попрактикуйтесь, и вы быстро освоитесь.

Автозавершение зависит от программы

Автозавершение командной строки подходит не только для команд cd. Оно работает для большинства команд, хотя его поведение может отличаться. С командой cd клавиша Tab завершает имена каталогов. Для команд, работающих с файлами, таких как cat, grep и sort, автозавершение дополняет имена файлов. Если используется команда ssh (secure shell), Tab дополняет имена хостов. Для команды chown (изменить владельца файла) она дополняет имена пользователей. Вы можете даже создать свои собственные правила завершения для увеличения скорости работы, как мы увидим далее в листинге 4.1. Также вы можете запустить man bash и прочитать раздел Programmable completion.

Переход к часто посещаемым каталогам с использованием псевдонимов или переменных

Если вы часто посещаете удаленный от корня файловой системы каталог, такой, например, как /home/smith/Work/Projects/Web/src/include, создайте псевдоним, выполняющий операцию cd:

# В файле конфигурации оболочки:
alias work="cd $HOME/Work/Projects/Web/src/include"

Теперь запустите псевдоним, чтобы добраться до нужного каталога:

$ work
$ pwd
/home/smith/Work/Projects/Web/src/include

В качестве альтернативы можно создать переменную для хранения пути к нужному каталогу:

$ work=$HOME/Work/Projects/Web/src/include
$ cd $work
$ pwd
/home/smith/Work/Projects/Web/src/include
$ ls $work/css    Использование переменной другими способами
main.css mobile.css

Редактируйте часто используемые файлы с помощью псевдонимов

Иногда причиной частого посещения каталога является редактирование определенного файла. Тогда есть смысл определить псевдоним для редактирования этого файла. Определение псевдонима rcedit в примере ниже позволит вам редактировать $HOME/.bashrc независимо от того, где вы находитесь в файловой системе. Запуск команды cd не требуется:

# Поместите в файл конфигурации оболочки и примените его:
alias rcedit='$EDITOR $HOME/.bashrc'

Если вы регулярно посещаете множество каталогов с длинными путями, можете создать псевдонимы или переменные для каждого из них. Однако этот подход имеет недостатки:

• Трудно запомнить все эти псевдонимы и переменные.

• Вы можете случайно создать псевдоним с тем же именем, что и у существующей команды, и это вызовет конфликт.

В качестве альтернативы можно создать функцию оболочки, подобную qcd (quick cd) в листинге 4.1. Эта функция принимает строковый ключ в качестве аргумента, например work или recipes, и запускает команду cd для выбранного пути к каталогу.

Листинг 4.1. Функция для перехода в отдаленные каталоги

# Определение функции qsd
qcd () {
  # Принимает 1 аргумент, который является строковым ключом
  case "$1" in
    work)
      cd $HOME/Work/Projects/Web/src/include
      ;;
    recipes)
      cd $HOME/Family/Cooking/Recipes
      ;;
    video)
      cd /data/Arts/Video/Collection
      ;;
    beatles)
      cd $HOME/Music/mp3/Artists/B/Beatles
      ;;
    *)
      # Введенный аргумент не совпал ни с одним из ключей
      echo "qcd: unknown key '$1'"
      return 1
      ;;
  esac
 # Вывести на экран имя текущего каталога, чтобы указать, где вы находитесь
  pwd
}
# Настройка автозавершения
complete -W "work recipes video beatles" qcd

Сохраните функцию в файле конфигурации оболочки, таком как $HOME/.bashrc (см. раздел «Окружения и файлы инициализации, краткая версия» на с. 50), обновите экземпляр оболочки — и она готова к запуску. Введите qcd, а затем один из поддерживаемых ключей, чтобы быстро перейти в соответствующий каталог:

$ qcd beatles
/home/smith/Music/mp3/Artists/B/Beatles

В качестве бонуса последняя строка сценария запускает встроенную в оболочку команду complete, которая настраивает автозавершение для команды qcd. Поэтому сценарий завершается четырьмя поддерживаемыми ключами. Теперь вам не нужно запоминать аргументы qcd! Просто введите qcd, пробел, дважды нажмите клавишу Tab — и оболочка напечатает все доступные аргументы. Тогда вы сможете ввести любой из них обычным способом:

$ qcd <Tab><Tab>
beatles recipes video work
$ qcd v<Tab><Enter>    Завершает 'v' до 'video'
/data/Arts/Video/Collection

Уменьшите пространство поиска с помощью CDPATH

Функция qcd обрабатывает только указанные вами каталоги. Но командная оболочка предоставляет более общее решение для создания быстрых функций по переходу в нужный каталог, которое лишено этого недостатка. Путь поиска команды cd (cd search path) в свое время изменил мой подход к навигации по файловой системе Linux.

Предположим, у вас есть важный подкаталог /home/smith/Family/Memories/Photos, который вы часто посещаете. Когда вы перемещаетесь по файловой системе, чтобы попасть в каталог Photos, вам может потребоваться ввести длинный путь, например:

$ cd ~/Family/Memories/Photos

Было бы здорово, если бы вы могли сократить этот путь до Photos, независимо от того, где вы находитесь в файловой системе.

$ cd Photos

Обычно эта команда не работает:

bash: cd: Photos: No such file or directory   Нет такого файла или каталога

Сработает она, если вы случайно оказались в исходном каталоге (~/Family/Memories) или в каком-либо другом каталоге с подкаталогом Photos. Но путем несложных манипуляций вы можете указать команде cd искать подкаталог Photos не только в текущем каталоге. Поиск работает практически мгновенно и только в указанных вами родительских каталогах. Например, вы можете указать cd искать в $HOME/Family/Memories в дополнение к текущему каталогу. После этого cd Photos завершится успешно из любой точки файловой системы:

$ pwd
/etc
$ cd Photos
/home/smith/Family/Memories/Photos

Путь поиска команды cd работает так же, как путь $PATH, но вместо команд он находит подкаталоги. Настройте его с помощью переменной оболочки CDPATH, которая имеет тот же формат, что и PATH — список каталогов, разделенных двое-точиями. Например, ваша переменная CDPATH состоит из четырех каталогов:

$HOME:$HOME/Projects:$HOME/Family/Memories:/usr/local

и вы печатаете:

$ cd Photos

тогда команда cd проверит наличие следующих каталогов по порядку:

1. Подкаталог Photos в текущем каталоге
2. $HOME/Photos
3. $HOME/Projects/Photos
4. $HOME/Family/Memories/Photos
5. /usr/local/Photos

В нашем случае cd с четвертой попытки успешно меняет каталог на $HOME/Family/Memories/Photos. Если два каталога в $CDPATH имеют подкаталог с именем Photos, переход произойдет в тот из них, который стоит раньше в списке.

Обычно успешно выполненная команда cd не выводит никаких результатов. Однако, когда cd находит каталог, используя CDPATH, она выводит абсолютный путь, чтобы сообщить о новом текущем каталоге:

$ CDPATH=/usr    Установить CDPATH
$ cd /tmp    Нет вывода: CDPATH не использовался
$ cd bin    cd использовала CDPATH...
/usr/bin    ...и вывела путь к новому рабочему каталогу

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

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

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

image

Хитрость заключается в том, чтобы ваш CDPATH включал следующее:
1. $HOME.
2. Ваш набор подкаталогов $HOME.
3. Относительный путь к родительскому каталогу, обозначенный двумя точками (..).

Включив $HOME в CDPATH, вы можете сразу перейти к любому из его подкаталогов (Family, Finances, Linux, Music и Work) из любого места в файловой системе, не вводя начальный путь:

$ pwd
/etc    Начните за пределами вашего домашнего каталога
$ cd Work
/home/smith/Work
$ cd Family/School    Вы перешли на один уровень ниже $HOME
/home/smith/Family/School

Включив подкаталоги $HOME в CDPATH, вы сможете сразу перейти в их подкаталоги:

$ pwd
/etc    Где-то за пределами вашего домашнего каталога
$ cd School
/home/smith/Family/School    Вы перешли на два уровня ниже $HOME

Все каталоги в вашей переменной CDPATH до сих пор являлись абсолютными путями в $HOME и его подкаталогах. Однако, включив относительный путь .., вы поменяете поведение команды cd. Независимо от того, где вы находитесь в файловой системе, вы сможете перейти к любому каталогу того же уровня по его имени. Например, если вы находитесь в /usr/bin и хотите перейти в /usr/lib:

$ pwd
/usr/bin    Ваш текущий каталог
$ ls ..
bin include lib src    Ваши одноуровневые каталоги
$ cd lib
/usr/lib    Вы перешли в другой одноуровневый каталог

Или, если вы программист, работающий с подкаталогами src, include и docs:

$ pwd
/usr/src/myproject
$ ls
docs include src

вы можете быстро перемещаться между подкаталогами:

$ cd docs    Измените ваш текущий каталог
$ cd include
/usr/src/myproject/include    Вы перешли в другой одноуровневый каталог
$ cd src
/usr/src/myproject/src    Снова перешли

CDPATH для дерева каталогов на рис. 4.1 может содержать шесть элементов: ваш домашний каталог, четыре его подкаталога и относительный путь к родительскому каталогу:

# Поместите в файл настроек оболочки и примените его
export CDPATH=$HOME:$HOME/Work:$HOME/Family:$HOME/Linux:$HOME/Music:..

После применения файла конфигурации вы сможете перейти к важным каталогам, вводя только их короткие имена. Ура!

Этот метод работает лучше всего, если все подкаталоги в каталогах, указанных в CDPATH, имеют уникальные имена. Если у вас есть повторяющиеся имена, например $HOME/Music и $HOME/Linux/Music, то команда cd Music всегда будет проверять $HOME перед $HOME/Linux и, следовательно, не найдет $HOME/Linux/Music.

Чтобы проверить наличие повторяющихся имен подкаталогов на первых двух уровнях $HOME, попробуйте однострочник, который перечисляет все каталоги и подкаталоги $HOME, изолирует имена подкаталогов с помощью cut, сортирует список и подсчитывает вхождения с помощью uniq:

$ cd
$ ls -d */ && (ls -d */*/ | cut -d/ -f2-) | sort | uniq -c | sort -nr | less

Вы могли узнать команду из раздела «Обнаружение дубликатов файлов» на с. 32. Если в выходных данных отображается число больше 1, у вас есть дубликаты. Эта команда включает в себя несколько функций, которые мы еще не рассматривали. Вы познакомитесь с двойным амперсандом (&&) в разделе «Способ 1: Условные списки» на с. 135, а со скобками — в разделе «Способ 10: Явные под-оболочки» на с. 159.

Лучшие способы вернуться в каталог


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

Переключение между двумя каталогами с помощью «cd -»

Предположим, вы работали в отдаленном вложенном каталоге и запустили cd, чтобы перейти куда-то еще:

$ pwd
/home/smith/Finances/Bank/Checking/Statements
$ cd /etc

но затем захотели вернуться в каталог Statements, где только что были. Не вводите повторно длинный путь к каталогу. Просто запустите cd с дефисом в качестве аргумента:

$ cd -
/home/smith/Finances/Bank/Checking/Statements

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

Чтобы перемещаться туда-обратно между парой каталогов, несколько раз запустите cd. Это экономит время, когда вы сосредоточены на работе в двух каталогах в одном экземпляре оболочки. Однако есть одна загвоздка: оболочка запоминает только один предыдущий каталог за раз. Например, если вы переключаетесь между /usr/local/bin и /etc:

$ pwd
/usr/local/bin
$ cd /etc    Экземпляр оболочки помнит /usr/local/bin
$ cd -       Экземпляр оболочки помнит /etc
/usr/local/bin
$ cd -       Экземпляр оболочки помнит /usr/local/bin
/etc

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

$ cd         Экземпляр оболочки помнит /etc
оболочка теперь забыла /usr/local/bin как предыдущий каталог:
$ cd -       Экземпляр оболочки помнит ваш домашний каталог
/etc
$ cd -       Экземпляр оболочки помнит /etc
/home/smith

Следующий метод позволяет обойти это ограничение.

Переключение между несколькими каталогами с помощью pushd и popd

Команда cd позволяет переключаться между двумя каталогами, но что, если вам нужно отслеживать три или более каталогов? Предположим, вы создаете локальный веб-сайт на своем компьютере с Linux. Эта задача часто подразумевает использование четырех или более каталогов:
• Расположение активных, развернутых веб-страниц, таких как /var/www/html.
• Каталог конфигурации веб-сервера, например /etc/apache2.
• Расположение SSL-сертификатов, например /etc/ssl/certs.
• Ваш рабочий каталог, например ~/Work/Projects/Web/src.

Поверьте мне, утомительно постоянно вводить:

$ cd ~/Work/Projects/Web/src
$ cd /var/www/html
$ cd /etc/apache2
$ cd ~/Work/Projects/Web/src
$ cd /etc/ssl/certs

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

Стек каталогов — это список каталогов, которые вы посетили в текущем экземпляре оболочки и решили отслеживать. Вы управляете стеком, выполняя две операции, называемые вталкиванием (pushing) и извлечением (popping). Вталкивание каталога добавляет его в начало списка, который называется вершиной стека. Извлечение удаляет верхний каталог из стека25. Первоначально стек содержит только ваш текущий каталог, но вы можете добавлять (вталкивать) и удалять (извлекать) каталоги и быстро переходить между ними.

Каждый экземпляр оболочки поддерживает свой собственный стек каталогов.

Я начну с основных операций (вталкивание, извлечение, просмотр), а затем перейду к другим вещам.

Поместить каталог в стек

Команда pushd (сокращение от push directory) выполняет следующие действия:
1. Добавляет заданный каталог в вершину стека.
2. Выполняет cd в этот каталог.
3. Выводит на экран стек сверху вниз для справки.

Я создам стек из четырех каталогов, добавляя их по одному:

$ pwd
/home/smith/Work/Projects/Web/src
$ pushd /var/www/html
/var/www/html ~/Work/Projects/Web/src
$ pushd /etc/apache2
/etc/apache2 /var/www/html ~/Work/Projects/Web/src
$ pushd /etc/ssl/certs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Work/Projects/Web/src
$ pwd
/etc/ssl/certs

Оболочка печатает стек после каждой команды pushd. Текущий каталог — левый (верхний).

Просмотр стека каталогов

Выведите на экран стек каталогов текущего экземпляра оболочки с помощью команды dirs. Она не изменяет стек:

$ dirs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Work/Projects/Web/src

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

$ dirs -p
/etc/ssl/certs
/etc/apache2
/var/www/html
~/Work/Projects/Web/src

Вы можете передать вывод команде nl для нумерации строк с нуля:

$ dirs -p | nl -v0
     0 /etc/ssl/certs
     1 /etc/apache2
     2 /var/www/html
     3 ~/Work/Projects/Web/src

Это можно сделать еще проще, запустив dirs -v. Этот параметр выводит на экран стек с пронумерованными строками:

$ dirs -v
0 /etc/ssl/certs
1 /etc/apache2
2 /var/www/html
3 ~/Work/Projects/Web/src

Если вы предпочитаете такой формат, подумайте о создании псевдонима:

# Поместите в файл конфигурации оболочки и примените его
alias dirs='dirs -v'


Извлечь каталог из стека

Команда popd (pop directory) противоположна команде pushd. Она делает следующее:
1. Удаляет один каталог из вершины стека.
2. Выполняет команду cd в новый верхний каталог.
3. Выводит на экран стек сверху вниз для справки.

Например, если в вашем стеке четыре каталога:

$ dirs
/etc/ssl/certs /etc/apache2 /var/www/html ~/Work/Projects/Web/src


Несколько раз запустим команду popd, которая будет проходить по этим каталогам сверху вниз:

$ popd
/etc/apache2 /var/www/html ~/Work/Projects/Web/src
$ popd
/var/www/html ~/Work/Projects/Web/src
$ popd
~/Work/Projects/Web/src
$ popd
bash: popd: directory stack empty
$ pwd
~/Work/Projects/Web/src

Команды pushd и popd настолько экономят время, что я рекомендую создавать двухбуквенные псевдонимы, которые набираются так же быстро, как cd:

# Поместите в файл конфигурации оболочки и примените его
alias gd=pushd
alias pd=popd

Поменять местами каталоги в стеке

Теперь, когда вы умеете создавать и очищать стек каталогов, давайте сосредоточимся на практических примерах его использования. pushd без аргументов меняет местами два верхних каталога в стеке и переходит к новому верхнему каталогу. Давайте несколько раз переместимся между /etc/apache2 и вашим рабочим каталогом, запустив pushd. Посмотрите, как третий каталог /var/www/html остается там же, когда первые два меняются местами:

$ dirs
/etc/apache2 ~/Work/Projects/Web/src /var/www/html
$ pushd
~/Work/Projects/Web/src /etc/apache2 /var/www/html
$ pushd
/etc/apache2 ~/Work/Projects/Web/src /var/www/html
$ pushd
~/Work/Projects/Web/src /etc/apache2 /var/www/html

Обратите внимание, что pushd при переключении между двумя каталогами аналогичен команде cd, но не ограничивается запоминанием только одного каталога.

Превратить ошибочный cd в pushd

Предположим, вы перемещаетесь между несколькими каталогами с помощью pushd, а потом случайно запускаете cd и теряете каталог:

$ dirs
~/Work/Projects/Web/src /var/www/html /etc/apache2
$ cd /etc/ssl/certs
$ dirs
/etc/ssl/certs /var/www/html /etc/apache2

Команда cd заменила каталог ~/Work/Projects/Web/src в стеке на /etc/ssl/certs. Но не волнуйтесь. Вы можете добавить отсутствующий каталог обратно в стек, не вводя его длинный путь. Просто запустите pushd дважды, один раз с дефисом и один раз без:

$ pushd -
~/Work/Projects/Web/src /etc/ssl/certs /var/www/html /etc/apache2
$ pushd
/etc/ssl/certs ~/Work/Projects/Web/src /var/www/html /etc/apache2

Давайте разберем, почему это работает:

• Первая команда pushd возвращает вас в предыдущий каталог, посещенный в этом экземпляре оболочки ~/Work/Projects/Web/src, и помещает его в стек. pushd, как и cd, принимает дефис в качестве аргумента, означающего «вернуться в мой предыдущий каталог».

• Вторая команда pushd меняет местами два верхних каталога, возвращая вас в /etc/ssl/certs. В результате вы восстановили ~/Work/Projects/Web/src на второй позиции в стеке, где он был бы, если бы вы не допустили ошибки.

Команда «ой, я забыл pushd» достаточно полезна, чтобы дать ей псевдоним. Я называю ее slurp (потому что она «slurps back26» потерянный мной каталог):

# Поместите в файл конфигурации оболочки и примените его
alias slurp='pushd - && pushd'


Углубиться в стек

Что делать, если вы хотите перейти в другие каталоги в стеке, помимо двух верхних? pushd и popd принимают положительный или отрицательный целочисленный аргумент для дальнейшей работы со стеком. Команда

$ pushd +N

сдвигает N каталогов с вершины стека вниз, а затем переходит к новому верхнему каталогу. Отрицательный аргумент (-N) сдвигает каталоги в противоположном направлении, снизу вверх, перед выполнением cd:

$ dirs
/etc/ssl/certs ~/Work/Projects/Web/src /var/www/html /etc/apache2
$ pushd +1
~/Work/Projects/Web/src /var/www/html /etc/apache2 /etc/ssl/certs
$ pushd +2
/etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src /var/www/html

Таким образом, вы можете перейти к любому другому каталогу в стеке с помощью простой команды. Однако если ваш стек длинный, трудно определить числовую позицию нужного каталога. Поэтому выведите числовую позицию каждого каталога с помощью dirs -v, как вы делали в разделе «Просмотр стека каталогов» на с. 82:

$ dirs -v
0 /etc/apache2
1 /etc/ssl/certs
2 ~/Work/Projects/Web/src
3 /var/www/html

Чтобы переместить /var/www/html на вершину стека (и сделать его текущим каталогом), запустите pushd +3.

Чтобы перейти к каталогу в нижней части стека, запустите pushd -0:

$ dirs
/etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src /var/www/html
$ pushd -0
/var/www/html /etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src

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

$ popd +N

удаляет каталог, расположенный на позиции N, из стека, считая сверху вниз. Отрицательный аргумент (-N) означает отсчет снизу стека. Подсчет начинается с нуля, поэтому popd +1 удаляет второй каталог сверху:

$ dirs
/var/www/html /etc/apache2 /etc/ssl/certs ~/Work/Projects/Web/src
$ popd +1
/var/www/html /etc/ssl/certs ~/Work/Projects/Web/src
$ popd +2
/var/www/html /etc/ssl/certs


Резюме


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

• CDPATH для быстрой навигации.

• pushd и popd для быстрого возврата.

• Исправление случайно запущенной команды cd.

Об авторе
Дэниел Джей Барретт преподает Linux и родственные технологии и пишет о них уже более 30 лет. Автор множества книг издательства O'Reilly, таких как Linux Pocket Guide, Linux Security Cookbook, SSH, The Secure Shell: The Definitive Guide, Macintosh Terminal Pocket Guide и MediaWiki. Помимо этого Дэн в разное время был разработчиком программного обеспечения, рок-певцом, системным администратором, преподавателем в университете, веб-дизайнером и стендапером. Работает в Google. Более подробную информацию ищите по адресу danieljbarrett.com.

Более подробно с книгой можно ознакомиться на сайте издательства:
» Оглавление
» Отрывок

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Для Хаброжителей скидка 25% по купону — Linux
Источник: https://habr.com/ru/companies/piter/articles/741996/


Интересные статьи

Интересные статьи

Вы интересуетесь программированием, но не знаете, с чего начать? Сейчас с этим сложности не возникают. В интернете можно найти курсы программирования и приобрести ценные знания, которые будут закрепле...
Привет, Хаброжители! Пора сделать веб-разработку доступной для всех. Забавное, полезное и насыщенное информацией руководство охватывает все ключевые принципы дизайна, передовые практики, полезные шот...
Я плавно приближаюсь к своему двадцатилетнему юбилею в технической индустрии. На протяжении этих лет я своими глазами повидал почти все анти-паттерны обработки исключений...
Привет, Хаброжители! «Совершенный софт» — это проверенный, структурированный и высокотехнологичный подход к разработке программного обеспечения. Множество компаний уже используют идеи Лё...
Совсем недавно в издательстве ДМК-пресс на русском языке вышла замечательная книга Конрада Кокосы «Управление памятью в .NET для профессионалов». Это издание примечательно тем, что в переводе ...