Сценарий не будет запускаться [dублировать]

Что не так с этим простым скриптом? Я просто хочу написать скрипт, который меняет мой каталог:

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.

Итак, где не так?

37
задан 10 November 2017 в 17:38

6 ответов

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

Несколько альтернатив:

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

(из здесь )

67
ответ дан 18 July 2018 в 03:38

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

Несколько альтернатив:

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

(из здесь )

67
ответ дан 24 July 2018 в 17:53

Вы делаете ошибку мышления. Хотя текущий терминал остается в том же каталоге, сценарий переместился в новый каталог.

Вы могли видеть это, создав еще один скрипт в каталоге terminal и добавив его в ваш скрипт после изменения каталога:

#!/bin/sh cd /home/alex/Documents/A/B/C&&./another_script.sh (if it is executable)

Скрипт (второй) будет запускаться из нового каталога.

HelloWorld

- это только результат скрипта. [ ! d6]

4
ответ дан 18 July 2018 в 03:38

Когда вы запускаете скрипт в терминале, выполняется дочерний процесс. В этой дочерней программе, т. Е. Ваш скрипт изменится на любой указанный каталог. Но в родительском процессе, т.е. где вы запускаете скрипт, все еще находится в старом пути. ИЛИ просто мы можем сказать:

The scope of cd command is only for child process not parent

7
ответ дан 18 July 2018 в 03:38

Вы делаете ошибку мышления. Хотя текущий терминал остается в том же каталоге, сценарий переместился в новый каталог.

Вы могли видеть это, создав еще один скрипт в каталоге terminal и добавив его в ваш скрипт после изменения каталога:

#!/bin/sh cd /home/alex/Documents/A/B/C&&./another_script.sh (if it is executable)

Скрипт (второй) будет запускаться из нового каталога.

HelloWorld

- это только результат скрипта. [ ! d6]

4
ответ дан 24 July 2018 в 17:53
  • 1
    HelloWorld не «возвращен». к исходной оболочке, он выводится на стандартный вывод – Mog 11 June 2014 в 17:01

Когда вы запускаете скрипт в терминале, выполняется дочерний процесс. В этой дочерней программе, т. Е. Ваш скрипт изменится на любой указанный каталог. Но в родительском процессе, т.е. где вы запускаете скрипт, все еще находится в старом пути. ИЛИ просто мы можем сказать:

The scope of cd command is only for child process not parent

7
ответ дан 24 July 2018 в 17:53
  • 1
    Добавляя к этому @alex для достижения эффекта, который вы ищете, выполните сценарий внутри родительского процесса, используя его: либо . pathABC, либо source pathABC. – zwets 11 June 2014 в 14:26

Другие вопросы по тегам:

Похожие вопросы: