Um eine automatische Antwort bereitzustellen, können Sie eine der folgenden Methoden verwenden:
insaller.sh < an_input_file
oder
command-line | installer.sh
Es gibt etwas zu beachten, wenn das installer.shSkript verwendet wird read -p, wie im folgenden Beispiel:
read -p "Press ENTER for default path or enter path to install software:" answer
man bash Gibt an, dass nichts gedruckt wird, wenn der Standardeingang kein Terminal ist.
Wenn dies Ihre Situation ist, können Sie diese seltsame Sache ausprobieren:
( sleep 30 ; printf "/my/own/path\n" ) | insaller.sh
Sie sollten die Anzahl der Sekunden ( 30im obigen Beispiel) an Ihre Situation anpassen.
Wenn es vorkommt, dass read -p es nicht im Installationsskript verwendet wird, können Sie diese GNULösung ausprobieren :
tempdir="$(mktemp -d)"
mkfifo "${tempdir}"/input
touch "${tempdir}"/output.log
./installer.sh <"${tempdir}"/input >"${tempdir}"/output.log 2>&1 &
installerpid=$!
tail --pid=$installerpid -fn 1 "${tempdir}"/output.log | ( fgrep -q "Press ENTER for default path or enter path to install software:"; printf "/new/path\n" ) >> "${tempdir}"/input &
# ... do stuff
# before ending the script, just wait that all background processes stop
wait
rm -f "${tempdir}"/input "${tempdir}"/output.log
Die Idee ist, zwei Hintergrundbefehlszeilen zu verwenden, eine für das Installationsskript und eine, um auf die Eingabeaufforderung zu warten und die Antwort bereitzustellen.
Für die Kommunikation werden eine Named Pipe ( input) und eine reguläre Datei ( output.log) verwendet.
tail --pid=$installerpid -fn 1 "${tempdir}"/output.logdruckt Zeilen so, wie sie in der output.logDatei geschrieben sind. Es wird angezeigt, wenn das Installationsskript beendet wird.
( fgrep -q ... ; printf .. ) >> ...input: blockiert, bis die Eingabeaufforderung gefunden wird, und gibt den neuen Pfad zum Installationsskript an.