У меня есть сценарий Bash, который создает строку для запуска в качестве команды
Автор сценария:
#! /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
который, кажется, не предоставляет аргументы правильно $serverbin
.
Вывод скрипта:
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'
если я просто вставлю команду /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'
(в выводе после "runnning:"), она будет работать нормально.
bash
shell
command-line-arguments
Жоао Портела
источник
источник
echo | whateverCommands
вместо того , чтобы простоwhateverCommands
(например, я должен был сделать это так:| tail -`echo | whateverCommands`
)Ответы:
Вы можете использовать
eval
для выполнения строки:источник
eval
это злая команда во всех языках программирования, поэтому используйте ее с осторожностью.eval "$illcommando"
, с кавычками , чтобы ваша команда не искалечилась до ее запуска. Попробуйтеeval
использовать значениеillcommando='printf "%s\n" " * "'
с и без кавычек, чтобы увидеть разницу."${PIPESTATUS[@]}"
переменную в bash должным образом. Темset -o pipefail
не менее, правильно вызываетeval
возврат кода завершения сбоя, если команда содержит команду с ошибкой, переданную успешной команде.grep -E '$filter' unfiltered.txt > filtered.txt
, я понятия не имел, почему это работает в командной строке и почему с вычисленными значениями это не работает в скрипте bash. Ваш ответ сохранил мой сценарий. Я добавлю сюда также несколько хороших задокументированных примеров, которые я использовал, чтобы лучше понять, как работает eval. linuxhint.com/bash_eval_commandЯ обычно помещаю команды в круглые скобки
$(commandStr)
, если это не помогает, я нахожу режим отладки bash отличным, запустите скрипт какbash -x script
источник
источник
не помещайте свои команды в переменные, просто запустите
источник
"${arg}"
. пример: server :: team_l_start = "$ {teamAComm}"./me бросает Raise_dead ()
Я искал что-то вроде этого, но мне также нужно было повторно использовать одну и ту же строку минус два параметра, поэтому я получил что-то вроде:
Это то, что я использую для мониторинга создания стека тепла в openstack. В этом случае я ожидаю два условия: действие CREATE и состояние COMPLETE в стеке с именем Somestack.
Чтобы получить эти переменные, я могу сделать что-то вроде:
источник
Вот мой скрипт сборки gradle, который выполняет строки, хранящиеся в heredocs :
Одинокие ")" отчасти уродливы. Но я понятия не имею, как исправить этот эстетический аспект.
источник
Чтобы увидеть все команды, которые выполняются сценарием, добавьте
-x
флаг в свою строку шабанга и выполните команду в обычном режиме:Затем, если вы иногда хотите игнорировать выходные данные отладки, перенаправьте
stderr
куда-нибудь.источник