Почему не функционирует команда “cd” в рукописном шрифте bash?

Первоначальный вопрос: Why doesn't “cd” work in в bash shell рукописный шрифт? ashokgelal

Если я верю в такой рукописный шрифт как следующий:

#!/bin/bash
cd otro-directorio
echo "Cambie de directorio!"
pwd

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

$ pwd
/home/usuario/
$ cat mi_script
#!/bin/bash
cd otro-directorio
$ ./mi_script
$ pwd
Cambie de directorio
/home/usuario/otro-directorio
$ pwd
/home/usuario/

Почему происходит это? Почему изменение каталога разваливается, выйдя из рукописного шрифта?

1
задан 23.05.2017, 15:39
3 ответа

Первоначальный приспособленный ответ Why doesn't “cd” work in в bash shell рукописный шрифт? Грега Хюджилл, переведенный из-за dabellan

Рукописный шрифт работает в субпроцессе, которым он имеет его собственную область работы (по умолчанию, начальный каталог - начальный каталог родительского процесса).

Команда cd функционируй правильно, только, который каталог меняет только на область созданного субпроцесса: как только он заканчивает выполнение рукописного шрифта, процесс того же самого заканчивается и мы возвращаемся в процесс shell. Как shell никогда не изменил каталог, продолжи быть в первоначальном каталоге - и поэтому дай чувство того, что развалилось изменение.

3
ответ дан 01.12.2019, 08:13
  • 1
    #191; что-то плохое Есть в ответе? –  mgarciaisaia 23.12.2015, 18:47
  • 2
    Вероятно не, но люди кладутся demsaiado специально с вопросами и ответами, переведенными иногда, я рекомендую тебе конвертировать ответ в wiki сообщества, чтобы предотвратить отрицательные обеты –  Carlos Muñoz 23.12.2015, 19:07
  • 3
    Нет совсем не плохого, но как вопрос, так и ответ - копии SO на английском. С моей стороны я рекомендовал конвертировать оба в wiki, так как нет вклада t и # 233; cnico (не, если смогли в вопросе) –  JuanK 23.12.2015, 19:42

Чтобы это объяснять я изменил слегка твой рукописный шрифт. Я создал файл a.txt внутри каталога другой каталог; этот файл не существует в каталоге, в котором я наставляю доказательство.

#!/bin/bash
cd otro-directorio
echo "Cambie de directorio!"
cat a.txt
pwd
ps ax | grep bash | grep -v grep

Я открываю конечную остановку с bash, и выполняю команды, которые ты видишь далее включая этот рукописный шрифт:

introducir la descripción de la imagen aquí

То, что происходит в системе UNIX (и оно последует за чем-то сходным в других системах), когда я открываю конечную остановку bash, состоит в том, что бросается процесс bash, что в этом случае есть идентификатор у 7546.
У всех процессов есть несколько общих элементов, между ними настоящий каталог.

Поскольку мы можем видеть с командой ps есть единственного процесса так называемый bash в выполнении, начавшись.

Выполнив mi_script.sh то, что он делает bash, так это вызов системы fork() которая создает другой порожденный процесс (7971) и - на этом процессе, на котором работает рукописный шрифт. У этого процесса как все процессы есть Ваш particulare настоящий каталог. Когда процесс создается, получи в наследство настоящий каталог и вывод estandard от Вашего отца (7546), поэтому начни в том же каталоге, что был Ваш отец, и поэтому Ваш вывод выходит из-за того же сайта, что и в отце.

Выполнив cd мы меняем настоящий каталог процесса 7971. Но это не касается никакого другого процесса. Поэтому процесс 7546 продолжает быть в том же каталоге, который был.
Изменение да, у которого есть эффекты на 7971, как мы можем видеть в тот факт, что он показывает контент файла /home/test/otro-directorio/a.txt.
Когда мы делаем ps с процесса 7971, мы можем видеть, что есть два процесса bash, сын (7971) и отец (7546). Он выполнил последний wait(int* status) и надейся на то, что сын заканчивается.

Когда процесс bash сын заканчивает Вашу работу, позвони в exit(int), операционная система разрушает процесс и отец узнает, закончившись wait и продолжи Ваше выполнение. Ваш настоящий каталог продолжает быть/home/test.

Чтобы менять настоящий каталог, не бросая другого процесса используй прозвище
Издай твой файл .bashrc и добавь эту линию:

alias cdo='cd /home/test/otro-directorio' 

.bashrc он загружается каждый раз, когда ты бросаешь терминал bash. Когда пишут прозвище cdo ты изменишься в этот каталог, не бросая другого процесса bash.

2
ответ дан 01.12.2019, 08:13

Хороший, поскольку они сказали многие тебе, он, потому что ejectura в субпроцессе отца, чтобы мочь выполнять это в процессе отца прямо, выполнив это, он использует source

Пример:

$source script
1
ответ дан 01.12.2019, 08:13