Использовать $SHELLв конце

Использовать $SHELLв конце

Я просто хочу написать сценарий, которыйизменяет мой каталог.

Я поместил следующие команды в файл/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.

Связанный контент