这怎么不起作用呢?
alias push-bb="ssh-agent /bin/bash && ssh-add ~/.ssh/bitbucker_rsa && git push"
我认为它会/bin/bash
部分取消吗?
答案1
我猜你期望&&
像这样工作:
- 假装这
ssh-agent /bin/bash
是输入的 - 假装Enter被按了
- 假装这
ssh-add ~/.ssh/bitbucket_rsa
是输入的 - 假装Enter被按了…
但事实并非如此。别名不是“假键盘输入”,也不&&
是“假 Enter 键”。shell 会解释它们直接作为命令. 因此它实际上是这样的:
- 跑步
ssh-agent /bin/bash
- 等待它退出
- 跑步
ssh-add ~/.ssh/bitbucket_rsa
- 等待它退出…
因此,别名不会在步骤 1 中“取消”。
它做过实际上为你启动了 /bin/bash 的一个新副本,现在 bash 在 bash 内部运行——它们看起来彼此完全相同,所以你没有注意到。但仔细看看ps xf
你就会发现:
123 xterm
└ 124 bash waiting for its child (124 ssh-agent) to exit
└ 678 ssh-agent waiting for its child (679 bash) to exit
└ 679 bash waiting for keyboard input
因此别名是等待第 1 步完成。
如果你exit
现在输入,那么第二个 bash 将退出(与 ssh-agent 一起退出),并且你的别名将继续从那时起,所有剩余的命令都将被解释为原来的重击外壳。
相反,你可能想要这个:
alias push-bb="ssh-agent /bin/bash -c 'ssh-add ~/.ssh/bitbucker_rsa && git push'"
这里,“新” bash 不需要等待键盘输入,而是直接被告知运行剩下的两个命令。