让我们从一个比
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
变量未设置,当我设置其他shell实例的
福
变量?
好吧,我希望答案是显而易见的:
我的
壳牌没有
福
集合。我设置了一些
其他
壳牌公司
福
变量。我告诉过你
其他
shell把它打印出来,然后就设置好了。然后
其他
shell完成了退出并将控制权还给了我的登录shell,当我告诉我的登录shell打印我的登录shell时
福
,未设置。
什么
SSH试剂-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本身运行一个
新的,不同的
壳牌。这个shell遵循指令,当它完成时,您的shell不会受到影响。
这意味着你不能用git别名做你想做的事情。必须使用将影响
你的
壳,而不是一个会启动一个新的壳,影响它,然后让它终止并蒸发这些影响的壳。
注意一些变化,例如
git config --global
存储在
文件夹
而不是在你的壳里。这些变化
不要
当贝壳消失时蒸发。这是一个关键区别:文件系统状态存储在各个进程之外。如果一切
SSH剂
是以文件系统状态存储的,它
能够
是为了工作,但有些事情
SSH剂
不存储在那里。