Pull to refresh

Comments 18

Хмм…
1. «Вообще, в *nix нигде не хранится путь до рабочего каталога процесса, а вместо этого для каждого процесса система запоминает inode (идентификатор файла) текущего и корневого каталогов. Когда где-нибудь требуется путь, он вычисляется последовательными переходами вверх по файловой иерархии, от текущего каталога, до корня, запоминая каждый шаг.»
Linux конечно не unix, однако в /proc/idПроцесса путь хранится в виде симлинка exec

Кроме того у Вас не указано, что же такое linkylink?
Надо было его назвать symlink, статья стала бы понятней…
Если вы про /proc/PID/exe, то он хранится как inode каталога + inode файла, в этом можно убедиться вот так:

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 и других утилит.
Нужно это в выводе на картинках сделать, а то действительно непонятно.
Возможно что вычисление пути через переход к корню я видел в какой-то реализации libc.
UFO just landed and posted this here
«Пока я с вами тут шутю, поезд на Воркутю тю-тю»?
если сделать:
rm -rf /*

— то команда cd будет единственной командой, которая останется работать, казалось бы почему?)
Попробовал — нет, pwd, например, тоже работает. Но вот браузер уже действительно почему-то не запускается.
Ну вообще да, не единственная, вот все которые останутся:
Скрытый текст
!          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    

Подозреваю, что все потому что они подгружаются вместе с шеллом и работают внутри него, не порождая новый процесс.
Они встроены в шелл (причем pwd бывает как встроенная, так и внешняя).
А вот реализовать cd как внешнюю утилиту невозможно (как культурно можно поменять рабочий каталог у другого процесса?).
Ещё останутся самые важные для попытки что-то починить (не после rm -rf /*, конечно) — это '|', '>', '>>', '<'.
Sign up to leave a comment.

Articles