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?

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 .


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.


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