如何在 bashrc 中创建别名 ssh-add /bin/bash?

如何在 bashrc 中创建别名 ssh-add /bin/bash?

这怎么不起作用呢?

alias push-bb="ssh-agent /bin/bash && ssh-add ~/.ssh/bitbucker_rsa && git push"

我认为它会/bin/bash部分取消吗?

答案1

我猜你期望&&像这样工作:

  1. 假装这ssh-agent /bin/bash是输入的
  2. 假装Enter被按了
  3. 假装这ssh-add ~/.ssh/bitbucket_rsa是输入的
  4. 假装Enter被按了…

但事实并非如此。别名不是“假键盘输入”,也不&&是“假 Enter 键”。shell 会解释它们直接作为命令. 因此它实际上是这样的:

  1. 跑步ssh-agent /bin/bash
  2. 等待它退出
  3. 跑步ssh-add ~/.ssh/bitbucket_rsa
  4. 等待它退出…

因此,别名不会在步骤 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 不需要等待键盘输入,而是直接被告知运行剩下的两个命令。

相关内容