Багато користувачів Linux, можливо, ніколи не стикалися з командами pushd та popd, хоча вони є стандартною частиною системи. Ці інструменти можуть значно покращити швидкість навігації між каталогами у командному рядку. Давайте розглянемо, як їх ефективно використовувати.
Що являють собою pushd та popd?
У 1978 році, Білл Джой впровадив у свою C оболонку концепцію стеку каталогів, а також інструменти для його обробки – pushd та popd. Згодом, інші оболонки (такі як Bash) та навіть різні операційні системи перейняли цю ідею.
Концепція стека досить проста: елементи додаються один за одним, причому останній доданий елемент завжди опиняється на вершині. Коли елементи вилучаються зі стеку, вони знімаються у зворотному порядку, починаючи з вершини. Такий тип стеку часто називають чергою “останній прийшов, перший пішов” (LIFO).
На практиці, pushd та popd мають трохи більше можливостей, але ця модель є гарною відправною точкою для розуміння їхньої роботи.
Оскільки ми говоримо про стек каталогів, не дивно, що літера “d” в назвах команд pushd та popd означає “directory” (каталог). Ці команди дозволяють додавати каталоги до стеку або вилучати їх з нього.
Але як це може бути нам корисним?
Як pushd наповнює стек
Використання команди pushd призводить до трьох дій:
- Відбувається перехід до зазначеного каталогу, аналогічно команді cd.
- Назва та шлях до каталогу додаються до стеку.
- Стек відображається у вигляді списку каталогів, розділених пробілами.
У прикладах нижче, зверніть увагу, як стек каталогів збільшується з кожною новою командою pushd. Важливо також, що початок стеку (ліворуч) – це місце, куди додаються нові записи.
Після першої команди pushd стек містить два записи: каталог, з якого ви перейшли, та каталог, до якого ви перейшли.
Наприклад, ми вводимо наступне:
pushd ~/Desktop
pushd ~/Music
pushd ~/Documents
pushd ~/Pictures
pushd ~
Остання команда pushd повернула нас до нашого домашнього каталогу, тому першим і останнім записом у стеку є тильда (~), що позначає наш домашній каталог. Це демонструє, що навіть якщо каталог вже є у стеку, він буде доданий знову при виконанні інших команд pushd.
Зверніть увагу, що крайній лівий запис у стеку, який є останнім доданим записом, завжди відповідає поточному каталогу.
Команда dirs
Для відображення стеку каталогів можна використовувати команду dirs:
dirs
Це не змінює стек, а лише відображає його вміст. Деякі параметри, які можна використовувати з командою pushd, стосуються позицій каталогів у стеку.
Для відображення числової позиції кожного каталогу можна використовувати параметр -v (vertical):
dirs -v
Якщо ви хочете бачити повний шлях до домашнього каталогу замість тильди (~), використовуйте параметр -l (long format):
dirs -v -l
Додавання каталогу до стека без переходу
Як ми вже з’ясували, команда pushd виконує три дії: перехід у каталог, додавання каталогу до стеку та відображення стеку. За допомогою параметра -n (no rotation) можна додати каталог до стеку без зміни поточного каталогу.
Поглянемо на наш поточний стек каталогів:
dirs -v -l
Тепер використаємо команду pushd з параметром -n та додамо каталог /home/dave. Потім перевіримо стек каталогів ще раз.
Вводимо наступне:
pushd -n /home/dave
dirs -v -l
Каталог /home/dave було додано до стеку на позицію 1, що є другою позицією у стеку. Він не може зайняти першу позицію, оскільки нульова позиція завжди відведена поточному каталогу.
Оскільки ми не покидали поточний каталог ~/Videos, його позиція у стеку не змінилася.
Перехід до каталогу шляхом обертання стека
За допомогою числових параметрів pushd можна переходити до будь-якого каталогу у стеку, при цьому стек буде обертатися. Каталог, до якого ви перейшли, стане першим записом у стеку.
Звертання до каталогів у стеку відбувається за їхньою числовою позицією. Можна рахувати як від початку, так і від кінця стеку. Додатні числа, наприклад +3, відраховують позиції від початку, а від’ємні числа, наприклад -2, відраховують позиції від кінця.
Каталог /home/dave/Documents знаходиться на третій позиції. За допомогою наступної команди ми можемо переміститися до цього каталогу:
pushd +3
Каталоги у стеку над обраним нами каталогом перемістилися до кінця стеку. Обраний каталог тепер є першим записом, і ми перемістилися до нього.
Якщо ми хочемо перейти до каталогу в кінці стеку, можна використовувати таку команду:
pushd -0
Останній каталог перемістився на першу позицію, а всі інші перемістилися нижче у стеку. Ми перейшли до каталогу ~/Pictures.
Команда popd
Команда popd використовується для видалення каталогів зі стеку.
Якщо поглянути на стек каталогів, то побачимо, що каталог на позиції 1 – це /home/dave. Щоб видалити його зі стеку, потрібно передати його числову позицію в popd:
dirs -v -l
popd +1
Каталог /home/dave було видалено, а каталоги, що були під ним, перемістилися на одну позицію вгору.
Аналогічно pushd, у команді popd можна рахувати з кінця стеку. Для видалення останнього каталогу зі стеку, вводимо:
popd -0
Каталог ~/Music видаляється з останньої позиції у стеку.
Для зміни каталогу, виконання певних дій, а потім повернення до попереднього каталогу можна використовувати pushd та popd разом.
Використаємо pushd для переходу до іншого каталогу, а popd для видалення верхнього каталогу у стеку та переходу до каталогу на другій позиції. Це буде каталог, з якого ми щойно перейшли, тож ми знову опинимося в початковому каталозі.
Вводимо:
pushd ~
popd
Ми почали в каталозі ~/Projects, перейшли з pushd до домашнього каталогу, а потім з popd повернулися назад до ~/Projects.
Обертання по всьому стеку
Давайте проілюструємо обертання по стеку за допомогою вкладених каталогів, але ви можете використовувати будь-які каталоги у будь-якому місці файлової системи.
Наш найглибший рівень вкладеності:
/home/dave/Projects/htg/articles
З домашнього каталогу ми будемо поступово спускатися по кожному каталогу, доки не дійдемо до каталогу статей. Потім поглянемо на стек каталогів.
Вводимо:
pushd ~/Projects
pushd htg
pushd articles
dirs -v -l
Повторно виконуючи команду pushd +1, можна циклічно обертатися по стеку каталогів. Якщо ви робите це часто, pushd +1 стане гарним кандидатом для псевдоніма.
Введіть наступне:
pushd +1
Перезапис стеку
Легко повернутися до старих звичок і використовувати команду cd для зміни каталогу. Якщо ви так зробите, то перезапишете перший каталог у стеку. Це неминуче, оскільки перший слот зарезервований для поточного робочого каталогу, і жоден з інших не змінює його позицію.
Для демонстрації введіть:
dirs -v -l
cd ~/Music
dirs -v -l
Після того, як ви звикнете до команд pushd та popd (і, можливо, скористаєтеся ними для створення кількох псевдонімів), ви отримаєте дуже швидкий спосіб переміщення між каталогами.
Ось чому ми так любимо командний рядок. Ефективність має значення, чи не так?