Назад | Перейти на главную страницу

SSH: chdir, может быть, выполнить $ *, а затем открыть оболочку?

Я пытаюсь сделать функцию bash следующим образом:

  1. Будет ли SSH на сервере и chdir на ~ / projects
  2. Если вы передадите дополнительные аргументы ('git pull'), они будут выполнены. Если нет, пропустите шаг 2.
  3. Оставляет вас с оболочкой bash

Прямо сейчас у меня есть это:

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

Используя это, запуск 'xyz' оставляет мне оболочку на xyz.com:~/projects, как я и хочу, но запуск 'xyz git pull' приводит к следующей ошибке:

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

Я уверен, что мне не хватает чего-то простого, может ли кто-нибудь указать мне правильное направление?

Спасибо!

Сообщение об ошибке выглядит как git пытается выполнить git. Я подозреваю, что выполняется другая функция или псевдоним.

Еще одна потенциальная проблема заключается в том, что при выполнении переменной очень сложно правильно указать кавычки. Чтобы быстро продемонстрировать результат этого эффекта, попробуйте следующее (в кавычках) в приглашении оболочки:

"ls -l"

Чтобы решить вашу проблему, вы можете попробовать:

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

Одним из объяснений может быть то, что / usr / bin / git не является исполняемым. Это может быть сценарий оболочки без #! строка или двоичный файл, который не подходит для хоста. Когда вы входите на хост в интерактивном режиме, вы можете использовать другую копию git в другом месте из-за вашего пути к команде.

Вы использовали одинарные кавычки, и подстановка переменных не работает в одинарных кавычках:

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

Ты видишь, $* остается буквальным. Вместо этого используйте двойные кавычки:

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

Я верю в ваш случай $* передается на целевой хост "как есть" и заменяется там, что выполняет что-то в вашем projects каталог.