我正在尝试创建如下的 bash 函数:
- 将 SSH 连接到服务器并将目录切换到 ~/projects
- 如果您传递了额外的参数(“git pull”),这些参数将被执行。如果没有,请跳过步骤 2
- 给你一个 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'
}