Bagaimana saya bisa mendapatkan argumen spesifik dari perintah sebelumnya di bash?

31

Di bash, Anda bisa menggunakan !*untuk mendapatkan semua argumen dari perintah sebelumnya. Sebagai contoh, jika Anda melakukannya cp /some/path /some/other/pathdan kemudian melakukannya mv !*, perintah kedua akan diperluas ke mv /some/path /some/other/path.

Apakah ada hal seperti ini yang dapat digunakan untuk mengakses argumen tertentu dari suatu perintah, bukan dari semuanya?

Wuffers
sumber

Jawaban:

38

In !*, !adalah awalan ekspansi sejarah , dan *merupakan penunjuk kata yang berarti semua argumen. Anda dapat mengingat sintaksis umum sebagai bang-line-colon-kolom ( kolom !baris :). Ada banyak cara pintas yang mungkin: baris default adalah baris sebelumnya, penentu kolom default adalah "semua", dan Anda dapat meninggalkan titik dua jika penentu kolom non-numerik (tetapi !3berarti baris 3). Anda dapat menggunakan !:0untuk merujuk pada nama perintah, !:1, !:2, dll, untuk merujuk pada argumen berturut-turut, !:$untuk kata terakhir, !:*untuk semua argumen, dan banyak lagi.

Lihat juga posting ini oleh Michael Mrozek di Unix Stack Exchange .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Saya mencobanya sendiri dan ini tidak berhasil. Setelah melihat posting oleh Michale Mrozek, ia mengatakan untuk digunakan !:1, !:2. Setelah menggunakan versi dengan titik dua, itu berhasil.
Wuffers
@ Mr Man: Ups, benar, jika Anda meninggalkan titik dua dengan angka, nomor tersebut ditafsirkan sebagai nomor baris. Maaf soal itu.
Gilles 'SO- stop being evil'
Tidak masalah. Jadi, saya berasumsi bahwa melakukan !1:1akan menunjuk ke argumen pertama dari baris pertama?
Wuffers
4

Secara pribadi, saya benar-benar tidak menyukai fitur "ekspansi dengan tanda seru" yang bahkan akan mengganggu jika Anda mencoba echo "Hello World!"shell interaktif (jadi skrip sumber yang menganggapnya akan dijalankan dalam mode non-interaktif tidak akan berfungsi sama sekali).

Jadi, saya mengatur set +o histexpanddan mulai mengingat argumen dengan metode berikut:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

Perhatikan bahwa trik-Esc adalah karena saya tidak memiliki kunci meta.

Benoit
sumber
Saya hampir tidak pernah menggunakan tanda seru dalam perintah. Jadi metode Exclamation point berfungsi dengan baik untuk saya.
Wuffers
Maka nikmatilah. Banyak dari banyak fitur shell Anda dirancang hanya untuk beberapa pengguna.
Benoit
Sebenarnya, Anda tidak harus melarikan diri dari tanda seru. Lakukan echo 'Hello, orld!'. Perhatikan tanda kutip tunggal dan bukan tanda kutip ganda.
Wuffers