Почему «cd» не работает в сценарии оболочки? - PullRequest
685 голосов
/ 01 ноября 2008

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

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

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

Ответы [ 29 ]

12 голосов
/ 01 ноября 2008

Когда вы запускаете сценарий оболочки, он запускает новый экземпляр этой оболочки (/bin/bash). Таким образом, ваш скрипт просто запускает оболочку, меняет каталог и завершает работу. Другими словами, cd (и другие подобные команды) внутри сценария оболочки не влияют и не имеют доступа к оболочке, из которой они были запущены.

9 голосов
/ 14 сентября 2012

В моем конкретном случае мне нужно было слишком много раз переходить на один и тот же каталог. Так что на моем .bashrc (я использую Ubuntu) я добавил

1 -

$ nano ~. / Bashrc

 function switchp
 {
    cd /home/tree/projects/$1
 }

2-

$ source ~ / .bashrc

3 -

$ switchp java

Непосредственно это будет делать: CD / дома / дерево / проекты / Java

Надеюсь, это поможет!

9 голосов
/ 01 ноября 2008

Вы можете сделать следующее:

#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash

РЕДАКТИРОВАТЬ: Это также может быть 'пунктирной', чтобы предотвратить создание последующих оболочек.

Пример:

. ./previous_script  (with or without the first line)
7 голосов
/ 01 ноября 2008

Изменяет только каталог для самого скрипта, в то время как ваш текущий каталог остается прежним.

Вместо этого вы можете использовать символическую ссылку . Это позволяет вам сделать «ярлык» для файла или каталога, так что вам нужно всего лишь набрать что-то вроде cd my-project.

7 голосов
/ 03 ноября 2008

Вы можете объединить псевдоним и скрипт,

alias proj="cd \`/usr/bin/proj !*\`"

при условии, что скрипт повторяет путь назначения. Обратите внимание, что это обратные черты вокруг имени скрипта.

Например, ваш скрипт может быть

#!/bin/bash
echo /home/askgelal/projects/java/$1

Преимущество этого метода в том, что сценарий может принимать любое количество параметров командной строки и выдавать различные пункты назначения, рассчитанные, возможно, сложной логикой.

5 голосов
/ 09 февраля 2012

Вы можете комбинировать псевдонимы и точечные подходы Адама и Грега, чтобы сделать что-то более динамичное -

alias project=". project"

Теперь при запуске псевдонима проекта будет выполняться сценарий проекта в текущей оболочке, а не подоболочка.

5 голосов
/ 02 ноября 2008

для быстрой навигации по каталогам, есть $ CDPATH, cdargs и способы автоматической генерации псевдонимов

http://jackndempsey.blogspot.com/2008/07/cdargs.html

http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html

3 голосов
/ 24 марта 2013

Вы можете использовать оператор &&:

cd myDirectory && ls

3 голосов
/ 19 августа 2013

В вашем файле ~ / .bash_profile. добавить следующую функцию

move_me() {
    cd ~/path/to/dest
}

Перезапустите терминал, и вы можете набрать

move_me 

, и вы будете перемещены в папку назначения.

3 голосов
/ 01 февраля 2014

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

Другим способом является реализация вашего скрипта как функции в bash.

function cdbm() {
  cd whereever_you_want_to_go
  echo "Arguments to the functions were $1, $2, ..."
}

Этот метод используется autojump: http://github.com/joelthelion/autojump/wiki, чтобы обеспечить вас изучением закладок каталога оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...