বাশ স্ক্রিপ্টের মধ্যে একটি কমান্ড হিসাবে একটি স্ট্রিং চালান


152

আমার কাছে বাশ স্ক্রিপ্ট রয়েছে যা কমান্ড হিসাবে চালানোর জন্য একটি স্ট্রিং তৈরি করে

লিপি:

#! /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'("রান্নিং:" এর পরে আউটপুটে) এটি কার্যকর হয়।



মনে রাখবেন যে কোনও কোনও ক্ষেত্রে আপনার এটি করা দরকার: ন্যায়বিচারের echo | whateverCommandsপরিবর্তে whateverCommands(উদাহরণস্বরূপ, আমাকে এটি এটি করতে হয়েছিল | tail -`echo | whateverCommands`:)
অ্যান্ড্রু

উত্তর:


279

আপনি evalএকটি স্ট্রিং কার্যকর করতে ব্যবহার করতে পারেন :

eval $illcommando

2
বিভাজন কমান্ড রিটার্ন মান ( ফেরতের মান , স্ট্রিং আউটপুট নয়) কে এগিয়ে দেয়?
টোম জ্যাটো - মনিকা

3
evalসমস্ত প্রোগ্রামিং ভাষার একটি কমান্ড হ'ল সতর্কতার সাথে এটি ব্যবহার করুন।
কৃষ্ণদাস পিসি

1
eval "$illcommando", আপনার কমান্ডটি চালানোর আগে ম্যাঙ্গাল না হওয়ার জন্য, উদ্ধৃতিগুলি সহ । পার্থক্যটি দেখার জন্য কোটগুলির সাথে এবং ছাড়া evalকোনও মান দিয়ে আইং চেষ্টা করুন illcommando='printf "%s\n" " * "'
চার্লস ডাফি

@ টম্যাজাটো-রিইনস্টেটমোনিকা হ্যাঁ, এটি কমান্ডের রিটার্ন মানকে এগিয়ে দেয়। তবে এটি "${PIPESTATUS[@]}"ব্যাশে ভেরিয়েবলটি সঠিকভাবে সেট করে না । তবে, কমান্ডটি যদি একটি সফল কমান্ডে পাইপযুক্ত ব্যর্থ কমান্ডটি থাকে তবে set -o pipefailসঠিকভাবে evalব্যর্থতার প্রস্থান কোডটি ফিরিয়ে আনতে পারে।
ক্যামেরন হাডসন

আমি এমন কিছু করার চেষ্টা করছিলাম grep -E '$filter' unfiltered.txt > filtered.txt, কমান্ড লাইনে কেন এটি কাজ করে এবং কেন গণিত মান সহ এটি বাশ স্ক্রিপ্টে কাজ করে না তা আমার কোনও ধারণা ছিল না। আপনার উত্তর আমার স্ক্রিপ্ট সংরক্ষণ করেছে। আমি এখানে কিছু দুর্দান্ত নথিভুক্ত উদাহরণ যুক্ত করব যা আমি বুঝতে পারি যে কীভাবে কার্যকর হয় কাজ করে। linuxhint.com/bash_eval_command
ছাত্র0495

28

আমি সাধারণত বন্ধনীগুলিতে কমান্ডগুলি রাখি $(commandStr), যদি এটি আমাকে বাশ ডিবাগ মোডটি দুর্দান্ত খুঁজে পেতে সহায়তা না করে তবে স্ক্রিপ্টটি চালানbash -x script


4
কমান্ডএসআরটি কী বোঝায় তা আমি নিশ্চিত নই, তবে কমপক্ষে এটি আমার পক্ষে কার্যকর হয়নি। আপনি যদি পুরো কাজের উদাহরণ ব্যবহার করেন তবে এটি আরও ভাল।
রবিন মনোলি

@ রবিনমনোলি আপনার জন্য পরিষ্কারতা উন্নত করেছে।
অ্যান্ড্রু


10

আপনার কমান্ডগুলি ভেরিয়েবলগুলিতে রাখবেন না, কেবল এটি চালান

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'

1
ঠিক আছে। তবে যেখানে আমার চলকগুলি ছিল যা কেবলমাত্র একটি যুক্তি হিসাবে চলতে হবে "${arg}"। উদাহরণ: সার্ভার :: team_l_start = "$ {teamAComm}"
জোয়াও Portela

1

./me কাসেটগুলি উত্থাপন_পরে ()

আমি এই জাতীয় কিছু খুঁজছিলাম, তবে আমার একই স্ট্রিং বিয়োগ দুটি পরামিতি পুনরায় ব্যবহার করার প্রয়োজন ছিল যাতে আমি এই জাতীয় কিছু দিয়ে শেষ করেছিলাম:

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

এটি এমন কিছু যা আমি ওপেনস্ট্যাক হিট স্ট্যাক সৃষ্টি পর্যবেক্ষণ করতে ব্যবহার করি। এই ক্ষেত্রে আমি দুটি শর্ত আশা করি, "সামস্ট্যাক" নামে একটি স্ট্যাকের 'ক্রিয়াট' এবং একটি স্ট্যাটাস 'কমপ্লিট'

এই ভেরিয়েবলগুলি পেতে আমি এর মতো কিছু করতে পারি:

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

0

এখানে আমার গ্রেড বিল্ড স্ক্রিপ্ট যা বংশগতিতে সঞ্চিত স্ট্রিংগুলি কার্যকর করে :

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

একাকী ")" কদর্য ধরনের। তবে কীভাবে সেই অ্যাস্থ্যাটিক দিকটি ঠিক করা যায় সে সম্পর্কে আমার কোনও ধারণা নেই।


0

স্ক্রিপ্ট দ্বারা সম্পাদিত সমস্ত কমান্ড দেখতে -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কোথাও পুনর্নির্দেশ করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.