Przesyłanie danych do standardowego wejścia procesu bez powodowania EOF później

33

Mam plik wykonywalny, który uruchamia powłokę interaktywną dla użytkownika. Chciałbym, po uruchomieniu powłoki, najpierw wstrzyknąć kilka poleceń, a następnie pozwolić użytkownikowi na interaktywną sesję. Mogę to łatwo zrobić za pomocą echo:

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

To prawie działa. Problem polega na tym, że polecenie echa, które zasila standardowe wejście procesu, trafia w EOF, gdy zakończy wykonywanie echa moich poleceń. Ten EOF powoduje natychmiastowe zakończenie powłoki (tak jakbyś nacisnął Ctrl + D w powłoce).

Czy istnieje sposób na wstrzyknięcie tych poleceń do standardowego wejścia bez powodowania EOF?

Jason R.
źródło
Czy próbowałeś dodać ./shell_executablena końcu listy poleceń? To może dalej działać, chociaż będziesz mieć dwie działające instancje (rodzic i dziecko).
goldilocks,

Odpowiedzi:

40

Znalazłem tę sprytną odpowiedź w podobnym pytaniu podczas stackoverflow

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

To załatwia sprawę. wpompuje catwyjście echodo strumienia wejściowego shell_executable i zaczeka na więcej danych wejściowych do EOF.

Gowtham
źródło
@ jw013 Masz rację. Zredagowałem post. Dzięki. Kiedy eksperymentowałem bez nawiasów, zobaczyłem cmd 1cmd 1
odpisany,
TO DZIAŁA NIESAMOWITE! Właśnie zaoszczędziłeś mi mnóstwo czasu. Dziękuję Ci!!
jaggedsoft,
22

Najczystszym sposobem, aby to zrobić, to prawdopodobnie szukać czegoś podobnego bash„s --rcfileopcja. Umieść swoje niestandardowe polecenia w niestandardowym pliku i przekaż je interaktywnej powłoce, aby uruchomić podczas uruchamiania.

Jeśli nie ma takiej opcji, możesz spróbować:

cat custom_commands_file - | ./shell_executable

catbędzie interpretować -jako standardowe.

jw013
źródło
bardzo dobre rozwiązanie 💪😠
dctremblay