Почему не удается изменить директорию с помощью "cd" в скрипте?
Я пытаюсь написать небольшой скрипт, который изменяет текущую директорию на директорию моего проекта:
#!/bin/bash
cd /home/tree/projects/java
Я сохранил этот файл как proj
, добавил права на выполнение с помощью chmod
и скопировал его в /usr/bin
. Когда я вызываю его с помощью команды proj
, ничего не происходит. В чем может быть ошибка?
5 ответ(ов)
Скрипты оболочки выполняются в дочерних оболочках, и каждая дочерняя оболочка имеет собственное представление о текущем каталоге. Команда cd
выполняется успешно, но как только дочерняя оболочка завершает работу, вы возвращаетесь в интерактивную оболочку, и ничего в ней не изменяется.
Один из способов обойти это — использовать алиас вместо этого:
alias proj="cd /home/tree/projects/java"
Вы ничем не ошибаетесь! Вы изменили директорию, но только в пределах подсистемы, в которой выполняется скрипт.
Вы можете запустить скрипт в текущем процессе с помощью команды "точка":
. proj
Но я бы предпочел предложение Грега использовать алиас в этом простом случае.
cd
в вашем скрипте технически сработал, так как он изменил директорию оболочки, которая выполняла скрипт, но это была отдельная задача, создаваемая от вашей интерактивной оболочки.
Совместимый с Posix способ решения этой проблемы — определить процедуру оболочки, а не исполнять скрипт команд.
jhome () {
cd /home/tree/projects/java
}
Вы можете просто ввести это в командной строке или добавить в один из различных файлов инициализации оболочки.
cd
выполняется в оболочке скрипта. Когда скрипт завершается, эта оболочка выходит, и вы остаетесь в той директории, в которой были. Вместо того чтобы просто запускать скрипт, выполните его с помощью команды source
. Вместо:
./myscript.sh
используйте
. ./myscript.sh
(Обратите внимание на точку и пробел перед именем скрипта.)
Чтобы создать bash-скрипт, который будет переходить в выбранный каталог, выполните следующие шаги:
- Создайте файл скрипта, например,
/scripts/cdjava
:
#!/bin/sh
# файл: /scripts/cdjava
#
cd /home/askgelal/projects/java
- Затем создайте псевдоним в файле инициализации (startup file), например, в
/scripts/mastercode.sh
:
#!/bin/sh
# файл: /scripts/mastercode.sh
#
alias cdjava='. /scripts/cdjava'
Я создал файл инициализации, куда помещаю все свои псевдонимы и пользовательские функции. После этого я подключаю этот файл в свой .bashrc
, чтобы загружать его при каждом запуске терминала.
Например, создайте файл для псевдонимов и функций: /scripts/mastercode.sh
(поместите там ваш псевдоним).
Затем добавьте в конце вашего .bashrc
следующую строку:
source /scripts/mastercode.sh
Теперь вам легко перейти в каталог с Java — просто введите cdjava
, и вы там!
Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Определение переменной с экспортом или без него
Как использовать 'grep' для непрерывного потока?
Как изменить цвет вывода echo в Linux
Как работает "cat << EOF" в bash?