Tôi có thể tham chiếu một lệnh trước '&&' sau '&&'


10

Không biết làm thế nào khác để diễn đạt câu hỏi, nhưng về cơ bản, tôi thường thấy mình đang chạy một lệnh như vagrantđể đưa VM lên, và sau đó ssh vào nó như dưới đây:

vagrant up && vagrant ssh

Viết tắt chức năng hoặc tập lệnh của riêng tôi, có cách nào để "tái sử dụng" vagrantphần trong phần thứ hai của lệnh không?


Bạn có thể tìm thấy câu trả lời này cho một câu hỏi liên quan hữu ích: unix.stackexchange.com/a/140513/14084
Bernhard

Câu trả lời:


23

Với (t)csh, bashhoặc zshmở rộng lịch sử, bạn có thể viết:

vagrant up && !#:0 ssh

Nhưng, nghiêm túc, bạn sẽ không


Đây là những gì tôi đang tìm kiếm, nhưng vâng. Có lẽ chỉ dễ dàng hơn để làm một bí danh hoặc chức năng. Cảm ơn!
jktravis

@glenn bạn có thể vui lòng giải thích những gì !#:0đại diện cho. Nếu chúng ta thay 0 bằng 1, 2 hoặc bất kỳ số nào, thì nó có nghĩa là gì?
RAM

4
gnu.org/software/bash/manual/bashref.html#History-Interaction - !#đề cập đến dòng bạn hiện đang gõ và :0là từ đầu tiên trong dòng ("vagrant"). Vì vậy, !#:1sẽ là "lên", vv
glenn jackman

4
Thánh bò. Dừng nâng cao câu trả lời của tôi. Hãy xem xét nỗ lực tinh thần cần có để a) gõ lại "vagrant" hoặc b) trước tiên hãy nhớ "! #: 0" và sau đó nhập nó.
glenn jackman

13

Bạn có thể làm:

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

nhưng điều đó sẽ không làm cho nó dễ dàng hơn.

Bạn luôn có thể thực hiện một chức năng

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

Và sau đó:

doall vagrant up ssh

Cách tiếp cận tốt đẹp! Tôi thích ý tưởng có thể sử dụng nó cho nhiều ứng dụng. Cảm ơn!
jktravis

4

Không trực tiếp trả lời nhưng, hai lựa chọn thay thế có thể đáng xem (quá nhiều cho một nhận xét):

  1. Bí danh

    Nếu bạn liên tục sử dụng một lệnh, bạn có thể đặt bí danh vào ~/.bashrc

    alias vassh="vagrant up && vagrant ssh"
  2. Lịch sử dòng lệnh

    Ctrl+ Rhãy để bạn tìm kiếm các lệnh trước đó của bạn. Điều này sẽ nhanh hơn nhiều so với việc sử dụng các biến ...


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

Điều đó có thể gần với những gì bạn đang tìm kiếm.

Đây là một chức năng - trong bash- sẽ in từ đầu tiên ở vị trí lệnh cho lệnh ghép hiện tại:

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

Với điều đó bạn có thể làm:

vagrant up && rc ssh

Một ví dụ:

echo up && rc ssh

ĐẦU RA

up
ssh

hoặc là...

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

ĐẦU RA

+ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.