Первоначальный вопрос: 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/
Почему происходит это? Почему изменение каталога разваливается, выйдя из рукописного шрифта?
Первоначальный приспособленный ответ Why doesn't “cd” work in в bash shell рукописный шрифт? Грега Хюджилл, переведенный из-за dabellan
Рукописный шрифт работает в субпроцессе, которым он имеет его собственную область работы (по умолчанию, начальный каталог - начальный каталог родительского процесса).
Команда cd
функционируй правильно, только, который каталог меняет только на область созданного субпроцесса: как только он заканчивает выполнение рукописного шрифта, процесс того же самого заканчивается и мы возвращаемся в процесс shell. Как shell никогда не изменил каталог, продолжи быть в первоначальном каталоге - и поэтому дай чувство того, что развалилось изменение.
Чтобы это объяснять я изменил слегка твой рукописный шрифт. Я создал файл a.txt внутри каталога другой каталог; этот файл не существует в каталоге, в котором я наставляю доказательство.
#!/bin/bash
cd otro-directorio
echo "Cambie de directorio!"
cat a.txt
pwd
ps ax | grep bash | grep -v grep
Я открываю конечную остановку с bash, и выполняю команды, которые ты видишь далее включая этот рукописный шрифт:
То, что происходит в системе 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.