Misalkan saya memiliki contoh sepele berikut di history
:
...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...
Jika saya ingin menjalankan perintah 77
,, 78
dan 79
dalam satu perintah, apakah ada jalan pintas untuk ini? Saya sudah mencoba !77 !78 !79
, yang hanya akan menempatkan mereka semua pada satu baris untuk dieksekusi.
!77 ; !78 ; !79
apa-apa!77-79
)Jawaban:
Sunting: Anda dapat melakukan ini dengan cara yang sesuai dengan POSIX dengan alat perintah perbaikan
fc
:Ini akan membuka editor Anda (mungkin
vi
) dengan perintah 77 hingga 79 di buffer. Saat Anda menyimpan dan keluar (:x
), perintah akan dijalankan.Jika Anda tidak ingin mengeditnya dan Anda SANGAT PASTI Anda tahu perintah mana yang Anda panggil, Anda dapat menggunakan:
Ini digunakan
true
sebagai "editor" untuk mengedit perintah, sehingga hanya keluar tanpa membuat perubahan dan perintah dijalankan apa adanya.JAWABAN ASLI:
Anda dapat gunakan:
Ini mengasumsikan bahwa Anda tidak menggunakan alias atau fungsi atau variabel apa pun yang hanya ada di lingkungan eksekusi saat ini, karena tentu saja itu tidak akan tersedia di shell baru yang sedang dimulai.
Solusi yang lebih baik (terima kasih kepada Michael Hoffman karena mengingatkan saya pada komentar) adalah:
Salah satu dari sangat, sangat sedikit kasus di mana
eval
sebenarnya sesuai!Lihat juga:
sumber
cd
, tetapi itu adalah kasus tepi.eval "$(history -p \!{77..79})"
harus bekerja.Jawaban sederhana: alih-alih
!77 !78 !79
,!77; !78; !79
untuk melakukan apa yang Anda coba lakukan - jalankan perintah 77, dan kemudian perintah 78, lalu perintah 79, tanpa syarat, atau!77 && !78 && !79
untuk mengeksekusi perintah 77 dan periksa apakah berhasil. Dan kemudian, jika perintah 77 berhasil, jalankan perintah 78. Dan kemudian, jika perintah 78 berhasil, jalankan perintah 79.Jawaban yang sedikit lebih pintar (jika Anda berada di jendela tipe terminal):
\!
di AndaPS1
.82 history
, maka perintah Anda berikutnya adalah 83.!-6
. Ini akan kembali menjalankan perintah 77.!-6
, salin, dan tempel. Karena eksekusi ulang Anda dari perintah 77 (./generator.sh
) adalah perintah 83, Anda sekarang berada di perintah 84, sehingga!-6
akan kembali menjalankan perintah 78.!-6
seperti yang diinginkan.sumber