Давайте начнем с более простого примера, чем ssh-agent -s
:
$ sh -c 'FOO=bar; echo FOO is now $FOO'
FOO is now bar
$ echo FOO is now $FOO
FOO is now
Почему это не сработало?Почему переменная FOO
моей регистрационной оболочки не установлена, когда я устанавливаю переменную FOO
другого экземпляра оболочки?
Что ж, я надеюсь, что ответ очевиден: моя оболочка не имеетFOO
установлено.Я установил некоторую другую переменную оболочки FOO
.Я сказал, что другой оболочка для его печати, и он был установлен.Затем эта другая оболочка завершила работу - завершила работу и вернула управление моей оболочке входа в систему, и когда я сказал моей оболочке входа в систему напечатать FOO
моей оболочки входа, она не была установлена.
ssh-agent -s
делает распечатывает некоторый набор назначений.Давайте попробуем это:
$ sh -c 'echo FOO=bar'
FOO=bar
$ echo FOO is now $FOO
FOO is now
Конечно, это тоже не сработало, потому что я просто напечатал некоторые инструкции .Никто не следовал этим инструкциям.
Итак, давайте попробуем еще одну вещь:
$ eval `sh -c 'echo FOO=bar'`
$ echo FOO is now $FOO
FOO is now bar
На этот раз я:
- попросил другую команду напечатать некоторые инструкции
- сказал моей оболочке следовать этим инструкциям
- и затем моя оболочка распечатала настройки моей оболочки для
$FOO
и так как инструкции, которым я следовал за моей оболочкой, изменили что-то в моей оболочке, сейчас FOO моей оболочки установлена.
Дизайндля ssh-agent
то же самое: он выполняет некоторую работу, затем - в различных режимах, в том числе с -s
- выводит инструкции для некоторой оболочки, чтобы следовать.Вам нужен eval
, чтобы заставить эту оболочку следовать этим инструкциям.
Это все хорошо и выполняет то, что вам нужно, если оболочка, которая следует этим инструкциям, является вашей оболочкой.Но когда вы создаете псевдоним Git, Git запускает новую новую оболочку .Эта оболочка следует инструкциям, и когда она будет выполнена, ваша оболочка не изменится.
Это означает, что вы не можете делать то, что хотите, с псевдонимом Git.Вы должны использовать псевдоним или функцию, которая повлияет на вашу оболочку, а не на такую, которая запустит новую оболочку, повлияет на нее, а затем завершит ее и испарит эти эффекты.
Обратите внимание, чтонекоторые изменения, такие как git config --global
, хранятся в файлах , а не в вашей оболочке.Эти изменения не не испаряются, когда оболочка исчезает.Это ключевое отличие: состояние файловой системы хранится вне отдельных процессов.Если бы все ssh-agent
было сохранено в состоянии файловой системы, можно было бы заставить работать, но некоторые вещи ssh-agent
там не сохраняются.