SSH:chdir,也许执行$*,然后打开一个shell?

SSH:chdir,也许执行$*,然后打开一个shell?

我正在尝试创建如下的 bash 函数:

  1. 将 SSH 连接到服务器并将目录切换到 ~/projects
  2. 如果您传递了额外的参数(“git pull”),这些参数将被执行。如果没有,请跳过步骤 2
  3. 给你一个 bash shell

现在,我有这个:

function xyz {
   ssh -t xyz.com 'cd ~/projects; $*; bash'
}

使用这个,运行“xyz”会让我在 xyz.com:~/projects 上得到一个 shell,就像我想要的那样,但是运行“xyz git pull”会产生以下错误:

/usr/bin/git: /usr/bin/git: cannot execute binary file

我确信我遗漏了一些简单的东西,有人能给我指出正确的方向吗?

谢谢!

答案1

您使用了单引号,但变量替换在单引号字符串内不起作用:

$ function test { echo '$*'; }
$ test a b c
> $*

你看,$*保留为文字。改用双引号:

$ function test { echo "$*"; }
$ test a b c
> a b c

我相信在您的情况下,它将$*“按原样”传输到目标主机并在那里替换,然后在您的projects目录中执行某些操作。

答案2

一种解释是 /usr/bin/git 不可执行。它可能是一个没有行的 shell 脚本,#!或者是一个不适合主机的二进制文件。当您以交互方式登录主机时,由于您的命令路径,您可能正在其他地方使用另一个 git 副本。

答案3

错误消息看起来像是git正在尝试执行git。我怀疑有另一个函数或别名正在执行。

另一个潜在的问题是,执行变量时很难正确使用引号。为了快速演示该效果,请在 shell 提示符下尝试以下代码(带引号):

"ls -l"

为了解决您的问题,您可以尝试:

function xyz {
   ssh -t xyz.com 'cd ~/projects; eval "$*"; bash'
}

相关内容