Bagaimana saya bisa membatalkan sisa daftar perintah di Bash?

10

Di Bash, kadang-kadang saya akan mengetikkan daftar perintah dan tekan Enter, dan hanya kemudian menyadari bahwa ada kesalahan dengan beberapa perintah di dekat akhir daftar. Saya tahu bahwa jika saya menekan Ctrl+ Citu akan menghentikan perintah yang sedang berjalan dan membatalkan sisa daftar. Apakah ada cara untuk membatalkan sisa daftar tanpa menghentikan perintah yang sedang berjalan?

Sebagai contoh, katakanlah saya telah mengetik sesuatu seperti

foo; bar

atau

foo && bar

di mana fooadalah perintah yang sudah berjalan lama bahwa sangat penting untuk tidak menyela, dan barmelakukan sesuatu yang tidak dapat diubah dan tidak diinginkan (katakanlah, shutdown -h nowatau rm -rf /). Saat foomasih berjalan, apakah ada cara umum untuk memberitahu shell untuk foomenyelesaikan tetapi tidak untuk menjalankan barsetelahnya? (Ya, saya bisa mengubah izin baragar tidak dapat dieksekusi, tetapi itu tidak terlalu nyaman jika barsesuatu seperti rmyang ingin saya gunakan sementara itu, juga tidak akan berfungsi jika saya tidak memiliki baratau jika barbuiltin.)

Psychonaut
sumber
Anda dapat mengubah barperintah terakhir menjadi some_command: ^bar^some_commandsebelum dijalankan.
GAD3R
3
@ GAD3R: tetapi ini tidak akan mengubah baris saat ini, itu akan memulai yang baru.
Arkadiusz Drabczyk

Jawaban:

3

Saya telah mengamati bahwa menggunakan CtrlZuntuk menggeser program ke proses latar belakang melakukan trik.

foo && bar

Terima kasih kepada @Arkadiusz Drabczyk karena menunjukkannya dalam komentar yang foo; bartidak memberikan kontrol dengan cara yang diperlukan.

Kemudian:

^Z

[1]+  Stopped                 foo

Perintah hanya menghentikan tugas pertama dan

fg %1

Ini hanya membawa tugas fooke latar depan dan menyelesaikan tugas dan keluar.

PS: Ini dapat diperiksa dengan dua skrip menulis ke file. Yang pertama tidur selama beberapa detik untuk memberikan waktu untuk dimasukkan kembali.

Saya bingung mengapa CtrlZpegangan hanya menjalankan perintah dan meninggalkan sisanya. Ingin tahu.

Revanth Chetluru
sumber
1
Saya tidak bisa mereproduksi. Apa bashversi yang Anda gunakan? Saya menggunakan GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu). Saya menulis 2 skrip bash yang menulis ke file yang berbeda write1.sh:: pastebin.com/rbKmdWgB dan write2.sh: pastebin.com/bNx3VRws . Saya menjalankan mereka seperti itu: ./write1.sh ; ./write2.sh. Script pertama bergema wrote 1beberapa kali, saya tekan C-z, katanya [1]+ Stopped ./write1.shdan saya bisa langsung melihat output dari skrip kedua: wrote 2digemakan berulang kali.
Arkadiusz Drabczyk
2
Saya pikir alasan bahwa metode ini bekerja dengan command1 && command2pipa adalah karena Control-zmengirim SIGCHLDsinyal ke proses. Itu bisa diperiksa dengan echo $?. Bashkemudian melihat bahwa proses pertama tidak selesai dengan sukses dan tidak menjalankan proses selanjutnya.
Arkadiusz Drabczyk
Saya menggunakan GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16). Ya, saya pikir Anda benar. foo; bartidak dapat dikontrol dengan cara yang diinginkan. Tetapi kita dapat melakukan penghentian yang diperlukan dari proses kedua dengan Ctrl+Zjika perintah dijalankan foo && bar. Saya akan memperbarui jawabannya. terimakasih telah menunjukkan itu.
Revanth Chetluru
@ArkadiuszDrabczyk tidak Ctrl-Z mengirim SIGTSTP?
muru
Catatan @RevanthChetluru yang barmasih ditangguhkan dan muncul di jobsoutput, jadi mungkin harus dibunuh juga.
muru