Могу ли я сослаться на команду перед '&&' после '&&'

10

Не уверен, как еще сформулировать вопрос, но в основном я часто запускаю команду, например, vagrantдля вызова виртуальной машины, а затем запускаю ssh, как показано ниже:

vagrant up && vagrant ssh

Если не считать написания моей собственной функции или сценария, есть ли способ «повторно» использовать vagrantчасть во второй части команды?

jktravis
источник
Вы можете найти этот ответ на связанный вопрос полезным: unix.stackexchange.com/a/140513/14084
Бернхард

Ответы:

23

С (t)csh, bashили zshраскрывание истории вы могли бы написать:

vagrant up && !#:0 ssh

Но если серьезно, вы бы не

Гленн Джекман
источник
Это то, что я искал, но да. Наверное, просто проще сделать псевдоним или функцию. Спасибо!
jktravis
@glenn не могли бы вы объяснить, что !#:0означает. Если мы заменим 0 на 1, 2 или любое число, то что это будет означать?
RAM
4
gnu.org/software/bash/manual/bashref.html#History-Interaction - !#относится к строке, которую вы в настоящее время печатаете, и :0является первым словом в строке («бродяга»). Так !#:1будет "вверх" и т. Д.
Гленн Джекман
4
Святые коровы люди. Хватит выговаривать мой ответ. Подумайте о том, какое умственное усилие требуется для а) перепечатывания слова «бродяга» или б) сначала запомните «! #: 0», а затем введите его.
Гленн Джекман
13

Вы могли бы сделать:

eval vagrant\ {'up &&',ssh}

но это не сделало бы это легче.

Вы всегда можете сделать функцию

doall() {
  cmd=$1; shift
  for arg do
    "$cmd" "$arg" || return
  done
}

А потом:

doall vagrant up ssh
Стефан Шазелас
источник
Хороший подход! Мне нравится идея возможности использовать его для более чем одного приложения. Спасибо!
jktravis
4

Не прямой ответ, но стоит рассмотреть две альтернативы (слишком много для комментария):

  1. кличка

    Если вы неоднократно используете команду, вы можете поместить псевдоним в свой ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. История командной строки

    Ctrl+ Rдавайте поищем ваши предыдущие команды. Это будет намного быстрее, чем использование переменных ...

Себастьян
источник
4
 v=vagrant; $v up && $v ssh

Это может быть близко к тому, что вы ищете.

Вот функция, которая - in bash- напечатает первое слово в позиции команды для текущей составной команды:

rc() { $(set -f; unset IFS
        set -- $(history 1)
        IFS="(){};|'\\\"&#"
        set \ $2;IFS=\ ;set -- $*
        printf %s "$1") "$@"; }

С этим вы могли бы сделать:

vagrant up && rc ssh

Пример:

echo up && rc ssh

ВЫВОД

up
ssh

или...

set -x
(echo);rc 'times two'

ВЫВОД

+ echo

+ rc 'times two'
++ set -f
++ unset IFS
+++ history 1
++ set -- 549 '(echo);rc' ''\''times' 'two'\'''
++ IFS='(){};|'\''\"&#'
++ set ' ' echo '' rc
++ IFS=' '
++ set -- echo rc
++ printf %s echo
+ echo 'times two'
times two
mikeserv
источник