Каково различие между встроенной командой и той, которая не является?

Способ решить это с ssh-agent и ssh-add:

$ exec ssh-agent bash
$ ssh-add
Enter passphrase for ~/.ssh/id_rsa: 

После этого пароль сохраняется для текущей сессии. и не будет спрошен снова.

72
01.08.2011, 03:35
4 ответа

Из Ваших комментариев Вы, кажется, смущены точно, какова оболочка. Ядро ответственно за управление системой. Это - часть, которая на самом деле загружает и запускает программы, файлы доступов, выделяет память и т.д. Но ядро не имеет никакого пользовательского интерфейса; можно только общаться с ним при помощи другой программы как посредник.

Оболочка является программой, которая печатает подсказку, читает строку входа от Вас и затем интерпретирует его как одну или несколько команд, чтобы управлять файлами или запустить другие программы. Перед изобретением GUI оболочка была основным пользовательским интерфейсом ОС. На MS-DOS назвали оболочку command.com и немного людей когда-либо пытались использовать другого. На Unix, однако, долго было несколько оболочек, от которых могли выбрать пользователи.

Они могут быть разделены на 3 типа. Совместимые с границей оболочки используют синтаксис, полученный из исходной Оболочки Bourne. Оболочки C используют синтаксис от исходной оболочки C. Затем существуют нетрадиционные оболочки, которые изобретают их собственный синтаксис, или заимствуют один из некоторого языка программирования и обычно намного менее популярны, чем первые два типа.

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

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

То, какие команды встроены, зависит от оболочки, которую Вы используете. Необходимо будет консультироваться с его документацией для списка (например, bashвстроенные команды перечислены в Главе 4 его руководства). type команда может сказать Вам, если команда встроена (если Ваша оболочка совместима с POSIX), потому что POSIX требует этого type будьте встроенным. Если which не встроенное в Вашей оболочке, затем она, вероятно, не будет знать о Вашей оболочке, создал-ins, но будет просто искать внешние программы.

90
27.01.2020, 19:31
  • 1
    общаются с ядром путем издания прерываний на самом деле. –  Nathan Osman 17.04.2011, 01:00
  • 2
    @George: Приложения общаются с ядром путем издания syscalls, который в зависимости от ОС и архитектуры может или не может использовать прерывания. Пользователи, как правило, не выпускают прерывания. –  Gilles 'SO- stop being evil' 17.04.2011, 01:05
  • 3
    @cjm: Это звучит столь простым, когда Вы объясняете это как то, что :)... Вы, конечно, помогли очистить вуаль... просто легкий туман теперь.. (на самом деле это, что погода похожа здесь, этим утром... приятно туманна ;)... –  Peter.O 17.04.2011, 01:15
  • 4
    @Gilles спасибо:В самом деле? я думал, что все программы непривилегированного режима общались с ядром через прерывания (на определенной архитектуре, конечно). –  Nathan Osman 17.04.2011, 01:16
  • 5
    @cjm чтения Очень полный и поучительный ответ. Я изучил большое чтение его. :) –  ankush981 28.11.2015, 08:42

Существует три уровня встроенных утилит:

  • Некоторые утилиты являются действительно частью оболочки как язык программирования, даже при том, что они не зарезервированные слова. Они - утилиты потока управления (., :, break, continue, return, trap, exit, exec, eval), связанные с параметром утилиты (set, unset, shift, export, readonly, local¹, typeset¹), утилиты псевдонима (alias², unalias²) и times³. Они особенные созданный-ins получают специальный режим:

    • При передаче неправильных аргументов встроенному специальному предложению сама оболочка может прерваться, вместо того, чтобы просто пропустить к следующей команде после отображения сообщения об ошибке.
    • Синтаксис перед присвоением foo=bar utility имеет другое значение: это - обычное присвоение параметра (т.е. эквивалентный foo=bar; utility), вместо того, чтобы присвоить среде на время утилиты только.
  • Некоторые утилиты должны быть реализованы в оболочке, потому что они действуют на внутренние настройки оболочки. Это включает:

    • утилиты, которые действуют на текущий каталог оболочки такой как cd, dirs, pushd, popd;
    • утилиты управления заданиями такой как bg, disown, fg, jobs, wait;
    • утилиты, которые читают или управляют другими атрибутами оболочки такой как builtin, command, hash, read, type, ulimit, umask;
    • утилиты имели отношение к интерактивным функциям, когда они присутствуют, такой как fc, history, bind.
  • Некоторые утилиты обычно реализуются, как создано-ins просто для производительности: echo, printf, test, true, false.

Усовершенствованные оболочки, такие как удар, ksh и zsh обычно больше создавали-ins, часто для реализования нестандартных опций (обычно для взаимодействия). Руководство каждой оболочки скажет Вам, какие команды встроены, хотя некоторые оболочки (zsh, по крайней мере) поддерживают динамично-загружаемые-модули, которые могут обеспечить более созданный-ins.

¹ Неизвестный POSIX, но особенный в ksh и нескольких других оболочках.
² Обычный в POSIX, но особенный в ksh и нескольких других оболочках.
³ В ksh, times обертка вокруг time ключевое слово: это - псевдоним для { { time;} 2>&1;}. Обратите внимание, что POSIX позволяет time чтобы быть внешней утилитой с обычным парсингом или ключевым словом, которое относится к целому конвейеру (который это находится в ksh, избейте zsh).

37
27.01.2020, 19:31
  • 1
    Эти различия являются действительно важными. –  dmckee --- ex-moderator kitten 16.04.2011, 22:24
  • 2
    Быстрый вопрос, поэтому что делает "обычное присвоение параметра", означает, когда мы делаем while IFS= read -r line ? –  Sergiy Kolodyazhnyy 15.12.2017, 18:37
  • 3
    @SergiyKolodyazhnyy read не встроенное специальное предложение, таким образом, IFS=read устанавливает переменную только на время команды. –  Gilles 'SO- stop being evil' 15.12.2017, 21:56

Встроенной является команда, обеспеченная оболочкой, а не внешней программой. Вот списки для bashbuiltins (они также перечислены в странице справочника удара), и zshbuiltins. ksh предоставляет список путем выполнения builtin.

Чтобы знать, является ли конкретная команда встроенным, можно работать type command. Попробовать type for и type ls видеть это.

10
27.01.2020, 19:31
  • 1
    type кажется, добивается цели; спасибо за это..., но я все еще задаюсь вопросом, что "обеспеченный оболочкой" означает... Возможно, я должен более полно понять, как оболочка касается ядра...., но не в 2:00.. Я возвращусь к этому завтра, –  Peter.O 16.04.2011, 19:48

Каждый дистрибутив и оболочка имеют различный набор команд по сравнению со встроенными функциями оболочки. Обычно идея состоит в том, что оболочки создают - в наиболее распространенных и простых функциях, чтобы сэкономить время, скорость, и интегрируются, будет с остальной частью их набора функций. Издержки намного ниже, так как они не должны запускать другой системный процесс. Однако это возможно к смешиванию и подгонке. Вы могли бы выполнить одну оболочку, которая имеет здание для чего-то, но имейте ту команду в своей системе также. Обычно встроенное брало бы приоритет, но Вы могли управлять этим.

Можно легко узнать, является ли определенная команда встроенным или не путем выполнения type mycommand. Большинство страниц справочника оболочки также имеет список своего builtins.

Править: Использовать type узнать, является ли команда встроенным, и если нет which изучить, откуда это будет выполняться.

1
27.01.2020, 19:31
  • 1
    @Caleb: спасибо за Ваш комментарий, но это оставляет меня задающийся вопросом о том, каков точно "системный процесс".. Я продолжаю видеть ссылки на затем, но я не понимаю whwere, различие находится.... (btw, я не вижу как, 'который' является абсолютным индикатором).. например, 'которые отзываются эхом=>"/bin/echo" and введите эхо=>"echo is a shell builtin", but 'which dd=>"/bin/dd" и type dd=> "dd/bin/dd"... так, я - часть путь там.... –  Peter.O 16.04.2011, 19:44
  • 2
    "Система procses" просто означает, что это запускается как независимое приложение, управляемое ядром. Альтернатива в случае builtins просто выполняет подфункцию в уже под управлением коде Вашей оболочки. В примере Вы даете, type лучший индикатор того, что выполняется, но Вы замечаете echo и встроенное и существует приложение с тем именем. Если бы Ваша оболочка не имела встроенного системой, то можно быть выполнить. –  Caleb 16.04.2011, 19:53
  • 3
    which не обязательно встроенная команда, и если это не будет, то это не будет знать об оболочке, создал-ins. POSIX требует этого type будьте встроенной командой, таким образом, она всегда знает о созданном-ins. –  cjm 16.04.2011, 20:34
  • 4
    Много систем поставлются с псевдонимом which кому: type или некоторый набор опций, например. alias which='type -path' - это могло быть источником беспорядка. –  Random832 16.04.2011, 22:35
  • 5
    я не могу upvote это, до which заменяется type. Я использовал который, много раз, не знание type и был очень удивлен к lern, этому which является только правильным, при решении между программами. –  user unknown 17.04.2011, 02:01

Теги

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