Bagaimana saya bisa mengingat argumen dari perintah bash sebelumnya?

312

Apakah ada cara di Bash untuk mengingat argumen dari perintah sebelumnya?

Saya biasanya vi file.cdiikuti oleh gcc file.c.

Apakah ada cara di Bash untuk mengingat argumen dari perintah sebelumnya?

Sang Coder
sumber
2
Kemungkinan rangkap: stackoverflow.com/questions/4009412/…
eugenevd

Jawaban:

562

Anda bisa menggunakan $_atau!$ untuk mengingat argumen terakhir dari perintah sebelumnya.

Juga Alt + .dapat digunakan untuk mengingat argumen terakhir dari salah satu perintah sebelumnya.

codaddict
sumber
121
Juga, jika Anda menginginkan argumen yang sewenang-wenang, Anda dapat menggunakan !!:1,, !!:2dll. ( !!:0Adalah perintah sebelumnya sendiri.) Lihat gnu.org/software/bash/manual/bashref.html#History-Interaction
janmoesen
41
Mirip dengan !$, Anda gunakan !^untuk argumen pertama.
Will
13
ahh ... * nix ... kau cantik sekali ... setiap hari aku lebih mencintaimu
jx12345
Bagaimana kita bisa merujuk argumen kedua ke terakhir dari perintah sebelumnya? misalnya, Jika saya memberi echo tiger rabbit, bagaimana saya bisa merujuk tigerpada perintah berikut?
Chan Kim
3
Alt + .tidak bekerja dalam mode vi. Hanya FYI, untuk orang lain yang bingung di sini.
Brian McCutchon
160

Jika perintah sebelumnya memiliki dua argumen, seperti ini

ls a.txt b.txt

dan Anda ingin yang pertama, Anda bisa mengetik

!:1

memberi

a.txt

Atau jika Anda menginginkan keduanya, Anda bisa mengetik

!:1-2

memberi

a.txt b.txt

Anda dapat memperluas ini ke sejumlah argumen, misalnya:

!:10-12
Robert Gowland
sumber
@RNA, saya baru saja mencoba lagi untuk memastikan saya tidak memasukkan kesalahan ketik, dapatkah Anda memberikan sedikit lebih detail (mis. Baris perintah ubuntu, cygwin untuk windows? Pesan kesalahan? Baris sebelumnya?)
Robert Gowland
Saya menggunakan GNU bash, versi 3.2.51 (1) -release (x86_64-apple-darwin13) Hak Cipta (C) 2007 Free Software Foundation, Inc. Pesan kesalahannya adalah-bash: :1-2: bad word specifier
RNA
2
Saya mendapatkan hal yang sama jika tidak ada dua argumen di baris sebelumnya. Misalnya. baris 1 ls a.txtbaris 2ll !:1-2
Robert Gowland
kamu benar. Itu adalah kesalahan bodoh yang saya buat. Terima kasih!
RNA
Juga untuk mendapatkan semua argumen, !:^-$dapat digunakan atau tentu saja kode yang mirip dalam kombinasi dengan angka.
816-8055
88

!!:n dimana n posisi 0 berdasarkan argumen yang Anda inginkan.

Sebagai contoh:

echo 'one' 'two'
# "one two"

echo !!:2
# "two"

Itu ! prefix digunakan untuk perintah sebelumnya akses.

Perintah lain yang bermanfaat:

  • !$ - argumen terakhir dari perintah sebelumnya
  • !^ - Argumen pertama (setelah program / built-in / script) dari perintah sebelumnya
  • !! - perintah sebelumnya (sering diucapkan "bang bang")
  • !n- nomor perintah ndarihistory
  • !pattern - pencocokan perintah terbaru pattern
  • !!:s/find/replace- perintah terakhir, gantikan finddenganreplace

Info selengkapnya tentang riwayat perintah

Johntron
sumber
7
Alih-alih !!:s/find/replace, Anda juga bisa ^find^replace.
Big McLargeHuge
Juga: !* - semua argumen dari perintah sebelumnya (setelah skrip program / built-in /). misalnya: ls *.tmp *.cache rm !*
Aphoid
68

Di baris perintah Anda dapat menekan esc- .atau alt+.

Itu siklus melalui argumen terakhir dari perintah Anda sebelumnya.

Antonio Mano
sumber
Saya selalu menemukan dan kunci untuk bekerja juga.
Bucket
@Bucket keys pergi melalui perintah sebelumnya, sedangkan solusi yang disediakan oleh Antonio memungkinkan untuk pergi melalui argumen sebelumnya (argumen terakhir dari setiap perintah sebelumnya saja)
everyonesdesign
30

Jika Anda tahu nomor yang diberikan dalam riwayat untuk perintah tertentu, Anda bisa mengambil argumen apa pun dalam perintah itu menggunakan istilah berikut.

Gunakan berikut untuk mengambil argumen kedua dari perintah ketiga dalam sejarah,

!3:2

Gunakan berikut untuk mengambil argumen ketiga dari perintah terakhir kelima dalam sejarah,

!-5:3

Menggunakan tanda minus, Anda memintanya untuk menelusuri dari perintah terakhir dari sejarah.

Madisz
sumber
19

! * menjalankan perintah baru dengan semua argumen sebelumnya.

ls /tmp
cd !*
#you are now in /tmp

sumber
Ini tidak berfungsi untuk saya di OSX - harus digunakan $_sebagai gantinya.
Mike W
16

Ya, Anda bisa menggunakan !$untuk mengingat argumen terakhir dari perintah sebelumnya.

Justin Ethier
sumber
Waspadai kata kunci "terakhir," terutama jika perintah Anda berisi beberapa argumen.
Bucket