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 foo
adalah perintah yang sudah berjalan lama bahwa sangat penting untuk tidak menyela, dan bar
melakukan sesuatu yang tidak dapat diubah dan tidak diinginkan (katakanlah, shutdown -h now
atau rm -rf /
). Saat foo
masih berjalan, apakah ada cara umum untuk memberitahu shell untuk foo
menyelesaikan tetapi tidak untuk menjalankan bar
setelahnya? (Ya, saya bisa mengubah izin bar
agar tidak dapat dieksekusi, tetapi itu tidak terlalu nyaman jika bar
sesuatu seperti rm
yang ingin saya gunakan sementara itu, juga tidak akan berfungsi jika saya tidak memiliki bar
atau jika bar
builtin.)
sumber
bar
perintah terakhir menjadisome_command
:^bar^some_command
sebelum dijalankan.Jawaban:
Saya telah mengamati bahwa menggunakan CtrlZuntuk menggeser program ke proses latar belakang melakukan trik.
Terima kasih kepada @Arkadiusz Drabczyk karena menunjukkannya dalam komentar yang
foo; bar
tidak memberikan kontrol dengan cara yang diperlukan.Kemudian:
Perintah hanya menghentikan tugas pertama dan
Ini hanya membawa tugas
foo
ke 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.
sumber
bash
versi yang Anda gunakan? Saya menggunakanGNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)
. Saya menulis 2 skrip bash yang menulis ke file yang berbedawrite1.sh
:: pastebin.com/rbKmdWgB danwrite2.sh
: pastebin.com/bNx3VRws . Saya menjalankan mereka seperti itu:./write1.sh ; ./write2.sh
. Script pertama bergemawrote 1
beberapa kali, saya tekanC-z
, katanya[1]+ Stopped ./write1.sh
dan saya bisa langsung melihat output dari skrip kedua:wrote 2
digemakan berulang kali.command1 && command2
pipa adalah karenaControl-z
mengirimSIGCHLD
sinyal ke proses. Itu bisa diperiksa denganecho $?
.Bash
kemudian melihat bahwa proses pertama tidak selesai dengan sukses dan tidak menjalankan proses selanjutnya.GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
. Ya, saya pikir Anda benar.foo; bar
tidak dapat dikontrol dengan cara yang diinginkan. Tetapi kita dapat melakukan penghentian yang diperlukan dari proses kedua denganCtrl+Z
jika perintah dijalankanfoo && bar
. Saya akan memperbarui jawabannya. terimakasih telah menunjukkan itu.bar
masih ditangguhkan dan muncul dijobs
output, jadi mungkin harus dibunuh juga.