
Я просто хочу написать сценарий, которыйизменяет мой каталог.
Я поместил следующие команды в файл/home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
Я сделал
chmod +x pathABC
В Терминале, находясь в /home/alex
, я запустил ./pathABC
, но вывод оказался просто HelloWorld
, а текущий каталог не изменился.
Так что же не так?
решение1
Как уже объясняли другие, каталог изменяется в дочернем процессе вашего скрипта, а не в терминальном процессе, из которого вызывается скрипт. После того, как дочерний процесс умирает, вы возвращаетесь в терминал, который остается там, где и был.
Несколько альтернатив:
1. Символическая ссылка
Добавьте в свой домашний каталог символическую ссылку на длинный путь, к которому вы хотите легко получить доступ.
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
затем войдите в каталог с помощью:
$ cd ~/pathABC
2. Псевдоним
Добавьте псевдоним в ваш ~/.bashrc:
alias pathABC="cd /home/alex/Documents/A/B/C"
(отздесь)
3. Функция
Создайте функцию, которая изменяет каталог, функция запускается в процессе вашего терминала и затем может изменить свой каталог.
(отздесь)
4. Избегайте бега в детстве
Источник вашего скрипта вместо его запуска. Источник (выполненный .
или source
) приводит к тому, что скрипт выполняется в той же оболочке, а не в его собственной подоболочке.
$ . ./pathABC
5. cd-способные переменные
Установите cdable_vars
параметр в вашем каталоге ~/.bashrc
и создайте переменную среды для этого каталога:
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
Тогда вы можете использоватьcd pathABC
(отздесь)
решение2
Когда вы запускаете скрипт в Терминале, запускается дочерний процесс. В этой дочерней программе, т.е. ваш скрипт изменится на указанный каталог. Но в родительском процессе, т.е. там, где вы запускаете скрипт, он все еще находится в старом пути. ИЛИ проще говоря:
Область действия команды cd распространяется только на дочерний процесс, а не на родительский.
решение3
Вы делаете ошибку мышления. В то время как текущийоболочкаостается в том же каталоге,сценарийпереехал в новый каталог.
Вы можете увидеть это, создав еще один скрипт вновыйкаталог и запуск его из вашего скрипта после того, как он сменил каталог:
#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)
Второй скрипт будет запущен из нового каталога.
HelloWorld
это всего лишь результат работы скрипта.
решение4
Использовать $SHELL
в конце
Скрипт bash работает в своей текущей среде или в среде своих дочерних элементов, но никогда в родительской среде.
Однако этот вопрос часто задают, потому что хочетсябыть оставленным в командной строке в определенном каталоге после выполненияскрипта из другого каталога.
Если это так, то простовыполнить дочерний $SHELL
экземплярв конце сценария:
# !/usr/bin/env bash
cd /home/alex/Documents/A/B/C
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL
Чтобы вернуться к предыдущему родительскому экземпляру оболочки, используйте Ctrl+ D.