![image](https://habrastorage.org/webt/h6/h3/x9/h6h3x97lkt9tt1vawsmmg0v_rpy.jpeg)
Перейдите на новый уровень работы в Linux! Если вы системный администратор, разработчик программного обеспечения, SRE-инженер или пользователь Linux, книга поможет вам работать быстрее, элегантнее и эффективнее. Вы научитесь создавать и запускать сложные команды, которые решают реальные бизнес-задачи, обрабатывать и извлекать информацию, а также автоматизировать ручную работу.
Узнайте, что происходит внутри командной оболочки 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 проверит наличие следующих каталогов по порядку:
- Подкаталог Photos в текущем каталоге
- $HOME/Photos
- $HOME/Projects/Photos
- $HOME/Family/Memories/Photos
- /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](https://habrastorage.org/webt/dc/xd/ip/dcxdipgvy31y2s_-bk_udiw6wq0.png)
Хитрость заключается в том, чтобы ваш CDPATH включал следующее:
- $HOME.
- Ваш набор подкаталогов $HOME.
- Относительный путь к родительскому каталогу, обозначенный двумя точками (..).
Включив $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) выполняет следующие действия:
- Добавляет заданный каталог в вершину стека.
- Выполняет cd в этот каталог.
- Выводит на экран стек сверху вниз для справки.
Я создам стек из четырех каталогов, добавляя их по одному:
$ 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. Она делает следующее:
- Удаляет один каталог из вершины стека.
- Выполняет команду cd в новый верхний каталог.
- Выводит на экран стек сверху вниз для справки.
Например, если в вашем стеке четыре каталога:
$ 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.
Более подробно с книгой можно ознакомиться на сайте издательства:
» Оглавление
» Отрывок
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Для Хаброжителей скидка 25% по купону — Linux
Комментарии (15)
saga111a
15.06.2023 16:43+1Одна из крайне удобных это поиск в ранее введенных командах: после нажатия ctrl+r начинаем вводить часть ранее использованной команды. И оно автоматом подставляет, если надо следующее по списку подходящее то нажимаем ctrl+r еще раз, и так пока не найдем то что нужно.
пример:
вводили:cd /etc/nginx/ less nginx.conf cd ~/docs/for_dummers/nginx/ less getting_started_nginx.txt cd ~/
хотим вернуться к просмотру конфига
нажимаем: ctrl+r
вводим: nginx. При этом видим less getting_started_nginx.txt
нажимаем еще два раза ctrl+r и видим нужную команду less nginx.confdeepblack
15.06.2023 16:43+2Есть еще вариант.
Создем файл ~/.inputrc со следующим содержимым:
"\e[A": history-search-backward # arrow up
"\e[B": history-search-forward # arrow down
Перезапускаем терминал, начинаем вводить команду и сразу можем стрелками листать историю с учетом введенного текста.
sukhe
15.06.2023 16:43+1Если у вас дисплей с большой диагональю, вы можете упростить задачу, открыв отдельное окно оболочки для каждого каталога. Но если вы работаете в одном экземпляре оболочки (скажем, через соединение SSH), воспользуйтесь функцией оболочки, называемой стеком каталогов.
Воспользуйтесь tmux или screen
SibProgrammer
15.06.2023 16:43Довольно странное впечатление от прочитанного: все больше это становится "музеем". Для написания скриптов на bash'е может еще и будет практическая польза. А вот для повседневной жизни, навигации и упрощения работы после ohmyzsh возвращаться обратно не особо виден смысл.
Yaaa
15.06.2023 16:43ничего специфического для bash я и не заметил в статье
сам перешел на fish, попробуйте может понравится больше чем zshSibProgrammer
15.06.2023 16:43+1ничего специфического для bash я и не заметил в статье
И тем не менее оно есть ) Писать алиасы qcd, тренироваться с dirs, pushd/popd, жать два раза tab и т.п. становится совершенно не нужно, если пользоваться zsh/ohmyzsh или тем же fish.
сам перешел на fish, попробуйте может понравится больше чем zsh
Пробовал и перешел в итоге на ohmyzsh :) Это не совсем про ванильный zsh. У fish были свои плюсы в том, что ряд фичей работал сразу "из коробки", но ребята с ohmyzsh порешали эти вопросы.
Pinkerton42
15.06.2023 16:43+3Вот вам еще: набирали длинную команду в консоли, но что-то забыли и нужно выполнить что-то еще... добавляем в конце команды обратный слэш "\" (перенос строки), затем Ctrl+c и то что так долго набирали "осядет" в истории. Выполняем то, что забыли и стрелкой вверх возвращаемся к тому, что недонабирали.
kilobait3
15.06.2023 16:43Моя книга 2001г и очень выручила. Тираж у нее маленький 199 копий. Шляпа стала основным инструментом для работы на 7лет.
aegoroff
Зашел, купил электронный вариант - пытаюсь скачать - в заказе нет книг. Похоже на развод, когда они предлагают читать только на сайте - не ведитесь
SibProgrammer
Просто подождите немного, либо обратитесь в их техподдержку. Утверждения вида, что это "развод" и "предлагают читать только на сайте" - мягко говоря, неправда.
aegoroff
прошло 3 часа - все то же самое. В поддержку написал - нет ответа тот же самый срок. Да, понимаю что эмоциональная реакция, обычно в этом магазине все сразу появляется - такого не было до этого никогда. Разве что они могут приписать что мол чтение только на сайте и никак иначе, а ты этого не замечаешь при заказе - такое уже бывало и вот это уже не очень красиво
Sigest
У меня появилось через сутки.
aegoroff
Справедливости ради да, появилось - получается через 14 часов, - небыстро однако у них саппорт работает, но работает