Memipipkan data ke stdin proses tanpa menyebabkan EOF sesudahnya


33

Saya memiliki executable yang memulai shell interaktif-pengguna. Saya ingin, setelah meluncurkan shell, menyuntikkan beberapa perintah terlebih dahulu, kemudian memungkinkan pengguna untuk memiliki sesi interaktif mereka. Saya dapat melakukan ini dengan mudah menggunakan echo:

echo "command 1\ncommand 2\ncommand3" | ./shell_executable

Ini hampir berhasil. Masalahnya adalah bahwa perintah gema yang memberi makan stdin proses hits EOF setelah selesai menggandakan perintah saya. EOF ini menyebabkan shell untuk segera mengakhiri (seolah-olah Anda menekan Ctrl + D di shell).

Apakah ada cara untuk menyuntikkan perintah ini ke stdin tanpa menyebabkan EOF sesudahnya?


Sudahkah Anda mencoba menambahkan ./shell_executableke akhir daftar perintah? Itu mungkin membuatnya tetap berjalan, meskipun Anda akan memiliki dua instance berjalan (orang tua & anak).
goldilocks

Jawaban:


40

Menemukan jawaban pintar ini dalam pertanyaan serupa di stackoverflow

(echo -e "cmd 1\ncmd 2" && cat) | ./shell_executable

Ini caranya. catakan memompa dalam output echoke input stream dari shell_executable dan menunggu lebih banyak input hingga EOF.


@ jw013 Kamu benar. Saya mengedit posting. Terima kasih. Ketika saya bereksperimen dengan tanda kurung, saya melihat cmd 1ditulis kembali tetapi tidak menyadari bahwa itu seharusnya adalah o / p yang dihasilkan olehcmd 1
Gowtham

BEKERJA INI MENGAGUMKAN! Anda baru saja menyelamatkan saya banyak waktu. Terima kasih!!
jaggedsoft

22

Cara yang paling bersih untuk melakukan ini adalah mungkin untuk mencari sesuatu seperti bash's --rcfilepilihan. Masukkan perintah khusus Anda ke file kustom Anda dan berikan ke shell interaktif untuk dijalankan saat start-up.

Jika tidak ada opsi seperti itu, Anda juga dapat mencoba yang berikut:

cat custom_commands_file - | ./shell_executable

catakan diartikan -sebagai stdin.


solusi yang sangat baik 💪😠
dctremblay
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.