ব্যাশে কনফিগার ফাইলটি পড়ার সর্বোত্তম উপায়


23

ব্যাশে কনফিগার ফাইলটি পড়ার সর্বোত্তম উপায় কী?
উদাহরণস্বরূপ, আপনার কাছে একটি স্ক্রিপ্ট রয়েছে এবং প্রতিবার আপনি স্ক্রিপ্টটি কল করার সময় ম্যানুয়ালি সমস্ত কনফিগারেশন পূরণ করতে রাজি নন।

সম্পাদনা 1: আমি মনে করি আমি এটি পরিষ্কার করে নিই না, তাই: আমি যা চাই তা হল ... আমার কাছে একটি কনফিগার ফাইল রয়েছে যা পছন্দ করে

variable_name value  
variable_name value ...  

এবং আমি এটি পড়তে চাই আমি জানি আমি যে আর্গুমেন্টগুলি খুঁজছি বা তার জন্য কেবল এটি গ্রেপ্ত করতে পারলাম ... তবে সম্ভবত আরও বুদ্ধিমান উপায় আছে :)


2
আপনার কী ধরণের কনফিগারেশন বলতে চাইছেন তা আপনাকে দেখতে হবে। একটি উদাহরণ দিন।
মারু

ইউনিক্স এবং লিনাক্স স্ট্যাকএক্সচেঞ্জ এও একটি খুব অনুরূপ প্রশ্ন দেখুন ।
মাইকেল 21

উত্তর:


38

এমবিবার যেমন বলেছে, sourceঅন্য একটি ফাইল। উদাহরণস্বরূপ, আপনার কনফিগারেশন ফাইলটি (বলুন some.config) হবে:

var1=val1
var2=val2

এবং আপনার স্ক্রিপ্ট দেখতে পারে:

#! /bin/bash

# Optionally, set default values
# var1="default value for var1"
# var1="default value for var2"

. /path/to/some.config

echo "$var1" "$var2"

/etc/defaultসাধারণত অনেকগুলি ফাইল একইভাবে অন্যান্য শেল স্ক্রিপ্টগুলির জন্য কনফিগারেশন ফাইল হিসাবে কাজ করে। এখানে পোস্টগুলি থেকে একটি খুব সাধারণ উদাহরণ /etc/default/grub। এই ফাইলটি GRUB- র জন্য কনফিগারেশন বিকল্পগুলি সেট করতে ব্যবহৃত হয়, যেহেতু grub-mkconfigএটি একটি শেল স্ক্রিপ্ট যা এটি উত্স:

sysconfdir="/etc"
#…
if test -f ${sysconfdir}/default/grub ; then
  . ${sysconfdir}/default/grub
fi

আপনার যদি অবশ্যই ফর্মটির কনফিগারেশন প্রক্রিয়া করতে হয়:

var1 some value 1
var2 some value 2

তাহলে আপনি এর মতো কিছু করতে পারেন:

while read var value
do
    export "$var"="$value"
done < /path/to/some.config

(আপনি এর মতো কিছু করতেও পারেন eval "$var=$value"তবে এটি কোনও স্ক্রিপ্টের উত্সাহের চেয়ে ঝুঁকিপূর্ণ in আপনি অনিচ্ছাকৃতভাবে সোর্স করা ফাইলের চেয়ে সহজেই ভেঙে ফেলতে পারেন))


এটি একটি দুর্দান্ত উপায়, আমি "="
আইসিআইসিআইসিস

1
নিবন্ধন করুন আপনি কেন =শুরু থেকে এটি লিখতে পারবেন না ?
মারু

1
@ আইসিসিআইসিস এমনই হওয়ার কথা। আপনি বিভিন্ন ফাইলগুলিতে শেল কোড ব্যবহার করতে পারেন /etc/default- এবং বেশিরভাগই ভাল ব্যবহারের জন্য। যদি আপনার অজ্ঞান ব্যবহারকারীর রুট হিসাবে চলমান কিছুর জন্য কনফিগারেশনের অ্যাক্সেস থাকে তবে এটি ইতিমধ্যে একটি হারিয়ে যাওয়া কারণ।
মারু

1
@ আইসিসিআইআইচি আপনার শিক্ষকরা কী চান তা স্পষ্ট করে তুলুন। সফ্টওয়্যার বিকাশ শেখার একটি অংশ প্রয়োজনীয়তাগুলি পরিষ্কারভাবে জানতে পাচ্ছে।
মারু

1
@IcyIcyIce আপডেট দেখুন।
মারু

4

স্পষ্টতই, আমি bashএখানে বিশেষজ্ঞ নই , তবে আপনি যে কোনও ভাষা ব্যবহার করুন না কেন ধারণাটি আলাদা হওয়া উচিত নয়:

একটি উদাহরণ

নীচের উদাহরণে, আপনি আপনার কনফিগার ফাইলে সেট হিসাবে স্ট্রিং সেট করতে , বা একটি স্ট্রিং মুদ্রণ করতে একটি (খুব) প্রাথমিক স্ক্রিপ্টটি ব্যবহার করতে পারেন :

#!/bin/bash

# argument to set a new string or print the set string
arg=$1
# possible string as second argument
string=$2
# path to your config file
configfile="$HOME/stringfile"

# if the argument is: "set", write the string (second argument) to a file
if [ "$arg" == "set" ]
then
echo "$string" > $configfile 
# if the argunment is "print": print out the set string, as defined in your file
elif [ "$arg" == "print" ]
then 
echo "$( cat $configfile )"
fi

তারপর

  • আপনার কনফিগার ফাইলে একটি স্ট্রিং সেট করতে:

    $ '/home/jacob/Bureaublad/test.sh' set "Een aap op een fiets, hoe vind je zoiets?"
  • পরবর্তীকালে, আপনার "কনফিগার ফাইলে" সংজ্ঞায়িত স্ট্রিংটি মুদ্রণ করতে:

    $ '/home/jacob/Bureaublad/test.sh' print
    Een aap op een fiets, hoe vind je zoiets?

অবশ্যই, একটি বাস্তব প্রয়োগিত স্ক্রিপ্টে, আপনাকে আর্গুমেন্টগুলি সঠিক কিনা তা নিশ্চিত করার জন্য প্রচুর স্টাফ যুক্ত করতে হবে, ইনপুটটি ভুল হলে কী করবেন তা সিদ্ধান্ত নিন, সেটিংস ফাইল উপস্থিত নেই ইত্যাদি, তবে:

এটি মূল ধারণা


ধন্যবাদ, আমি কেবল এই প্রশ্নটি আপডেট করছি যা আমি মনে করি যে আমি এটি পরিষ্কার করে
দেখিনি

4

কোনও ফাইল লোড করতে sourceবা ব্যবহার .করতে।

source /path/to/file

অথবা

. /path/to/file

এটি লোড করার আগে ফাইলটি উপস্থিত রয়েছে কিনা তাও পরীক্ষা করার পরামর্শ দেওয়া হয়েছে কারণ যদি কোনও কনফিগারেশন ফাইল উপস্থিত না থাকে তবে আপনি আপনার স্ক্রিপ্টটি চালিয়ে যেতে চান না।


0

আমি এটি ব্যবহার করছি ...

#!/bin/bash

CFG_FILE=/etc/test.conf
CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g')
eval "$CFG_CONTENT"

কনফ ফাইলটি সেড দিয়ে পার্স করা হয় এবং তারপরে সাধারণ ভেরিয়েবল অ্যাসাইনমেন্ট হিসাবে মূল্যায়ন করা হয়

প্রথম সেড কী মানগুলি পার্সিং করে (এটিও সমর্থন করে = ফাঁকা জায়গা দিয়ে ঘিরে)

দ্বিতীয় সেড বৈধ ভেরিয়েবল অ্যাসাইনমেন্টের জন্য চারপাশের স্পেসগুলি = সাইন সরিয়ে দেয়

ফিউচার সিড চিকিত্সা যোগ করা যেতে পারে

সিফ ফাইলের সাথে মেলে না এমন সমস্ত পাঠ্য মুছে ফেলা হবে (# বা; মন্তব্য এবং অন্যান্য সহ)

সচেতন হোন যে এই কনফিগার ফাইলটি থেকে একক লাইন শেল কমান্ডগুলিও মূল্যায়ন করা যেতে পারে!


1
অকেজো ব্যবহারcat । কেন আপনি sedদুবার পিছনে পিছনে ডাকে ? আপনি sedকমান্ডগুলি এর মতো চেইন করতে পারেন:sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g'
ডেভিড ফোস্টার

এছাড়াও, এই sedকমান্ডটি প্রশ্নের মধ্যে নমুনা কনফিগারেশন ফাইল এন্ট্রিগুলির জন্য একটি খালি আউটপুট তৈরি করবে। -1
ডেভিড ফোস্টার

1
আরেকটি সম্ভাব্য উন্নতি: .উপ-প্রক্রিয়াটির আউটপুট ধরে রাখতে অস্থায়ী ভেরিয়েবলের পরিবর্তে কমান্ড এবং প্রক্রিয়া পুনঃনির্দেশটি ব্যবহার করুন:. <(sed ... "$CFG_FILE")
ডেভিড ফোস্টার

অবশ্যই আমার উদাহরণটি কনফিগার ফাইলের মতো কী = মান ব্যবহার করে। এটি "কী মান" এর চেয়ে ভাল অনুশীলন। কী ব্যবহার করে = আমার উদাহরণটি মূল্য দেয়। আমি স্বীকার করি যে সেড কমান্ডগুলি আপনার শৃঙ্খলিত করা ভাল, তবে সোর্স কমান্ড ফাইলটি প্রত্যাশা করে যাতে আমরা ব্যবহার করতে পারি: eval $(sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' "$CFG_FILE")যা কী চলছে তা বোঝার জন্য এটি আরও ভাল।
স্মার্টিন

হ্যাঁ, .কোনও ফাইল প্রত্যাশা করে এবং প্রক্রিয়াটির বিকল্পটি কোনও ফাইলটিতে প্রসারিত হয়। . <(echo echo foo)বাশ v4.3.11 তে যেমন প্রত্যাশিত তেমন কাজ করে। ছোট উদাহরণগুলিতে এটি সম্ভবত কোনও ব্যাপার না। আমি বরং কমান্ড প্রতিস্থাপনের মাধ্যমে একাধিক কিলোবাইট পাস করতাম না।
ডেভিড ফোস্টার

0
#------------------------------------------------------------------------------
# parse the ini like $0.$host_name.cnf and set the variables
# cleans the unneeded during after run-time stuff. Note the MainSection
# courtesy of : http://mark.aufflick.com/blog/2007/11/08/parsing-ini-files-with-sed
#------------------------------------------------------------------------------
doParseConfFile(){
    # set a default cnfiguration file
    cnf_file="$run_unit_bash_dir/$run_unit.cnf"

    # however if there is a host dependant cnf file override it
    test -f "$run_unit_bash_dir/$run_unit.$host_name.cnf" \
    && cnf_file="$run_unit_bash_dir/$run_unit.$host_name.cnf"

    # yet finally override if passed as argument to this function
    # if the the ini file is not passed define the default host independant ini file
    test -z "$1" || cnf_file=$1;shift 1;


    test -z "$2" || ini_section=$2;shift 1;
    doLog "DEBUG read configuration file : $cnf_file"
    doLog "INFO read [$ini_section] section from config file"

    # debug echo "@doParseConfFile cnf_file:: $cnf_file"
    # coud be later on parametrized ...
    test -z "$ini_section" && ini_section='MAIN_SETTINGS'

    doLog "DEBUG reading: the following configuration file"
    doLog "DEBUG ""$cnf_file"
    ( set -o posix ; set ) | sort >"$tmp_dir/vars.before"

    eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$ini_section\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

    ( set -o posix ; set ) | sort >"$tmp_dir/vars.after"

    doLog "INFO added the following vars from section: [$ini_section]"
    cmd="$(comm -3 $tmp_dir/vars.before $tmp_dir/vars.after | perl -ne 's#\s+##g;print "\n $_ "' )"
    echo -e "$cmd"
    echo -e "$cmd" >> $log_file
    echo -e "\n\n"
    sleep 1; printf "\033[2J";printf "\033[0;0H" # and clear the screen
}
#eof func doParseConfFile
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.