Verileri daha sonra EOF'ye neden olmadan bir işlemin stdinine borulama


33

Kullanıcı etkileşimli bir kabuk başlatan bir yürütülebilir dosya var. Önce, kabuğun çalıştırılmasından sonra, önce birkaç komut enjekte etmek, sonra kullanıcının etkileşimli oturumuna izin vermek istiyorum. Bunu kullanarak kolayca yapabilirim echo:

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

Bu neredeyse işe yarıyor. Sorun, sürecin stdinini besleyen yankı komutunun, komutlarımı yankılamasıyla EOF'a çarpmasıdır. Bu EOF, kabuğun derhal sonlanmasına neden olur (sanki kabukta Ctrl + D tuşlarına basmışsınız).

Daha sonra EOF'ye neden olmadan bu komutları stdin içine enjekte etmenin bir yolu var mı?


./shell_executableKomut listesinin sonuna eklemeyi denediniz mi? İki çalışan örneğiniz olmasına rağmen (ebeveyn ve çocuk) bu devam edebilir.
goldilocks

Yanıtlar:


40

Bu akıllı cevabı stackoverflow'ta benzer bir soruda buldum

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

Bu hile yapar. shell_executable'ın giriş akışının içine catpompalanacak echove EOF'ye kadar daha fazla giriş bekleyecektir.


@ jw013 Haklısın. Gönderiyi düzenledim. Teşekkürler. Ben w / o deneyler zaman parantez, ben gördüm cmd 1geri yazılı ama ürettiği o / p olmalıydı fark etmemişticmd 1
Gowtham

BU MUHTELİF İŞLER! Sadece bana bir ton zaman kazandırdın. Teşekkür ederim!!
jaggedsoft

21

Bunu yapmanın en temiz yolu gibi bir şey aramak için muhtemelen bashbireyin --rcfileseçeneği. Özel komutlarınızı özel dosyanıza yerleştirin ve başlangıçta çalıştırmak için etkileşimli kabuğa iletin.

Eğer böyle bir seçenek yoksa, aşağıdakileri de deneyebilirsiniz:

cat custom_commands_file - | ./shell_executable

cat-stdin olarak yorumlayabilecektir .


çok iyi bir çözüm 💪😠
dctremblay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.