Почему команда «cd» не работает в сценарии оболочки?

Убунту 16

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

Команда cd не работает в сценарии оболочки, поскольку сценарий выполняется в собственной подоболочке, отдельной от родительской оболочки. Любые изменения, внесенные в текущий каталог в сценарии, влияют только на подоболочку, а не на родительскую оболочку. Однако существует несколько обходных путей для изменения каталога в родительской оболочке, таких как создание символических ссылок, определение псевдонимов, использование функций, получение сценария или использование параметра cdable_vars.

Понимание среды Shell

Прежде чем мы углубимся в особенности команды cd, важно понять среду оболочки. Когда вы выполняете сценарий оболочки, он запускается в своей собственной подоболочке, которая является дочерним процессом родительской оболочки, из которой он был запущен.

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

Команда «cd» в сценарии оболочки

Команда cd (change directory) используется для изменения текущего рабочего каталога в оболочке. Синтаксис компакт-диска [directory]где [directory] это путь к каталогу, в который вы хотите перейти.

Например, cd /home/user/Documents изменяет текущий каталог на /home/user/Documents. Если каталог не указан, cd переходит в домашний каталог текущего пользователя.

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

Обходные пути для использования «cd» в сценарии оболочки

Есть несколько способов добиться желаемого эффекта от смены каталога в родительской оболочке:

1. Символическая ссылка

Создайте символическую ссылку на нужный каталог в вашем домашнем каталоге. Например, ln -s /home/user/Documents/ABC ~/pathABC создает символическую ссылку pathABC в домашнем каталоге, которая указывает на /home/user/Documents/ABC. Затем вы можете перейти в этот каталог, используя cd ~/pathABC.

2. Псевдоним

Определите псевдоним в файле ~/.bashrc. Например, псевдоним pathABC=”cd /home/user/Documents/ABC” позволяет использовать pathABC для перехода в нужный каталог. Не забудьте запустить исходный файл ~/.bashrc или открыть новую оболочку, чтобы применить изменения.

3. Функция

Создайте в своем скрипте функцию, которая изменяет каталог. Например:

go_to_ABC() { cd /home/user/Documents/ABC}

Вы можете вызвать эту функцию перед выполнением любых операций в этом каталоге.

4. Источник сценария

Вместо того, чтобы запускать скрипт как отдельный процесс, создайте его с помощью . ./script.sh или исходный файл script.sh. Это выполняет сценарий в той же оболочке, позволяя сохранить изменение каталога.

5. переменные с возможностью перезарядки

Установите параметр cdable_vars в файле ~/.bashrc и экспортируйте переменную среды в нужный каталог. Например:

shopt -s cdable_vars export pathABC=”/home/user/Documents/ABC”

Затем вы можете использовать cd pathABC для перехода в этот каталог.

Заключение

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

Помните, что понимание среды оболочки и того, как в ней работают команды, имеет решающее значение для эффективного написания сценариев оболочки. Удачного написания сценариев!

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

Существует несколько обходных путей для изменения каталога в родительской оболочке из сценария оболочки. Вы можете создать символическую ссылку на нужный каталог в вашем домашнем каталоге, определить псевдоним в вашем файле ~/.bashrc, создать функцию в вашем скрипте, которая изменяет каталог, получить скрипт, используя . ./script.sh или исходный файл script.sh, либо установите параметр cdable_vars в файле ~/.bashrc и экспортируйте переменную среды в нужный каталог.

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

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

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *