Bisakah saya merujuk perintah sebelum '&&' setelah '&&'

10

Tidak yakin bagaimana lagi untuk mengungkapkan pertanyaan, tetapi pada dasarnya, saya sering menemukan diri saya menjalankan perintah suka vagrantmemunculkan VM, dan kemudian ssh ke dalamnya seperti di bawah ini:

vagrant up && vagrant ssh

Pendek menulis fungsi atau skrip saya sendiri, adakah cara untuk "menggunakan kembali" vagrantbagian di bagian kedua dari perintah?

jktravis
sumber
Anda mungkin menemukan jawaban ini pada pertanyaan terkait bermanfaat: unix.stackexchange.com/a/140513/14084
Bernhard

Jawaban:

23

Dengan (t)csh, bashatau zshperluasan riwayat, Anda dapat menulis:

vagrant up && !#:0 ssh

Tapi, serius, kamu tidak akan

glenn jackman
sumber
Ini yang saya cari, tapi ya. Mungkin hanya lebih mudah untuk melakukan alias atau fungsi. Terima kasih!
jktravis
@glenn bisa tolong jelaskan apa !#:0kepanjangannya. Jika kita mengganti 0 dengan 1, 2 atau angka apa pun, lalu apa artinya?
RAM
4
gnu.org/software/bash/manual/bashref.html#History-Interaction - !#merujuk ke baris yang saat ini Anda ketikkan, dan :0merupakan kata pertama dalam baris ("gelandangan"). Jadi !#:1akan "naik", dll
glenn jackman
4
Orang sapi suci. Berhenti memvoting jawaban saya. Pertimbangkan upaya mental yang diperlukan untuk a) mengetik ulang "gelandangan", atau b) pertama-tama ingat "! #: 0" dan kemudian ketik.
glenn jackman
13

Anda bisa melakukannya:

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

tapi itu tidak akan membuatnya lebih mudah.

Anda selalu bisa membuat fungsi

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

Lalu:

doall vagrant up ssh
Stéphane Chazelas
sumber
Pendekatan yang bagus! Saya suka gagasan untuk dapat menggunakannya untuk lebih dari satu aplikasi. Terima kasih!
jktravis
4

Bukan jawaban langsung tetapi, dua alternatif mungkin layak untuk dilihat (terlalu banyak untuk komentar):

  1. Alias

    Jika Anda berulang kali menggunakan perintah, Anda dapat memasukkan alias ke ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. Sejarah baris perintah

    Ctrl+ Rbiarkan Anda mencari perintah sebelumnya. Ini akan jauh lebih cepat daripada menggunakan variabel ...

Sebastian
sumber
4
 v=vagrant; $v up && $v ssh

Itu mungkin dekat dengan apa yang Anda cari.

Inilah fungsi yang - in bash- akan mencetak kata pertama pada posisi perintah untuk perintah majemuk saat ini:

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

Dengan itu Anda bisa melakukan:

vagrant up && rc ssh

Sebuah contoh:

echo up && rc ssh

KELUARAN

up
ssh

atau...

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

KELUARAN

+ 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
sumber