Чи можу я посилатися на команду перед "&&" після "&&"


10

Не впевнений, як інакше сформулювати питання, але в основному я часто виявляю, що я виконую команду, як vagrantпіднести VM, а потім 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 або будь-яке число, то що це означає?
ОЗУ

4
gnu.org/software/bash/manual/bashref.html#History-Interaction - !#посилається на рядок, який ви зараз набираєте, і :0є першим словом у рядку ("бродячий"). Так !#:1було б "вгору" тощо
glenn jackman

4
Святі люди корови. Не припиняйте моїй відповіді. Розгляньте розумові зусилля, необхідні для а) повторного введення "бродячого" або б) спочатку запам'ятайте "!
glenn jackman

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

Це може бути близьким до того, що ви шукаєте.

Ось функція, яка - в 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.