Як Bash може виконати команду в іншому контексті каталогу?


94

У мене є загальна команда, яка викликається з дуже конкретних каталогів. У / bin для цієї програми сидить лише один виконуваний файл, і поточний робочий каталог дуже важливий для правильного її запуску. Сценарій впливає на файли, що знаходяться всередині каталогу, в якому він запущений.

Тепер у мене також є спеціальний сценарій оболонки, який виконує деякі дії в одному каталозі, але мені потрібно викликати цю команду, згадану вище, як якщо б вона була в іншій директорії.

Як це зробити у сценарії оболонки?


Відповіді:


39

Для цього ви можете використовувати cdвбудований або, pushdі popdвбудований. Наприклад:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

Ви використовуєте вбудовані елементи, як і будь-яку іншу команду, і можете змінювати контекст каталогу скільки завгодно разів у сценарії.


4
Також cd -є оболонка POSIX для повернення до попереднього каталогу. Тим не менш, (а) pushdі popdнасправді призначені для інтерактивного використання, і (б) не завжди можна вважати, що ви можете cdповернутися туди, з чого почали, особливо в складних підсистемах, які можуть використовувати обмежувальні дозволи всередині (див. Stackoverflow.com/questions/ 10555284 /… ).
geekosaur

3
Використання підшелушки є набагато кращим рішенням
josh123a123

Що стосується сценаріїв, підшарка, мабуть, є кращою ідеєю .. Однак я дуже рада дізнатися про це popd.
connorbode

Ви можете пояснити, що :тут означає символ?
Вадим Котов

2
@VadimKotov Я думаю, що це фактично заборона. Відповідний розділ man bashчитає: : [arguments]Без ефекту; команда не робить нічого, окрім розширення аргументів та виконання будь-яких зазначених переспрямувань. Статус повернення дорівнює нулю.
boycy

218

Використання cdв підшелупці; скорочений спосіб використання цього виду підшелупки - це дужки.

(cd wherever; mycommand ...)

Тим не менш, якщо у вашої команди є середовище, яке їй потрібно, вона дійсно повинна забезпечити це середовище, замість того, щоб покласти на себе те, що може захотіти його використовувати (якщо це не внутрішня команда, яка використовується в дуже конкретних обставинах в контексті свердловини визначена більша система, така що будь-якому абоненту вже потрібно забезпечити необхідне середовище). Зазвичай це буде якась обгортка сценарію оболонки.


Ви також можете вставити \після кожного ;для багаторядкових команд в одному контексті.
Chiramisu


20

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

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. Ми встановлюємо змінну, current_dirрівну вашійpwd
  2. після цього ми вирушимо cdтуди, де вам потрібно виконати свою команду
  3. тоді ми запускаємо команду
  4. тоді ми cdповернемося до нашої змінноїcurrent_dir

Ще одне рішення @apieceofbart pushd && YOUR COMMAND && popd


4
або ти міг би зробитиpushd && YOUR COMMAND && pulld
apieceofbart

4
@apieceofbart Я думаю, ви мали на увазі popdзамість pulld.
Костянтин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.