8

Почему не удается изменить директорию с помощью "cd" в скрипте?

8

Я пытаюсь написать небольшой скрипт, который изменяет текущую директорию на директорию моего проекта:

#!/bin/bash
cd /home/tree/projects/java

Я сохранил этот файл как proj, добавил права на выполнение с помощью chmod и скопировал его в /usr/bin. Когда я вызываю его с помощью команды proj, ничего не происходит. В чем может быть ошибка?

5 ответ(ов)

7

Скрипты оболочки выполняются в дочерних оболочках, и каждая дочерняя оболочка имеет собственное представление о текущем каталоге. Команда cd выполняется успешно, но как только дочерняя оболочка завершает работу, вы возвращаетесь в интерактивную оболочку, и ничего в ней не изменяется.

Один из способов обойти это — использовать алиас вместо этого:

alias proj="cd /home/tree/projects/java"
5

Вы ничем не ошибаетесь! Вы изменили директорию, но только в пределах подсистемы, в которой выполняется скрипт.

Вы можете запустить скрипт в текущем процессе с помощью команды "точка":

. proj

Но я бы предпочел предложение Грега использовать алиас в этом простом случае.

2

cd в вашем скрипте технически сработал, так как он изменил директорию оболочки, которая выполняла скрипт, но это была отдельная задача, создаваемая от вашей интерактивной оболочки.

Совместимый с Posix способ решения этой проблемы — определить процедуру оболочки, а не исполнять скрипт команд.

jhome () {
  cd /home/tree/projects/java
}

Вы можете просто ввести это в командной строке или добавить в один из различных файлов инициализации оболочки.

1

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

./myscript.sh

используйте

. ./myscript.sh

(Обратите внимание на точку и пробел перед именем скрипта.)

1

Чтобы создать bash-скрипт, который будет переходить в выбранный каталог, выполните следующие шаги:

  1. Создайте файл скрипта, например, /scripts/cdjava:
#!/bin/sh
# файл: /scripts/cdjava
#
cd /home/askgelal/projects/java
  1. Затем создайте псевдоним в файле инициализации (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, и вы там!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь