ฉันสามารถอ้างอิงคำสั่งก่อนหน้า '&&' หลังจาก '&&' ได้หรือไม่


10

ไม่แน่ใจว่าจะใช้วลีคำถามนี้อย่างไร แต่โดยทั่วไปฉันมักจะพบว่าตัวเองกำลังรันคำสั่งที่ต้องการvagrantเพิ่มค่า VM และจากนั้นจึงใช้ ssh เหมือนด้านล่าง:

vagrant up && vagrant ssh

ขาดการเขียนฟังก์ชั่นหรือสคริปต์ของตัวเองมีวิธี "นำ" vagrantส่วนที่ใช้ในส่วนที่สองของคำสั่งหรือไม่


คุณอาจพบคำตอบนี้สำหรับคำถามที่เกี่ยวข้องมีประโยชน์: unix.stackexchange.com/a/140513/14084
Bernhard

คำตอบ:


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จะเป็น "up" ฯลฯ
glenn jackman

4
คนวัวศักดิ์สิทธิ์ หยุด upvoting คำตอบของฉัน พิจารณาความพยายามทางจิตที่จำเป็นสำหรับ a) พิมพ์ "คนพเนจร" หรือ b) จำครั้งแรก "! #: 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

นั่นอาจใกล้เคียงกับสิ่งที่คุณกำลังมองหา

นี่คือฟังก์ชันที่ - ใน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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.