Почему команда cd не работает в моей программе оболочки? - PullRequest
5 голосов
/ 18 сентября 2010

Когда я создал свою собственную оболочку, я не смог выполнить команду cd, которую я могу выполнить в оболочке Linux.Почему это так?

Ответы [ 3 ]

5 голосов
/ 18 сентября 2010

Это, вероятно, потому что команда cd должна быть встроена в оболочку, а не что-то внешнее и выполненное. Если внешняя команда изменила каталог, это не повлияет на родительскую оболочку. И нет команды /bin/cd или /usr/bin/cd.


Мне не понятна строка «Если внешняя команда изменила каталог, она не влияет на родительскую оболочку».

Обычно, когда оболочка выполняет команду, она выполняет fork(), а дочерний процесс использует exec() для выполнения команды, введенной пользователем. Например, если введенная команда 'ls /', оболочка организует выполнение /bin/ls с двумя аргументами ls и /. Однако, если выбранная команда выполняет системный вызов chdir(), это влияет на дочерний процесс, но не влияет на родительскую оболочку. Таким образом, оболочка должна обрабатывать саму команду cd, а не через fork() и exec().

Обратите внимание, что в DOS файл .BAT может выполнять cd, и это влияет на процесс cmd.exe. Этого не происходит в Unix - дочерний процесс не может влиять на текущий каталог родительского процесса.

2 голосов
/ 18 сентября 2010

Джонатан Леффлер объяснил, почему это так, но я хотел предложить обходной путь, если вам действительно нужна эта функциональность.В bash (вы не указали, поэтому я предполагаю), команда source может использоваться для выполнения сценария оболочки в процессе оболочки CURRENT.Я использую что-то похожее на приведенное ниже (хотя и более полное), наряду с псевдонимом оболочки, чтобы перейти к каталогам проектов и автоматически настроить среду:

~:$ cat $HOME/bin/goproj
#!/bin/bash
...
export SOMEVAR=someval
cd /home/foo/src/projects/"$1"
...

~:$ alias gp
alias gp="source $HOME/bin/goproj"

~:$ gp foo
~/src/projects/foo:$ echo $SOMEVAR
someval
~/src/projects/foo:$

Используя этот тип настройки, вы можете изменитьтекущая оболочка с тем, что существует в сценарии, который вы используете.Обратите внимание, что если вы запустите 'goproj' напрямую, это не сработает для той же проблемы, с которой вы уже столкнулись;Вы должны позвонить с source.

0 голосов
/ 20 ноября 2011

Это так же просто, как:

  • cd не является командой.

Попробуйте это:

- whereis ls

- whereis cd

(увидеть разницу)

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

Смотри так: когда выполняется ls, ему нужно знать pwd. Итак, это ваша пользовательская оболочка, которая будет обрабатывать каталог. Итак, это оболочка, которая должна поддерживать CD.

Кажется, я ясно дал понять.

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