Saya sedang menyelidiki perilaku skrip yang biasanya dijalankan sebagai proses otomatis (misalnya cron, Jenkins). Script dapat (akhirnya) menjalankan perintah yang berperilaku berbeda (mencari input pengguna) ketika dijalankan secara interaktif; misalnya, patch
akan bertanya apa yang harus dilakukan dengan tambalan yang dibalik, dan svn
akan meminta kata sandi, tetapi saya perlu melihat apa yang terjadi ketika mereka dijalankan secara non-interaktif.
Membujuk patch
bahwa itu non-interaktif cukup mudah; Saya hanya perlu mengarahkan ulang stdout
menjadi non-tty:
$ </dev/null > >(cat) /path/to/myscript --args
Namun svn
akan terhubung ke terminal pengendali jika ada; mengedit skrip untuk dilewati --non-interactive
bukan pilihan karena ini berasal dari beberapa level dan akan sulit untuk memastikan bahwa saya telah menemukan setiap doa.
Apakah ada cara untuk memanggil skrip / perintah secara non-interaktif, tanpa terminal pengendali (sehingga /dev/tty
tidak ada)? Saya lebih suka stdout / stderr untuk tetap pergi ke terminal saya.
(Saya menemukan pertanyaan Jalankan skrip di shell non-interaktif? Tetapi jawaban untuk itu membahas perbedaan antara cron dan lingkungan pengguna; Saya sudah menghilangkan semua perbedaan kecuali non-interaktivitas.)
tty
konfirmasi tidak ada terminal di stdin, dan "?" di kolom TTYps
output yang mengkonfirmasi tidak ada tty mengendalikan untuksh
proses (dan apa pun yang berjalan di bawahnya).setsid -w
. Contoh:setsid -w sh -c 'tty < /dev/tty'
memberish: 1: cannot open /dev/tty: No such device or address
(Catatan:/dev/tty
adalah tty Anda yang mengendalikan). Tanpa-w
setsid menjalankan proses secara paralel / latar belakang.Anda mungkin ingin membuat skrip harapan. Contoh dengan SVN:
/programming/609445/using-expect-to-login-into-svn
sumber
Terkadang Anda harus tetap membuka stdin (tidak menerima eof on stdin) (mis. Berharap). Dalam hal ini ubah / dev / null ke / dev / zero.
sumber