Почему CD не является программой?

Принятие Вас использует ext3, могло бы быть возможно восстановить его, если бы заменяющий файл был создан как другой inode (вместо того, чтобы перезаписать существующий файл), при помощи debugfs в размонтированной файловой системе, и найти inode исходного файла. К сожалению, если Ваши colleage перезаписывают файл, вместо того, чтобы переместить его в сторону и затем удалить его, это пошло. Я предложил бы использовать debugfs с экстремальной осторожностью, потому что можно серьезно испортить файловую систему. Это - использование, только действительно для последней попытки.

131
09.03.2016, 02:30
7 ответов

cd команда изменяет "текущий рабочий каталог", право?

"текущий рабочий каталог" является свойством, которое уникально для каждого процесса.

Так, если cd была программа, она будет работать как это:

  1. cd foo
  2. cd процесс запускается
  3. cd обработайте изменяет каталог для процесса CD
  4. cd выходы процесса
  5. Ваша оболочка все еще имеет то же состояние, включая текущий рабочий каталог, который это сделало перед запуском.
172
27.01.2020, 19:29
  • 1
    Ваши пять шагов корректны, но "если cd если бы программа был, это будет работать как это", то должен быть "когда cd используется в его внешней реализации программы, она действительно работает как это". –  jlliagre 19.05.2012, 15:21
  • 2
    Не будучи системным программистом, ни действительно имея глубокие знания входов и выходов взаимодействия с оболочкой, я ожидал бы, что оболочка выставит свой текущий рабочий каталог и CD, чтобы быть программой, что доступы и изменяют то свойство. Понимание, после рассмотрения этого ответа, что это является, вероятно, субоптимальным к тому, как это на самом деле работает по многим причинам. –  Jason 31.10.2014, 20:48

cd в дополнение к тому, чтобы быть встроенной оболочкой, на самом деле также программа на POSIX совместимые Ose. Они должны обеспечить независимые исполняемые файлы для регулярных утилит, как cd. Это, например, имеет место с Солярисом, AIX, HP-UX и OS X.

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

find . -type d -exec cd {} \;

В системе POSIX эта острота сообщит о сообщении об ошибке для всех каталогов, которым Вас не разрешают cd в. На большей части Гну/еистрибутивов Linux это перестало работать с тем сообщением об ошибке хотя:

find: `cd': No such file or directory

И здесь ответ к Вашему вопросу, "Почему CD не является программой?" одним из исходного соавтора Unix. На очень ранней реализации Unix, cd (записанный chdir в то время), была внешняя программа. Это просто прекратило работать неожиданно после fork был сначала реализован.

Заключение в кавычки Dennis Ritchie:

Посреди нашего ликования было обнаружено, что chdir (изменяют текущий каталог) команда прекратил работать. Было много чтения кода и тревожного самоанализа о том, как добавление ветвления, возможно, повредило вызов chdir. Наконец истина рассветала: в старой системе chdir был обычной командой; это скорректировало текущий каталог (уникального) процесса, подключенного к терминалу. Под новой системой команда chdir правильно изменила текущий каталог процесса, созданного для выполнения его, но этот процесс, быстро завершенный и, не имел никакого эффекта вообще на его родительскую оболочку! Было необходимо сделать chdir специальной командой, выполняемой внутренне в оболочке. Оказывается, что несколько подобных команде функций имеют то же свойство, например, входят в систему.

Источник: Dennis M. Ritchie, “Эволюция Системы с разделением по времени Unix”, AT&T Bell Laboratories Технический Журнал 63 (6), Часть 2, октябрь 1984, pp.1577–93

Версия 1 Unix (март 1971) chdir состояния страницы руководства:

Поскольку новый процесс создается для выполнения каждой команды, chdir был бы неэффективен, если бы это было записано как нормальная команда. Это поэтому распознано и выполнено Shell.

108
27.01.2020, 19:29
  • 1
    ... так, по-видимому, мандаты POSIX, что должен быть независимый политик cd исполняемый файл, но что это ничего не должно делать (кроме возможно испускают сообщения об ошибках, если названо с неправильными аргументами). Странный. –  Ilmari Karonen 17.05.2012, 00:39
  • 2
    О, хорошо, если бы это верно, который не был бы самой глупой вещью в POSIX. –  Kaz 17.05.2012, 02:06
  • 3
    Страница CD POSIX также говорит, "Так как CD влияет на текущую среду выполнения оболочки, это всегда обеспечивается как оболочка, регулярная встроенное".. –  Mikel 17.05.2012, 03:57
  • 4
    @Kaz, они не совершенно другие вещи. Они делают то же самое, но только встроенный влияет на текущую оболочку. –  jlliagre 17.05.2012, 08:32
  • 5
    @Kaz: не называйте меня глупым, в то время как я просто сообщаю о факте. Вы могли бы согласиться или не согласиться с POSIX, но не снимаете средство рассылки. –  jlliagre 17.05.2012, 08:37

От введения Bash (Что такое оболочка?):

Оболочки также обеспечивают маленький набор встроенных команд (builtins) реализация функциональности, невозможной или неудобной для получения через отдельные утилиты. Например, cd, break, continue, и exec) не может быть реализован за пределами оболочки, потому что они непосредственно управляют самой оболочкой. history, getopts, kill, или pwd builtins, среди других, мог быть реализован в отдельных утилитах, но они более удобны для использования в качестве встроенных команд. Вся оболочка builtins описана в последующих разделах.

47
27.01.2020, 19:29

Для Жертвы первоапрельской шутки в этом году, я записал автономную версию cd.

Никто не получил шутку. Вздох.

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

Прочитайте его страницу справочника, также.:)

29
27.01.2020, 19:29
  • 1
    Действительно полезный код! :-) –  dschulz 17.05.2012, 08:13
  • 2
    Хороший Вы, чтобы видеть, что кто-то работает на то, что сделал Гну/Linux большим количеством POSIX совместимый. Ваша реализация не является только хорошей шуткой, но и на самом деле чем-то отсутствующим в дистрибутивах Linux... –  jlliagre 17.05.2012, 09:30
  • 3
    , я думаю, что собираюсь попробовать еще раз в следующем году, цитируя проблему POSIX. ;) –  Warren Young 17.05.2012, 10:03

CD является оболочкой встроенная команда. Столь легкий, как. CD человека говорит все это. команда CD изменяет рабочий каталог для всех интерпретаторов и (в потоковой среде) все потоки.

0
27.01.2020, 19:29
  • 1
    Поскольку оболочка является средой, которая заботится о Ваших текущих рабочих директорах ($PDW...) или cdable_vars. Это встроенное является в конечном счете способом, которым все видимые пользователем команды должны изменить текущий рабочий каталог. Вы можете протестировать его тот путь: скомпилируйте удар без cd.c и попытки записать Ваш собственный сценарий CD, который попытки заботиться обо всей среде cdable_vars. Этим вопросом является также больше связанный разработчик. Я держал пари, что они могли ответить Вам, этот вопрос в больше глубже детализирует. –   17.05.2012, 19:11
  • 2
    Существует очень хорошая техническая причина это cd встроено. Я предположил бы, что Вы читаете самые высокие оцениваемые ответы и рассматриваете, как Ваш ответ может быть улучшен. –  Thorbjørn Ravn Andersen 17.05.2012, 19:22
  • 3
    Самый высокий оцениваемый ответ был худшим, я когда-либо читал! Но ха? Кто я! –   17.05.2012, 19:32
  • 4
    Но это отвечает на вопрос почему. –  Thorbjørn Ravn Andersen 18.05.2012, 14:21

Я думаю одна вещь, отсутствующая у людей, которые ответ - то, что текущий каталог является переменной среды, которую может изменить каждая программа. При использовании команды 'экспорта' для наблюдения текущего списка переменных среды, Вы будете иметь:

declare -x PWD="/home/erfan"

в Ваших результатах. Таким образом 'CD' управляют, чтобы мы просто хотели изменить эту внутреннюю переменную. Я думаю, пробуем ли мы, мы можем chage переменная PWD любого имущества в оболочке, конечно. Как:

cder    #change current PTY $PWD variable

Но я не думаю там s никакая потребность в нормальных случаях. В другом слове мы берем справку от удара (или любая оболочка) для изменения ее определенной внутренней переменной.

-1
27.01.2020, 19:29
  • 1
    В то время как это верно, что Оболочки Bourne выставляют текущий рабочий каталог (CWD) как $PWD, который не является местоположением основной памяти; фактическое местоположение находится в структуре ядра для каждого процесса. Поэтому неправильно сказать, что CWD "является переменной среды". Если бы это работало способ, которым Вы предлагаете, то это C с двумя лайнерами распечатало бы .. путь, не путь Вы запустили его с: #include <stdlib.h> int main(void) { chdir(".."); puts(getenv("PWD")); } (Оболочки C выставляют CWD как %cwd вместо этого, между прочим.) –  Warren Young 23.05.2012, 19:59
  • 2
    позволяет, добавляют некоторые другие строки к Вашему приложению. #include <stdlib.h> международное основное (пустота) {chdir (".. "); помещает (getenv ("PWD")); setenv (P "PWD"", / ", 1); помещает (getenv ("PWD"));}, Что мы будем иметь как результаты? –  Erfankam 25.05.2012, 10:52
  • 3
    Это просто перезапишет значение переменной без побочного эффекта на CWD. Это - лучший тест, чтобы показать что: #include <unistd.h> int main(void) { char ac[99]; setenv("PWD", "/", 1); puts(getcwd(ac, sizeof(ac))); } Это покажет каталог, Вы запустили программу от, нет /. –  Warren Young 25.05.2012, 11:02
  • 4
    , я думаю каждый процесс, имеет рабочий каталог и переменную пути также. Таким образом Вы chdir просто изменяете этот атрибут процесса. Shell имеет этот атрибут также, и CD мы изменяем этот attribure. –  Erfankam 25.05.2012, 11:56
  • 5
    Нет, я говорю Вам это $PWD только имеет значение к Оболочке Bourne. Это - просто путь к оболочке для передачи чего-то, что это знает к сценариям оболочки, таким образом, они не должны звонить pwd найти его. Любая автономная программа в зависимости от значения $PWD будет ненадежно. –  Warren Young 25.05.2012, 12:26

Команда cd в оболочке не может быть отдельным процессом, потому что в Unix нет механизма для изменения текущего рабочего каталога другого процесса (даже родительского процесса).

Если бы cd был другим процессом, ему пришлось бы изменить текущий рабочий каталог своего родителя (оболочки), что невозможно в Unix. Вместо cd - это специальная встроенная команда. Оболочка вызывает такие функции, как chdir () и fchdir () , изменяя свой собственный текущий рабочий каталог.

Примечание: ядро ​​хранит номер inode текущего рабочего каталога для каждого процесса. Дочерний процесс наследует свой cwd от своего родителя.

4
27.01.2020, 19:29

Теги

Похожие вопросы