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?


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


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

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 ...


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.