Apakah ada cara untuk memberikan tugas serial pada terminal saat tugas dieksekusi (tanpa menggunakan file)?

14

Misalkan ada 2 tugas t1, t2yang dapat dieksekusi secara serial seperti di bawah ini:

t1 ; t2
# OR
t1 && t2

Sekarang anggaplah saya lupa untuk menjalankan t2dan t1sudah berjalan; dapatkah saya menambahkan t2ke pipeline sehingga dieksekusi setelah t1selesai?

Abimanyu Gupta
sumber

Jawaban:

19

Ya kamu bisa:

  1. Jeda pekerjaan yang sedang berjalan dengan karakter menangguhkan dengan menekan Ctrl+ Z.
  2. Ketik fgatau %, tambahkan apa yang Anda inginkan ke daftar dan jalankan, misalnya:
    fg ; systemctl suspend # or
    % ; systemctl suspend
    Karena fgmengembalikan nilai pengembalian pekerjaan yang diteruskannya, buat daftar operator seperti &&dan ||bekerja seperti yang diharapkan:
    fg && echo "Finished successfully!" # or
    % && echo "Finished successfully!"

man bash/ JOB CONTROL mengatakan tentang karakter yang ditangguhkan:

Mengetikkan karakter yang ditangguhkan (biasanya ^Z, Control- Z) ketika suatu proses sedang berjalan menyebabkan proses tersebut dihentikan dan mengembalikan kontrol bash. (...) Pengguna kemudian dapat memanipulasi keadaan pekerjaan ini, menggunakan bgperintah untuk melanjutkannya di latar belakang, fg perintah untuk melanjutkannya di latar depan, atau killperintah untuk membunuhnya. A ^Zberlaku segera, dan memiliki efek samping tambahan yang menyebabkan output yang tertunda dan ketik akan dibuang.

fgdijelaskan dalam man bash/ SHELL BUILTIN COMMANDS :

fg [ jobspec ]
Melanjutkan jobspec di latar depan, dan menjadikannya pekerjaan saat ini. Jika jobspec tidak ada, gagasan shell tentang pekerjaan saat ini digunakan. Nilai kembali adalah bahwa dari perintah yang ditempatkan di latar depan, atau kegagalan jika dijalankan ketika kontrol pekerjaan dinonaktifkan atau, ketika dijalankan dengan kontrol pekerjaan diaktifkan, jika jobspec tidak menentukan pekerjaan yang valid atau jobspec menentukan pekerjaan yang dimulai tanpa kontrol pekerjaan .

Bacaan lebih lanjut (selain dari man bash) tentang kontrol pekerjaan:

pencuci mulut
sumber
1 tapi itu memalukan ini tidak bekerja ketika Anda lupa t3di t1; t2; t3atau t1 && t2 && t3.
JoL
@ JoL Benar itu - ^Z^Zdan %-;%+;t3cukup baik dalam beberapa kasus, tapi itu jauh dari solusi nyata untuk masalah ini.
hidangan penutup
2

Saya melihat metode ini di sini: /superuser/334272/how-to-run-a-command-after-an-already-running-existing-one-finishes

di mana Anda pertama kali Ctrl+ zuntuk menghentikan (menangguhkan) yang sedang berjalan maka Anda menjalankan perintah yang terlewat seperti: fg && ./missed_cmd.shdan itu akan berjalan segera setelah fgselesai.

Perintah fg(foreground) akan membawa pekerjaan yang ditangguhkan online dan &&akan memastikan bahwa perintah yang terlewat hanya berjalan jika perintah pertama berhasil.

George Udosen
sumber