bash - programas - scripts linux ejercicios resueltos
Ejecutar una cadena como un comando dentro de un script Bash (5)
./me arroja raise_dead ()
Estaba buscando algo como esto, pero también necesitaba reutilizar la misma cadena menos dos parámetros, así que terminé con algo como:
my_exe ()
{
mysql -sN -e "select $1 from heat.stack where heat.stack.name=/"$2/";"
}
Esto es algo que utilizo para monitorear la creación de la pila de calor de la pila abierta. En este caso, espero dos condiciones, una acción ''CREAR'' y un estado ''COMPLETO'' en una pila llamada "Somestack"
Para obtener esas variables, puedo hacer algo como:
ACTION=$(my_exe action Somestack)
STATUS=$(my_exe status Somestack)
if [[ "$ACTION" == "CREATE" ]] && [[ "$STATUS" == "COMPLETE" ]]
...
Tengo un script Bash que construye una cadena para ejecutar como un comando
Guión:
#! /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
que no parece suministrar los argumentos correctamente al $serverbin
.
Salida 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 solo pego el comando /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''
(en la salida después de "runnning:") funciona bien.
Normalmente $(commandStr)
comandos entre paréntesis $(commandStr)
, si eso no ayuda, encuentro que el modo de depuración de bash es excelente, ejecuto el script como script bash -x script
Puede usar eval
para ejecutar una cadena:
eval $illcommando
no coloque sus comandos en variables, solo ejecútelo
matchdir="/home/joao/robocup/runner_workdir/matches/testmatch/"
PWD=$(pwd)
teamAComm="$PWD/a.sh"
teamBComm="$PWD/b.sh"
include="$PWD/server_official.conf"
serverbin=''/usr/local/bin/rcssserver''
cd $matchdir
$serverbin include=$include server::team_l_start = ${teamAComm} server::team_r_start=${teamBComm} CSVSaver::save=''true'' CSVSaver::filename = ''out.csv''
your_command_string="..."
output=$(eval "$your_command_string")
echo "$output"