Ich versuche, ein Bash-Skript zu erstellen, um ein C++-Programm mit einem Befehl zu erstellen und auszuführen. Normalerweise muss ich jetzt Folgendes tun:
g++ file.cc -o file
./file < input.in
Ich möchte in der Lage sein, beispielsweise
brun file.cc < input.in
Wie kann ich das machen? Im Moment habe ich etwas, das wie folgt ausgeführt werden kann
brun file.cc '< input.in'
Hier ist mein aktuelles Skript
#!/bin/bash
CFILE=$1
OBJFILE="${CFILE%.*}"
g++ $CFILE -o $OBJFILE
echo "Built file: $CFILE -> $OBJFILE"
chmod +x $OBJFILE
ARGS="${@##*.cc}"
./$OBJFILE""$ARGS
Das bleibt bei der letzten Zeile hängen und tut dann einfach nichts. Kann mir hier jemand weiterhelfen?
Antwort1
Das hier sollte genügen:
#!/bin/bash
CFILE=$1
OBJFILE="${CFILE%.*}"
g++ $CFILE -o $OBJFILE
echo "Built file: $CFILE -> $OBJFILE"
./$OBJFILE
Und Sie sollten es folgendermaßen aufrufen können:
brun file.cc < input.in
Dies funktioniert, weil die an STDIN des brun
Skripts umgeleitete Eingabe einfach gepuffert wird und diese gepufferte Eingabe dann dem Unterprozess zur Verfügung steht, der sie zuerst liest – in diesem Fall Ihre neu erstellte ausführbare Datei.
Sie können auch erwägen, make
Ihren Build zu automatisieren. make
ist intelligent genug, um Ihren Build nach Standardregeln auszuführen, ohne dass ein explizites Makefile erforderlich ist. Ihr Build/Run-Skript könnte also so einfach sein wie:
#!/bin/bash
OBJFILE="${1%.*}"
make "$OBJFILE" && ./$OBJFILE
Dadurch &&
wird sichergestellt, dass OBJFILE nur ausgeführt wird, wenn keine Build-Fehler gefunden wurden make
.