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


10

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

vagrant up && vagrant ssh

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


Вы можете найти этот ответ на связанный вопрос полезным: 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.