J'ai un script Bash qui construit une chaîne à exécuter en tant que commande
Scénario:
#! /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
qui ne semble pas fournir les arguments correctement au $serverbin
.
Sortie de script:
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'
si je colle juste la commande /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'
(dans la sortie après "runnning:") cela fonctionne très bien.
bash
shell
command-line-arguments
João Portela
la source
la source
echo | whateverCommands
lieu de simplementwhateverCommands
(par exemple, je devais le faire comme ceci:| tail -`echo | whateverCommands`
)Réponses:
Vous pouvez utiliser
eval
pour exécuter une chaîne:la source
eval
est une commande maléfique dans tous les langages de programmation, alors utilisez-la avec prudence.eval "$illcommando"
, avec les guillemets , pour que votre commande ne soit pas mutilée avant son exécution. Essayezeval
avec une valeur deillcommando='printf "%s\n" " * "'
avec et sans les guillemets pour voir la différence."${PIPESTATUS[@]}"
correctement la variable dans bash. Cependant,set -o pipefail
provoque correctement leeval
renvoi d'un code de sortie d'échec si la commande contient une commande en échec dirigée vers une commande réussie.grep -E '$filter' unfiltered.txt > filtered.txt
, je n'avais aucune idée pourquoi cela fonctionnait en ligne de commande et pourquoi avec des valeurs calculées cela ne fonctionnait pas dans le script bash. Votre réponse a sauvé mon script. J'ajouterai ici aussi de jolis exemples documentés que j'ai utilisés pour mieux comprendre comment fonctionne eval. linuxhint.com/bash_eval_commandJe place généralement les commandes entre parenthèses
$(commandStr)
, si cela ne m'aide pas, je trouve le mode de débogage bash excellent, exécutez le script commebash -x script
la source
la source
ne mettez pas vos commandes dans des variables, exécutez-le simplement
la source
"${arg}"
. exemple: server :: team_l_start = "$ {teamAComm}"./me lance lever_dead ()
Je cherchais quelque chose comme ça, mais je devais également réutiliser la même chaîne moins deux paramètres, donc je me suis retrouvé avec quelque chose comme:
C'est quelque chose que j'utilise pour surveiller la création de la pile de chaleur openstack. Dans ce cas j'attends deux conditions, une action 'CREATE' et un statut 'COMPLETE' sur une pile nommée "Somestack"
Pour obtenir ces variables, je peux faire quelque chose comme:
la source
Voici mon script de construction gradle qui exécute les chaînes stockées dans heredocs :
Les seuls ")" sont plutôt moche. Mais je n'ai aucune idée de la façon de résoudre cet aspect esthétique.
la source
Pour voir toutes les commandes exécutées par le script, ajoutez l'
-x
indicateur à votre ligne shabang et exécutez la commande normalement:Ensuite, si vous voulez parfois ignorer la sortie de débogage, redirigez
stderr
quelque part.la source