শেল স্ক্রিপ্টে লিনাক্স নিয়ে টেম্প্লেট করছেন?


26

আমি যা সম্পাদন করতে চাই তা হ'ল:

১) $ সংস্করণ $ পথের মতো ভেরিয়েবল সহ টেমপ্লেট হিসাবে একটি কনফিগার ফাইল থাকা (উদাহরণস্বরূপ অ্যাপাচি কনফিগারেশন)

২) টেমপ্লেটের ভেরিয়েবলগুলি "পূরণ করে" এবং একটি উত্পন্ন ফাইলটি ডিস্কে লেখার শেল স্ক্রিপ্ট রয়েছে।

শেল স্ক্রিপ্ট দিয়ে এটি কি সম্ভব? আমি খুব কৃতজ্ঞ হব যদি আপনি কিছু কমান্ড / সরঞ্জামগুলির নাম দিতে পারেন যা আমি এটি বা কিছু ভাল লিঙ্কগুলি সম্পাদন করতে পারি।

উত্তর:


23

এটি খুব সম্ভব। এটি বাস্তবায়নের একটি খুব সহজ উপায় হ'ল টেমপ্লেট ফাইলটি আসলে স্ক্রিপ্ট হতে এবং শেল ভেরিয়েবল যেমন ব্যবহার করা

#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
cat > /tmp/destfile <<-EOF
here is some config for version $version which should
also reference this path $path
EOF

এমনকি আপনি নির্দিষ্ট করে version=$1এবং কমান্ড লাইনে এই কনফিগারযোগ্যটি তৈরি path=$2করতে পারেন, যাতে আপনি এটির মতো চালাতে পারেন bash script /foo/bar/baz 1.2.3-সামনে ফাইলের শেষে হোয়াইটস্পেস সামনে লাইন উপেক্ষা করা কারণ, প্লেইন ব্যবহার <<EOFকরে আপনি যে আচরণ করতে চাই না।

এটি করার আরেকটি উপায় হ'ল অনুসন্ধান ব্যবহার করা এবং সেডের কার্যকারিতা প্রতিস্থাপন করা

#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
sed -e "s/VERSION/$version/g" -e "s/PATH/$path/" /path/to/templatefile > /tmp/destfile

যা ভার্সন এবং পথের প্রতিটি স্ট্রিং প্রতিস্থাপন করবে। যদি অন্য কারণগুলি থাকে তবে সেই স্ট্রিংগুলি টেম্পলেট ফাইলের মধ্যে থাকতে পারে আপনি নিজের অনুসন্ধান তৈরি করতে পারেন এবং প্রতিস্থাপন করতে পারেন ভার্সন বা% সংস্করণ% বা দুর্ঘটনাক্রমে ট্রিগার হওয়ার সম্ভাবনা কম এমন কিছু।


18

ছাড়া অন্য কোনও সরঞ্জামের প্রয়োজন নেই /bin/sh। ফর্মের একটি টেমপ্লেট ফাইল দেওয়া

Version: ${version}
Path: ${path}

এমনকি মেশানো শেল কোড সহ অন্তর্ভুক্ত

Version: ${version}
Path: ${path}
Cost: ${cost}\$
$(i=1; for w in one two three four; do echo Param${i}: ${w}; i=$(expr $i + 1); done)

এবং একটি শেল পার্সেবল কনফিগারেশন ফাইলের মতো

version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"

এটি প্রসারিত করা সহজ বিষয়

Version: 1.2.3-r42
Path: /some/place/under/the/rainbow/where/files/dance/in/happiness
Cost: 42$
Param1: one
Param2: two
Param3: three
Param4: four

প্রকৃতপক্ষে, শেল ভেরিয়েবলের কনফিগারেশন ফাইলের config_fileপথ এবং টেমপ্লেট ফাইলে যাওয়ার পথটি দেওয়া হয়েছে template_file, আপনাকে যা করতে হবে তা হ'ল:

. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""

এটি টেমপ্লেট ফাইল (@ এমটিনবার্গের সমাধান) হিসাবে সম্পূর্ণ শেল স্ক্রিপ্ট না হওয়ার চেয়ে সম্ভবত সুন্দর।

সম্পূর্ণ নিষ্পাপ টেমপ্লেট সম্প্রসারণ প্রোগ্রাম:

#!/bin/sh

PROG=$(basename $0)

usage()
{
    echo "${PROG} <template-file> [ <config-file> ]"
}

expand()
{
    local template="$(cat $1)"
    eval "echo \"${template}\""
}

case $# in
    1) expand "$1";;
    2) . "$2"; expand "$1";;
    *) usage; exit 0;;
esac

এটি প্রসারকে স্ট্যান্ডার্ড আউটপুটে আউটপুট দেবে; স্ট্যান্ডার্ড আউটপুটটিকে কেবল একটি ফাইলে পুনর্নির্দেশ করুন বা কাঙ্ক্ষিত আউটপুট ফাইল তৈরি করতে উপরের সুস্পষ্ট ফ্যাশনে পরিবর্তন করুন।

ক্যাভেটস: ফাইলে আনসকেপড ডাবল কোটস ( ") থাকা থাকলে টেমপ্লেট ফাইলের প্রসারণ কাজ করবে না । সুরক্ষার কারণে, আমাদের সম্ভবত কিছু স্পষ্ট বিচক্ষণ চেক অন্তর্ভুক্ত করা উচিত বা আরও ভাল, যদি টেম্পলেট ফাইলটি বাহ্যিক সত্তার দ্বারা উত্পন্ন হয় তবে শেল এ্যাস্কিং ট্রান্সফর্মেশন সম্পাদন করা উচিত।


1
লোকেরা এইভাবে মজাদার জিনিসগুলি করতে শেল স্ক্রিপ্টগুলি সক্রিয়ভাবে ব্যবহার করে দেখতে এখনও দুর্দান্ত। আমার এক বন্ধু শেল স্ক্রিপ্টে একটি ঘড়ি লিখেছিল। github.com/tablespoon/fun/blob/master/cli- ਘੰਟੇ মজার সময় আসলে।
ছানা

2
আমি যখন এই উত্তরটি নিজেই এটির সন্ধানের
পাইরোক্র্যাটার

9

লিনাক্স সিএলআই-তে সহজেই এটি করার সহজ উপায় হ'ল envsubstপরিবেশগত পরিবর্তনসমূহ।

টেমপ্লেট ফাইল উদাহরণ apache.tmpl:

<VirtualHost *:${PORT}>
    ServerName ${SERVER_NAME}
    ServerAlias ${SERVER_ALIAS}
    DocumentRoot "${DOCUMENT_ROOT}"
</VirtualHost>

রান envsubstএবং আউটপুট ফলাফল নতুন ফাইল my_apache_site.conf:

export PORT="443"
export SERVER_NAME="example.com"
export SERVER_ALIAS="www.example.com"
export DOCUMENT_ROOT="/var/www/html/"
envsubst < apache.tmpl > my_apache_site.conf

আউটপুট:

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot "/var/www/html/"
</VirtualHost>

2
এটি জিএনইউ গেটেক্সটেক্সের অংশ, এবং তাই সমস্ত বড় ইউনিক্স প্ল্যাটফর্মগুলিতে (ম্যাকোস এক্স সহ) মাইক্রোসফ্ট উইন্ডোজে উপলব্ধ।
ট্রাইসেস

4

আপনার সম্ভবত পুতুল বা শেফের মতো একটি কনফিগারেশন ম্যানেজমেন্ট সিস্টেমটি সন্ধান করা উচিত । এগুলি আপনি উপরে বর্ণিত এবং আরও অনেক কিছু সহজেই করতে পারে ।


1
ধন্যবাদ। অবশ্যই, আমি শেফ ইনস্টল এবং চলমান আছে। আপনার নিজের কুকবুকগুলি যখন লিখতে হয় তবে এটি প্রচুর ওভারহেড যুক্ত করে। আমি রুবি প্রোগ্রামিংয়ের ভাষা জানি না এবং আমার উপসংহারটি ছিল। সহজ কেসগুলির জন্য শেল স্ক্রিপ্ট দিয়ে এটি করা সহজ (যদি সম্ভব হয়)।
মার্কাস

দেখে মনে হচ্ছে পুতুল এবং শেফ উভয়ই টেমপ্লেটগুলির জন্য ইআরবি ব্যবহার করে এবং এটি শুরু করা হাস্যকরভাবে সহজ। একটি ভেরিয়েবল দেওয়া name, <%= name %>একটি টেমপ্লেটের স্ট্রিং nameএর মান সঙ্গে প্রতিস্থাপন করা হবে । আপনি nameটেমপ্লেটের বাইরে কীভাবে সংজ্ঞা দেন তা অবশ্যই দুটি সিস্টেমের মধ্যে পৃথক।
মাইক রেনফ্রো

1
হ্যাঁ টেম্প্লেটিং (শেফ সহ) নিজেই একেবারে সহজ। তবে শেফকে ফ্রেমওয়ার্ক হিসাবে ব্যবহার (এবং কুকবুকগুলি লেখার জন্য) অনেক সময় প্রয়োজন requires টেমপ্লেটগুলিতে ডেটা পেতে আপনাকে বুঝতে হবে শেফ কোথায় এবং কীভাবে ডেটাসোর্সগুলির "মার্জিং" এবং প্রচুর অন্যান্য স্টাফ পরিচালনা করে। আমি নিজের কুকবুকগুলি লিখতে শুরু করেছি, তবে শেল স্ক্রিপ্টটি আমার বিশেষ ক্ষেত্রে 100 গুণ দ্রুত হতে পারে ...
মার্কাস

শেফ বা পুতুলের জন্য অবকাঠামোগত প্রাপ্তি একটি বেদনা হতে পারে বা আপনি কীভাবে তাদের মাথাছাড়া চালনাবেন তা বোঝার চেষ্টা করতে পারেন যা একটি মজাদার সাহসিক কাজ। জবাবগুলি বক্সের বাইরে টানতে বা টানতে মোডে দুর্দান্ত কাজ করে যাতে এটি এটি খুঁজে বের করার এবং এটি নিজেকে স্ক্রিপ্ট করার আরও ভাল ভারসাম্য বজায় রাখতে পারে। docs.ansible.com/template_module.html
ছানা

4

আপনি লাইটওয়েট এবং বাস্তব টেমপ্লেট বদলে শেল কোডটি নতুন ফাইল উত্পন্ন চান, চলিত পছন্দ sed& awkবা perl। এখানে একটি লিঙ্ক রয়েছে: http://savvyadmin.com/generate-text-from-templates-scriptts-and-csv-data/

আমি, আমি পার্ল, টিসিএল, পাইথন, রুবি বা class শ্রেণীর অন্য কোনও মতো একটি বাস্তব ভাষা ব্যবহার করব। স্ক্রিপ্টিং জন্য কিছু নির্মিত। তাদের সকলের গুগলে ভাল, সাধারণ টেম্প্লেটিং সরঞ্জাম এবং প্রচুর উদাহরণ রয়েছে।


4

আমি তার জন্য shtpl ব্যবহার করি। (আমার বেসরকারী প্রকল্প, যার অর্থ এটি ব্যাপকভাবে ব্যবহৃত হচ্ছে না But তবে আপনি যেভাবেই হোক এটি পরীক্ষা করতে চান)

উদাহরণস্বরূপ, আপনি একটি সিএসভি-ফাইলের বাইরে একটি / ইত্যাদি / নেটওয়ার্ক / ইন্টারফেস তৈরি করতে চান, আপনি এটি এর মতো করতে পারেন:

সিএসভি-ফাইল সামগ্রী (এখানে টেস্ট.সিএসভি):

eth0;10.1.0.10;255.255.0.0;10.1.0.1
eth1;192.168.0.10; 255.255.255.0;192.168.0.1

টেমপ্লেট (এখানে ইন্টারফেস.tpl):

#% IFS=';'
#% while read "Val1" "Val2" "Val3" "Val4"; do
auto $Val1 
iface $Val1 inet static
  address $Val2 
  netmask $Val3 
  gateway $Val4 

#% done < "$CSVFILE"

COMMAND:

$ CSVFILE=test.csv sh -c "$( shtpl interfaces.tpl )"

ফলাফল:

auto eth0 
iface eth0 inet static
  address 10.1.0.10 
  netmask 255.255.0.0 
  gateway 10.1.0.1 

auto eth1 
iface eth1 inet static
  address 192.168.0.10 
  netmask  255.255.255.0 
  gateway 192.168.0.1

উপভোগ করুন!


1

আমি ফুফের উত্তরের উন্নতি করেছি যাতে ব্যবহারকারীর পক্ষে ডাবল উদ্ধৃতিগুলি ম্যানুয়ালি ছাড়ার প্রয়োজন নেই:

#!/bin/bash
template="$(cat $1)"
template=$(sed 's/\([^\\]\)"/\1\\"/g; s/^"/\\"/g' <<< "$template")
eval "echo \"${template}\""

1

আমি সম্প্রতি একটি বাশ স্ক্রিপ্ট প্রকাশ করেছি যা জিনজার মতো টেম্পলেট সিনট্যাক্স ব্যবহার করে কেবল এটি সম্পাদন করে। একে কুকি বলা হয় । এখানে একটি ডেমো রয়েছে:

কুকি ডেমো


কিভাবে এই প্রশ্নের উত্তর দেয়?
রালফ্রেডল

1
নিবন্ধ আমি অবশ্যই এই প্রশ্নটি আবার পড়ি যে আমি অবশ্যই কিছু মিস করেছি, তবে আমি এটি দেখছি না। আসলে, এটি যেভাবে জিজ্ঞাসা করা হয়েছিল তার কোনও অংশের উত্তর দেয় না ? এটি প্রায় অনুরূপ যে আমি এই প্রশ্নের উত্তর দেওয়ার একমাত্র উদ্দেশ্য নিয়ে কুকি তৈরি করেছি ... যা আমি দফায় করেছিলাম, যদিও আমি তখন এটিকে আমার মাথায় কিছুটা আলাদাভাবে বলতে পারি। :)
ব্রায়ান বুগি

মধ্যস্থতাকারী খেলতে আমার একটু দেরি হয়েছে, তবে রাল্ফ কেবল কৃতজ্ঞতার সাথে আপনাকে কুকি কীভাবে প্রশ্নের উত্তর দেয় তা ব্যাখ্যা করার জন্য প্ররোচিত করছিল, বরং অনিশ্চিতভাবে বোঝাতে চেষ্টা করার চেয়ে আপনি নিজের প্রকল্পটি ভালভাবে জানেন না যে এটি কারও সমস্যার সমাধান করতে পারে কিনা তা বিচার করার জন্য। ।
আবাতুর

0

আমি সম্ভবত এই পার্টিতে দেরি করেছি। যাইহোক, আমি খুব একই সমস্যাটি নিয়ে হোঁচট খেয়েছি এবং কোডের কয়েকটি লাইনে আমার নিজস্ব বেস টেম্পলেট ইঞ্জিন তৈরির পক্ষে বেছে নিয়েছি:

বলুন যে আপনার কাছে এটি রয়েছে file.template:

# My template
## Author
 - @NAME@ <@EMAIL@>

এবং এই rulesফাইল:

NAME=LEOPOLDO WINSTON
EMAIL=leothewinston\@leoserver.com

আপনি এই আদেশটি কার্যকর করুন:

templater rules < file.template

আপনি এটি পান:

# My template
## Author
 - LEOPOLDO WINSTON <leothewinston@leoserver.com>

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

 bpkg install vicentebolea/bash-templater

এটি প্রকল্পের সাইট


0

একটি হেরডোক + কন্ট্রোল অক্ষর ব্যবহার করে @ ফুফের দুর্দান্ত উত্তরের (নিউলাইনগুলি মন্তব্যে ফর্ম্যাট করেনি) সম্প্রসারণ করতে আপনি স্বেচ্ছাচারিত অক্ষর এবং ফাইলের নাম অনুমতি দিতে পারবেন :

template() {
    # if [ "$#" -eq 0 ] ; then return; fi # or just error
    eval "cat <<$(printf '\x04\x04\x04');
$(cat $1)
"
}

এটি কোনও নন-নাল চরিত্র গ্রহণ করে এবং কেবলমাত্র 3 ^Dবাইট যদি তাদের নিজস্ব লাইনে মুখোমুখি হয় তবে (তা বাস্তবে কখনও হবে না) তাড়াতাড়িই কেটে যায় । zsh এমনকি নাল টার্মিনেটর সমর্থন করে, তাই printf '\x00\x00\x00'কাজ করবে। templateএমনকি বিশ্বাসঘাতক ফাইল নামগুলির জন্যও কাজ করে:

for num in `seq 10`; do
    template 'foo "$ .html' # works
done

সাবধান শেল টেম্পলেটগুলি স্বেচ্ছাসেবী কমান্ডগুলি "প্রসারিত" করতে পারে, যেমন $(launch_nukes.sh --target $(curl -sL https://freegeoip.app/csv/ | cut -d, -f 9,10))। দুর্দান্ত শক্তি দিয়ে…

সম্পাদনা করুন: আপনি যদি চান না যে আপনার ফাইলগুলি আপনাকে sudo -u nobody shআগে থেকেই নিউক চালু করে, ঠিক (বা অন্য কোনও নিরাপদ ব্যবহারকারী) আগেই।

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