Ich habe ein Bash-Skript, das eine Zeichenfolge erstellt, die als Befehl ausgeführt werden soll
Skript:
#! /bin/bash
matchdir="/home/joao/robocup/runner_workdir/matches/testmatch/"
teamAComm="`pwd`/a.sh"
teamBComm="`pwd`/b.sh"
include="`pwd`/server_official.conf"
serverbin='/usr/local/bin/rcssserver'
cd $matchdir
illcommando="$serverbin include='$include' server::team_l_start = '${teamAComm}' server::team_r_start = '${teamBComm}' CSVSaver::save='true' CSVSaver::filename = 'out.csv'"
echo "running: $illcommando"
# $illcommando > server-output.log 2> server-error.log
$illcommando
das scheint die Argumente nicht richtig zu liefern $serverbin
.
Skriptausgabe:
running: /usr/local/bin/rcssserver include='/home/joao/robocup/runner_workdir/server_official.conf' server::team_l_start = '/home/joao/robocup/runner_workdir/a.sh' server::team_r_start = '/home/joao/robocup/runner_workdir/b.sh' CSVSaver::save='true' CSVSaver::filename = 'out.csv'
rcssserver-14.0.1
Copyright (C) 1995, 1996, 1997, 1998, 1999 Electrotechnical Laboratory.
2000 - 2009 RoboCup Soccer Simulator Maintenance Group.
Usage: /usr/local/bin/rcssserver [[-[-]]namespace::option=value]
[[-[-]][namespace::]help]
[[-[-]]include=file]
Options:
help
display generic help
include=file
parse the specified configuration file. Configuration files
have the same format as the command line options. The
configuration file specified will be parsed before all
subsequent options.
server::help
display detailed help for the "server" module
player::help
display detailed help for the "player" module
CSVSaver::help
display detailed help for the "CSVSaver" module
CSVSaver Options:
CSVSaver::save=<on|off|true|false|1|0|>
If save is on/true, then the saver will attempt to save the
results to the database. Otherwise it will do nothing.
current value: false
CSVSaver::filename='<STRING>'
The file to save the results to. If this file does not
exist it will be created. If the file does exist, the results
will be appended to the end.
current value: 'out.csv'
Wenn ich nur den Befehl /usr/local/bin/rcssserver include='/home/joao/robocup/runner_workdir/server_official.conf' server::team_l_start = '/home/joao/robocup/runner_workdir/a.sh' server::team_r_start = '/home/joao/robocup/runner_workdir/b.sh' CSVSaver::save='true' CSVSaver::filename = 'out.csv'
einfüge (in der Ausgabe nach "runnning:"), funktioniert es einwandfrei.
bash
shell
command-line-arguments
João Portela
quelle
quelle
echo | whateverCommands
Statt nur vonwhateverCommands
(zum Beispiel, ich hatte es , wie dies zu tun:| tail -`echo | whateverCommands`
)Antworten:
Sie können
eval
eine Zeichenfolge ausführen:quelle
eval
ist ein böser Befehl in allen Programmiersprachen, verwenden Sie ihn daher mit Vorsicht.eval "$illcommando"
, Mit den Anführungszeichen , nicht zu Ihrem Befehl , bevor es läuft verstümmelt hat. Versucheneval
Sie es mit einem Wert vonillcommando='printf "%s\n" " * "'
mit und ohne Anführungszeichen, um den Unterschied zu erkennen."${PIPESTATUS[@]}"
Variable in bash wird jedoch NICHT richtig eingestellt. Allerdingsset -o pipefail
führt nicht ordnungsgemäßeval
einen Fehler Exit - Code zurück , wenn der Befehl Befehl enthält andernfalls zu einem erfolgreichen Befehl geleitet.grep -E '$filter' unfiltered.txt > filtered.txt
. Ich hatte keine Ahnung, warum es in der Befehlszeile funktioniert und warum es mit berechneten Werten im Bash-Skript nicht funktioniert. Ihre Antwort hat mein Skript gespeichert. Ich werde hier auch einige schöne dokumentierte Beispiele hinzufügen, die ich verwendet habe, um besser zu verstehen, wie eval funktioniert. linuxhint.com/bash_eval_commandNormalerweise setze ich Befehle in Klammern
$(commandStr)
. Wenn dies nicht dazu beiträgt , dass der Bash-Debug-Modus großartig ist, führen Sie das Skript als ausbash -x script
quelle
quelle
Fügen Sie Ihre Befehle nicht in Variablen ein, sondern führen Sie sie einfach aus
quelle
"${arg}"
. Beispiel: server :: team_l_start = "$ {teamAComm}"./me Casts Raise_Dead ()
Ich habe nach so etwas gesucht, aber ich musste auch denselben String minus zwei Parameter wiederverwenden, damit ich am Ende so etwas wie:
Dies ist etwas, das ich verwende, um die Erstellung von Openstack-Heatstacks zu überwachen. In diesem Fall erwarte ich zwei Bedingungen, eine Aktion 'CREATE' und einen Status 'COMPLETE' auf einem Stapel mit dem Namen "Somestack".
Um diese Variablen zu erhalten, kann ich Folgendes tun:
quelle
Hier ist mein Gradle-Build-Skript, das in Heredocs gespeicherte Zeichenfolgen ausführt :
Die einsamen ")" sind irgendwie hässlich. Aber ich habe keine Ahnung, wie ich diesen ästhetischen Aspekt beheben kann.
quelle
Um alle Befehle
-x
anzuzeigen , die vom Skript ausgeführt werden, fügen Sie das Flag zu Ihrer Shabang-Zeile hinzu und führen Sie den Befehl normal aus:Wenn Sie dann manchmal die Debug-Ausgabe ignorieren möchten, leiten Sie
stderr
irgendwo um.quelle