Übertragen von Daten zum Standardeintrag eines Prozesses, ohne dass anschließend ein EOF verursacht wird

33

Ich habe eine ausführbare Datei, die eine benutzerinteraktive Shell startet. Ich möchte nach dem Start der Shell zuerst ein paar Befehle einfügen und dann dem Benutzer erlauben, ihre interaktive Sitzung zu haben. Ich kann das leicht machen mit echo:

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

Das funktioniert fast . Das Problem ist, dass der Echo-Befehl, der das STDIN des Prozesses einspeist, EOF trifft, sobald er meine Befehle wiedergibt. Diese EOF bewirkt, dass die Shell sofort beendet wird (als ob Sie Strg + D in der Shell gedrückt hätten).

Gibt es eine Möglichkeit, diese Befehle in stdin einzufügen, ohne anschließend ein EOF zu verursachen?

Jason R
quelle
Haben Sie versucht ./shell_executable, am Ende der Befehlsliste etwas hinzuzufügen ? Das könnte es am Laufen halten, obwohl Sie zwei laufende Instanzen haben (Eltern & Kind).
Goldlöckchen

Antworten:

40

Fand diese clevere Antwort in einer ähnlichen Frage bei stackoverflow

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

Das macht den Trick. pumpt catdie Ausgabe von echoin den Eingabestrom von shell_executable und wartet auf weitere Eingaben bis EOF.

Gowtham
quelle
@ jw013 Du hast recht. Ich habe den Beitrag bearbeitet. Vielen Dank. Als ich ohne die Klammern experimentierte, sah ich, dass etwas cmd 1zurückgeschrieben wurde, merkte aber nicht, dass es das cmd 1
Ergebnis sein
DAS FUNKTIONIERT FANTASTISCH! Du hast mir gerade eine Menge Zeit gespart. Vielen Dank!!
Jaggedsoft
22

Der sauberste Weg, dies zu tun, ist wahrscheinlich, nach so etwas wie bashder --rcfileOption zu suchen . Fügen Sie Ihre benutzerdefinierten Befehle in Ihre benutzerdefinierte Datei ein und übergeben Sie sie an die interaktive Shell, um sie beim Start auszuführen.

Wenn keine solche Option vorhanden ist, können Sie auch Folgendes versuchen:

cat custom_commands_file - | ./shell_executable

catwird -als stdin interpretieren .

jw013
quelle
sehr gute lösung 💪😠
dctremblay