Eu tenho um script Bash que cria uma string para executar como um comando
Roteiro:
#! /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 parece não fornecer os argumentos corretamente para o $serverbin
.
Saída 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'
se eu apenas colar o 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'
(na saída após "runnning:"), ele funcionará bem.
bash
shell
command-line-arguments
João Portela
fonte
fonte
echo | whateverCommands
em vez de apenaswhateverCommands
(por exemplo, eu tive que fazê-lo como este:| tail -`echo | whateverCommands`
)Respostas:
Você pode usar
eval
para executar uma string:fonte
eval
é um comando maligno em todas as linguagens de programação, portanto, use-o com cuidado.eval "$illcommando"
, com as aspas , para não ter seu comando mutilado antes de ser executado. Tenteeval
usar um valorillcommando='printf "%s\n" " * "'
com e sem as aspas para ver a diferença."${PIPESTATUS[@]}"
variável no bash corretamente. No entanto,set -o pipefail
causa corretamente oeval
retorno de um código de saída com falha se o comando contiver um comando com falha canalizado para um comando bem-sucedido.grep -E '$filter' unfiltered.txt > filtered.txt
: não fazia ideia do porquê funcionava na linha de comando e por que, com valores calculados, não funciona no script bash. Sua resposta salvou meu script. Vou adicionar aqui também alguns bons exemplos documentados que usei para entender melhor como o eval funciona. linuxhint.com/bash_eval_commandNormalmente coloco comandos entre parênteses
$(commandStr)
, se isso não ajudar, acho ótimo o modo de depuração do bash, execute o script comobash -x script
fonte
fonte
não coloque seus comandos em variáveis, apenas execute
fonte
"${arg}"
. exemplo: server :: team_l_start = "$ {teamAComm}"./me lança raise_dead ()
Eu estava procurando por algo assim, mas também precisava reutilizar a mesma string menos dois parâmetros, então acabei com algo como:
Isso é algo que eu uso para monitorar a criação de pilha de calor do openstack. Nesse caso, espero duas condições, uma ação 'CREATE' e um status 'COMPLETE' em uma pilha chamada "Somestack"
Para obter essas variáveis, posso fazer algo como:
fonte
Aqui está o meu script de compilação gradle que executa cadeias armazenadas em heredocs :
Os solitários ")" são meio feios. Mas não tenho idéia de como consertar esse aspecto estético.
fonte
Para ver todos os comandos que estão sendo executados pelo script, adicione o
-x
sinalizador à sua linha shabang e execute o comando normalmente:Então, se você desejar ignorar a saída de depuração, redirecione para
stderr
algum lugar.fonte