Что не так с этим простым скриптом? Я просто хочу написать скрипт, который меняет мой каталог:
A. Я помещал ниже команды в файл, где его имя меняет каталог в каталоге /home/alex,
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
B. также я сделал chmod +x pathABC. На терминале, когда я нахожусь в каталоге /home/alex, я запускаю ./pathABC.
Но выход - это просто ./pathABC , и текущий каталог остается без изменений. Я имею в виду, что мой каталог остается как /home/alex, а не ходит в /home/alex/Documents/A/B/C.
Итак, где не так?
Как объяснили другие, каталог изменяется в дочернем процессе вашего скрипта, а не в терминальном процессе, из которого вызывается сценарий. После того, как дочерний процесс умирает, вы вернулись в терминал, который остался там, где он был.
Несколько альтернатив:
1. Символическая ссылка
Поместите символическую ссылку в свой дом на длинный путь, к которому вы хотите легко получить доступ
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
, затем войдите в каталог с помощью:
$ cd ~/pathABC
1. Символическая ссылка
Поместите псевдоним в ваш ~ / .bashrc:
alias pathABC="cd /home/alex/Documents/A/B/C"
(отсюда)
3. Функция
Создает функцию, которая изменяет каталог, функция запускается в процессе вашего терминала и может затем изменить его каталог.
(из здесь )
3. Функция
Исправьте свой скрипт вместо его запуска. Sourcing (выполняется . или source) заставляет сценарий запускаться в одной и той же оболочке вместо запуска в своей собственной подоболочке.
$ . ./pathABC
(отсюда и здесь)
5. cd-able vars
Установите параметр cdable_vars в ~/.bashrc и создайте в каталоге переменную среды:
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
Затем вы можете использовать cd pathABC
(из здесь )
Как объяснили другие, каталог изменяется в дочернем процессе вашего скрипта, а не в терминальном процессе, из которого вызывается сценарий. После того, как дочерний процесс умирает, вы вернулись в терминал, который остался там, где он был.
Несколько альтернатив:
1. Символическая ссылка
Поместите символическую ссылку в свой дом на длинный путь, к которому вы хотите легко получить доступ
$ ln -s /home/alex/Documents/A/B/C ~/pathABC
, затем войдите в каталог с помощью:
$ cd ~/pathABC
1. Символическая ссылка
Поместите псевдоним в ваш ~ / .bashrc:
alias pathABC="cd /home/alex/Documents/A/B/C"
(отсюда)
3. Функция
Создает функцию, которая изменяет каталог, функция запускается в процессе вашего терминала и может затем изменить его каталог.
(из здесь )
3. Функция
Исправьте свой скрипт вместо его запуска. Sourcing (выполняется . или source) заставляет сценарий запускаться в одной и той же оболочке вместо запуска в своей собственной подоболочке.
$ . ./pathABC
(отсюда и здесь)
5. cd-able vars
Установите параметр cdable_vars в ~/.bashrc и создайте в каталоге переменную среды:
shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"
Затем вы можете использовать cd pathABC
(из здесь )
Вы делаете ошибку мышления. Хотя текущий терминал остается в том же каталоге, сценарий переместился в новый каталог.
Вы могли видеть это, создав еще один скрипт в каталоге terminal и добавив его в ваш скрипт после изменения каталога:
#!/bin/sh
cd /home/alex/Documents/A/B/C&&./another_script.sh (if it is executable)
Скрипт (второй) будет запускаться из нового каталога.
HelloWorld
- это только результат скрипта. [ ! d6]
Когда вы запускаете скрипт в терминале, выполняется дочерний процесс. В этой дочерней программе, т. Е. Ваш скрипт изменится на любой указанный каталог. Но в родительском процессе, т.е. где вы запускаете скрипт, все еще находится в старом пути. ИЛИ просто мы можем сказать:
The scope of cd command is only for child process not parent
Вы делаете ошибку мышления. Хотя текущий терминал остается в том же каталоге, сценарий переместился в новый каталог.
Вы могли видеть это, создав еще один скрипт в каталоге terminal и добавив его в ваш скрипт после изменения каталога:
#!/bin/sh
cd /home/alex/Documents/A/B/C&&./another_script.sh (if it is executable)
Скрипт (второй) будет запускаться из нового каталога.
HelloWorld
- это только результат скрипта. [ ! d6]
Когда вы запускаете скрипт в терминале, выполняется дочерний процесс. В этой дочерней программе, т. Е. Ваш скрипт изменится на любой указанный каталог. Но в родительском процессе, т.е. где вы запускаете скрипт, все еще находится в старом пути. ИЛИ просто мы можем сказать:
The scope of cd command is only for child process not parent