Я просто хочу написать скрипт, который меняет мой каталог .
Я положил следующие команды в файл /home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
Я сделал chmod +x pathABC
.
В терминале, в то время как в /home/alex
, я бегу ./pathABC
, но вывод просто HelloWorld
и текущий каталог не изменяется.
Так что не так?
command-line
scripts
gnome-terminal
Мохаммед Реза Резвани
источник
источник
Ответы:
Как объяснили другие, каталог изменяется в дочернем процессе вашего скрипта, а не в терминальном процессе, из которого вызывается скрипт. После того, как дочерний процесс умирает, вы возвращаетесь в терминал, который остался там, где он был.
Несколько альтернатив:
1. Символическая ссылка
Поместите символическую ссылку в вашем доме на длинный путь, который вы хотите легко получить доступ
затем получить доступ к каталогу с помощью:
2. Псевдоним
Поместите псевдоним в ваш ~ / .bashrc:
( отсюда )
3. Функция
Создайте функцию, которая изменяет каталог, функция запускается в процессе работы вашего терминала и затем может изменить свой каталог.
( отсюда )
4. Избегайте бега в детстве
Источник ваш сценарий вместо того, чтобы запустить его. Sourcing (выполняется с помощью
.
илиsource
) приводит к тому, что скрипт выполняется в той же оболочке, а не в своей собственной подоболочке.( отсюда и здесь )
5. CD-способные Vars
Установите
cdable_vars
параметр в вашем~/.bashrc
и создайте переменную окружения для каталога:Тогда вы можете использовать
cd pathABC
( отсюда )
источник
source
! Я всегда задавался вопросом, почему я делаю,source .bashrc
а неbash .bashrc
cd $pathABC
?Когда вы запускаете скрипт в терминале, запускается дочерний процесс. В этой дочерней программе, т. Е. Ваш сценарий изменится на любой указанный каталог. Но в родительском процессе, то есть в том месте, где вы запускаете скрипт, он все еще находится на старом пути. ИЛИ просто мы можем сказать:
The scope of cd command is only for child process not parent
источник
. pathABC
либоsource pathABC
.Вы делаете ошибку мышления. Пока текущая оболочка находится в том же каталоге, сценарий перемещен в новый каталог.
Вы можете увидеть это, создав другой сценарий в новом каталоге и запустив его из своего сценария после того, как он сменит каталог:
Второй скрипт будет запускаться из нового каталога.
это просто вывод скрипта.
источник
pwd
новый каталог, вместо того, чтобы добавлять в ситуацию совершенно новый сценарий.Поскольку hello world - это просто след, давайте попробуем это:
Создайте файл сценария bash,
cd.sh
содержащий:.sh
Расширение старой конвенции дает Баш скрипт для имен файлов расширения. Это чисто косметическое и обычно ненужное. Однако в этом случае важно отличаться от основнойcd
команды.Отметьте исполняемый файл bash-скрипта, используя:
Теперь запустите файл:
cd
мы все знаем.$(...)
выполняет команду в круглых скобках и возвращает вывод.cd.sh
был на вашем пути, вам не нужно указывать, где он находится. Мы префикс с,./
чтобы указать, что команда находится в текущем каталоге.echo
Выход изcd.sh
сценария отправляется обратно к родителю через$(...)
. Родитель (наша подсказка оболочки) использует этот вывод и передает его команде Linuxcd
.Как уже упоминали другие, дочерний процесс не может изменить каталог родителя. Это один из способов, которым ребенок может сказать родителю, куда идти после завершения процесса.
источник
14.04
версия, которую я прочитал около часа назад или около того?cd /home/mike/Documents/A/B/C
которая не производила никакого вывода. Теперь этоecho "/home/mike/Documents/A/B/C"
, который производит продукцию../cd.sh
это сейчас,cd $(./cd.sh)
но оно выполняет задачу дочернего элемента, изменяя текущий каталог родителя. Да, это нетрадиционно, но это еще один способ сделать это, я надеюсь, что люди найдут интересным.