bestsource

Bash 스크립트 내에서 문자열을 명령으로 실행

bestsource 2023. 4. 29. 09:33
반응형

Bash 스크립트 내에서 문자열을 명령으로 실행

명령으로 실행할 문자열을 빌드하는 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'("running:" 뒤의 출력에서) 정상적으로 작동합니다.

사용할 수 있습니다.eval문자열을 실행하는 방법:

eval $illcommando
your_command_string="..."
output=$(eval "$your_command_string")
echo "$output"

나는 보통 괄호 안에 명령을 넣습니다.$(commandStr)그게 도움이 되지 않으면 bash 디버그 모드가 훌륭하다고 생각합니다. 스크립트를 실행합니다.bash -x script

변수에 명령을 넣지 말고 실행하십시오.

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'

./나는 raise_dead를 캐스팅합니다.

이와 같은 것을 찾고 있었지만, 두 개의 매개 변수를 제외한 동일한 문자열을 재사용해야 했기 때문에 다음과 같은 결과를 얻었습니다.

my_exe ()
{
    mysql -sN -e "select $1 from heat.stack where heat.stack.name=\"$2\";"
}

이것은 Openstack 열 스택 생성을 모니터링하는 데 사용합니다.이 경우 "Somestack"이라는 이름의 스택에서 작업 'CREATE'와 상태 'COMPLETE'의 두 가지 조건이 필요합니다.

이러한 변수를 얻기 위해 다음과 같은 작업을 수행할 수 있습니다.

ACTION=$(my_exe action Somestack)
STATUS=$(my_exe status Somestack)
if [[ "$ACTION" == "CREATE" ]] && [[ "$STATUS" == "COMPLETE" ]]
...

다음은 여기에 저장된 문자열을 실행하는 gradle 빌드 스크립트입니다.

current_directory=$( realpath "." )
GENERATED=${current_directory}/"GENERATED"
build_gradle=$( realpath build.gradle )

## touch because .gitignore ignores this folder:
touch $GENERATED

COPY_BUILD_FILE=$( cat <<COPY_BUILD_FILE_HEREDOC

    cp 
        $build_gradle 
        $GENERATED/build.gradle

COPY_BUILD_FILE_HEREDOC
)
$COPY_BUILD_FILE

GRADLE_COMMAND=$( cat <<GRADLE_COMMAND_HEREDOC

    gradle run

        --build-file       
            $GENERATED/build.gradle

        --gradle-user-home 
            $GENERATED  

        --no-daemon

GRADLE_COMMAND_HEREDOC
)
$GRADLE_COMMAND

외로운 ""는 좀 못생겼습니다.하지만 저는 그 심미적인 면을 어떻게 고쳐야 할지 전혀 모르겠습니다.

스크립트에서 실행 중인 모든 명령을 보려면 다음을 추가합니다.-x샤방 라인에 플래그를 지정하고 명령을 정상적으로 실행합니다.

#! /bin/bash -x

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
$serverbin include="$include" server::team_l_start="${teamAComm}" server::team_r_start="${teamBComm}" CSVSaver::save='true' CSVSaver::filename='out.csv'

그런 다음 디버그 출력을 무시하려는 경우 리디렉션stderr어딘가에.

나를 위해.echo XYZ_20200824.zip | grep -Eo '[[:digit:]]{4}[[:digit:]]{2}[[:digit:]]{2}'정상적으로 작동하지만 명령 출력을 변수에 저장할 수 없습니다.저도 시도했던 것과 같은 문제가 있었습니다.eval출력을 받지 못했습니다.

제 문제에 대한 답은 다음과 같습니다.cmd=$(echo XYZ_20200824.zip | grep -Eo '[[:digit:]]{4}[[:digit:]]{2}[[:digit:]]{2}')

echo $cmd

내 출력은 지금.20200824

언급URL : https://stackoverflow.com/questions/2355148/run-a-string-as-a-command-within-a-bash-script

반응형