Комментарии 18
Точки в MySQL :)
0
Хмм…
1. «Вообще, в *nix нигде не хранится путь до рабочего каталога процесса, а вместо этого для каждого процесса система запоминает inode (идентификатор файла) текущего и корневого каталогов. Когда где-нибудь требуется путь, он вычисляется последовательными переходами вверх по файловой иерархии, от текущего каталога, до корня, запоминая каждый шаг.»
Linux конечно не unix, однако в /proc/idПроцесса путь хранится в виде симлинка exec
Кроме того у Вас не указано, что же такое linkylink?
1. «Вообще, в *nix нигде не хранится путь до рабочего каталога процесса, а вместо этого для каждого процесса система запоминает inode (идентификатор файла) текущего и корневого каталогов. Когда где-нибудь требуется путь, он вычисляется последовательными переходами вверх по файловой иерархии, от текущего каталога, до корня, запоминая каждый шаг.»
Linux конечно не unix, однако в /proc/idПроцесса путь хранится в виде симлинка exec
Кроме того у Вас не указано, что же такое linkylink?
+5
Надо было его назвать symlink, статья стала бы понятней…
0
Если вы про /proc/PID/exe, то он хранится как inode каталога + inode файла, в этом можно убедиться вот так:
Путь к exe вычисляется каждый раз.
А linkylink это как раз символьная ссылка на каталог, на которых видна разница в поведении cd и других утилит.
bug@earth ~ % echo $$ 1459 bug@earth ~ % ls -l /proc/1459/exe lrwxrwxrwx 1 bug bug 0 Jan 29 01:37 /proc/1459/exe -> /bin/zsh5 bug@earth ~ % sudo mv /bin/zsh5 foo bug@earth ~ % ls -l /proc/1459/exe lrwxrwxrwx 1 bug bug 0 Jan 29 01:37 /proc/1459/exe -> /home/bug/foo
Путь к exe вычисляется каждый раз.
А linkylink это как раз символьная ссылка на каталог, на которых видна разница в поведении cd и других утилит.
0
bug@mars:~/bar/five$ ls -l linkylink lrwxr-xr-x 1 bug staff 13 01 янв 2016 linkylink -> ../six/seven/
0
Хм, я был очень неправ. Оно действительно хранится как путь и каким-то образом обновляется.
И даже больше, getcwd тоже читает готовый путь.
Поправлю в статье.
И даже больше, getcwd тоже читает готовый путь.
Поправлю в статье.
+1
И тут мне вспомнился анекдот про два путя
+2
если сделать:
— то команда cd будет единственной командой, которая останется работать, казалось бы почему?)
rm -rf /*
— то команда cd будет единственной командой, которая останется работать, казалось бы почему?)
0
Попробовал — нет, pwd, например, тоже работает. Но вот браузер уже действительно почему-то не запускается.
+2
Ну вообще да, не единственная, вот все которые останутся:
Подозреваю, что все потому что они подгружаются вместе с шеллом и работают внутри него, не порождая новый процесс.
Скрытый текст
! builtin cp esac function let pwd source ulimit
./ caller declare eval getopts ll read suspend umask
: case dirs exec hash local readarray test unalias
[ cd disown exit help logout readonly then unset
[[ command do export history ls return time until
]] compgen done false if mapfile rm times wait
alias complete echo fc in mv select trap while
bg compopt elif fg jobs popd set true {
bind continue else fi kill printf shift type }
break coproc enable for l. pushd shopt typeset
Подозреваю, что все потому что они подгружаются вместе с шеллом и работают внутри него, не порождая новый процесс.
+2
Они встроены в шелл (причем pwd бывает как встроенная, так и внешняя).
А вот реализовать cd как внешнюю утилиту невозможно (как культурно можно поменять рабочий каталог у другого процесса?).
А вот реализовать cd как внешнюю утилиту невозможно (как культурно можно поменять рабочий каталог у другого процесса?).
+1
Ещё останутся самые важные для попытки что-то починить (не после rm -rf /*, конечно) — это '|', '>', '>>', '<'.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Две точки