Mam skrypt Bash, który buduje ciąg do uruchomienia jako polecenie
Scenariusz:
#! /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
który wydaje się nie dostarczać poprawnie argumentów do $serverbin
.
Wyjście skryptu:
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'
jeśli po prostu wkleię polecenie /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'
(w danych wyjściowych po „runnning:”), działa dobrze.
bash
shell
command-line-arguments
João Portela
źródło
źródło
echo | whateverCommands
zamiast po prostuwhateverCommands
(na przykład, miałem to zrobić tak:| tail -`echo | whateverCommands`
)Odpowiedzi:
Możesz użyć
eval
do wykonania ciągu:źródło
eval
jest złym poleceniem we wszystkich językach programowania, więc używaj go ostrożnie.eval "$illcommando"
, używając cudzysłowów , aby nie spowodować zniekształcenia polecenia przed jego uruchomieniem. Spróbujeval
użyć wartościillcommando='printf "%s\n" " * "'
z cudzysłowami i bez cudzysłowów, aby zobaczyć różnicę."${PIPESTATUS[@]}"
poprawnie zmiennej w bash. Jednakset -o pipefail
prawidłowo powodujeeval
zwrócenie kodu zakończenia niepowodzenia, jeśli polecenie zawiera polecenie niepowodzenia przekazane potokiem do polecenia pomyślnego.grep -E '$filter' unfiltered.txt > filtered.txt
, nie miałem pojęcia, dlaczego działa w linii poleceń i dlaczego z obliczonymi wartościami nie działa w skrypcie bash. Twoja odpowiedź uratowała mój skrypt. Dodam tutaj również kilka ładnie udokumentowanych przykładów, których użyłem, aby lepiej zrozumieć, jak działa eval. linuxhint.com/bash_eval_commandZwykle umieszczam polecenia w nawiasach
$(commandStr)
, jeśli to nie pomaga, uważam, że tryb debugowania bash jest świetny, uruchom skrypt jakobash -x script
źródło
źródło
nie umieszczaj swoich poleceń w zmiennych, po prostu je uruchom
źródło
"${arg}"
. przykład: server :: team_l_start = "$ {teamAComm}"./me rzuca raise_dead ()
Szukałem czegoś takiego, ale musiałem również ponownie użyć tego samego ciągu bez dwóch parametrów, więc skończyło się na czymś takim:
To jest coś, czego używam do monitorowania tworzenia stosu ciepła w otwartym stosie. W tym przypadku oczekuję dwóch warunków, akcji „UTWÓRZ” i statusu „ZAKOŃCZONO” na stosie o nazwie „Somestack”
Aby uzyskać te zmienne, mogę zrobić coś takiego:
źródło
Oto mój skrypt budowania gradle, który wykonuje ciągi przechowywane w heredocach :
Samotny „)” jest trochę brzydki. Ale nie mam pojęcia, jak naprawić ten estetyczny aspekt.
źródło
Aby zobaczyć wszystkie polecenia wykonywane przez skrypt, dodaj
-x
flagę do linii shabang i wykonaj polecenie normalnie:Następnie, jeśli czasami chcesz zignorować wyjście debugowania, przekieruj
stderr
gdzieś.źródło