একটি কমান্ড গতিশীলভাবে তৈরি করুন


9

আমি একটি স্ক্রিপ্টে কাজ করছি এবং আমার tarকমান্ডটি গতিশীলভাবে তৈরি করা দরকার ।

আমি কী করার চেষ্টা করছি তা বোঝাতে এখানে দুটি উদাহরণ দেওয়া হল:

#!/bin/bash

TAR_ME="/tmp"

EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*")
_tar="tar "`printf -- '--exclude="%s" ' "${EXCLUDE[@]}"`" -zcf tmp.tar.gz"
echo COMMAND: "${_tar}"
${_tar} "$TAR_ME"

echo -e "\n\nNEXT:\n\n"

EXCLUDE=("--exclude=/tmp/hello\ hello" "--exclude=/tmp/systemd*" "--exclude=/tmp/Temp*")
_tar="tar "`printf -- '%s ' "${EXCLUDE[@]}"`" -zcf test.tar.gz"
echo COMMAND: "${_tar}"
${_tar} "$TAR_ME"

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

COMMAND: tar --exclude="/tmp/hello hello" --exclude="/tmp/systemd*" --exclude="/tmp/Temp*"  -zcf tmp.tar.gz /tmp
tar: hello": Cannot stat: No such file or directory

COMMAND: tar --exclude=/tmp/hello\ hello --exclude=/tmp/systemd* --exclude=/tmp/Temp*  -zcf test.tar.gz 
tar: hello: Cannot stat: No such file or directory

আপনার কেবল একটি জিনিস জানা দরকার, খুব পুরানো মেশিনে কাজ করার জন্য আমার স্ক্রিপ্টটি দরকার, যার অর্থ আমি শেষ ব্যাশের বৈশিষ্ট্যগুলি ব্যবহার করতে পারি না।


আমি বিশ্বাস করি - এক্সক্লুড বিকল্পটি এর পরে কেবল একটি স্ট্রিং গ্রহণ করতে পারে। আপনার কাছে যদিও একাধিক - বহিরাগত বিবৃতি থাকতে পারে। সম্ভবত "--exclude = / tmp / হ্যালো --excolve = হ্যালো" ওফ চেষ্টা করুন। কিছু মনে করো না. আমি ভুল বুঝেছিলাম.
লুইস এম

@ লুইজম আমার মনে হয় ওপি ডিরেক্টরি "/ টিএমপি / হ্যালো হ্যালো" (হ্যাঁ, একটি স্পেস সহ) বাদ দিতে চায়
আরচেমার

@ শেলকোড সমস্ত বর্জনকে উদ্ধৃত করার বিষয়ে কী বলেন, যেমন "--excolve = / tmp / hello
नमस्कार

হ্যাঁ। এজন্য আমি উফ স্টেটমেন্ট পরে রেখেছি। :)
লুইস এম

evalমৃত্যুদণ্ড কার্যকর করার সামনে কীভাবে ?
জিম্মিজ

উত্তর:


11

এক্সিকিউটেবল স্ট্রিং করার চেষ্টা করবেন না। পরিবর্তে একটি অ্যারেতে আর্গুমেন্টগুলি তৈরি করুন এবং কল করার সময় এটি ব্যবহার করুন tar(আপনি ইতিমধ্যে এর জন্য সঠিকভাবে অ্যারে ব্যবহার করছেন EXCLUDE):

#!/bin/bash

directory=/tmp

exclude=( "hello hello" "systemd*" "Temp*" )

# Now build the list of "--exclude" options from the exclude array:
for elem in "${exclude[@]}"; do
    exclude_opts+=( --exclude="$directory/$elem" )
done

# Run tar
tar -cz -f tmp.tar.gz "${exclude_opts[@]}" "$directory"

সহ /bin/sh:

#!/bin/sh

directory=/tmp

set -- "hello hello" "systemd*" "Temp*"

# Now build the list of "--exclude" options from the $@ array
# (overwriting the values in $@ while doing so)
for elem do
    set -- "$@" --exclude="$directory/$elem"
    shift
done

# Run tar
tar -cz -f tmp.tar.gz "$@" "$directory"

নোট উদ্ধৃত $@মধ্যে shকোড এবং উভয়ের ${exclude[@]}এবং ${exclude_opts[@]}bashকোড। এটি নিশ্চিত করে যে তালিকাটি পৃথকভাবে উদ্ধৃত উপাদানগুলিতে প্রসারিত হবে।

সম্পর্কিত:


2
mix(){
        p=$1; shift; q=$1; shift; c=
        i=1; for a; do c="$c $q \"\${$i}\""; i=$((i+1)); done
        eval "${p%\%*}$c${p#*\%}"
}
mix 'tar % -zcf tmp.tar.gz' --exclude "/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*"

EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*")
mix 'tar % -zcf tmp.tar.gz' --exclude "${EXCLUDE[@]}"

উত্তরটি এখানে প্রসারিত করা হচ্ছে । এটি কোনও বাশমের উপর নির্ভর করে না, এটি ডেবিয়ানদের /bin/shসাথে এবং এর সাথেও দুর্দান্ত কাজ করবে busybox


আপনার সহায়তার জন্য আপনাকে অনেক ধন্যবাদ, কিন্তু আমি সত্যই ইওলটিকে পছন্দ করি না, এটি বেশ বিপজ্জনক ... তদ্ব্যতীত, এই কোডটি বোঝা বেশ শক্ত, আপনার কাছে আরও সহজ কিছু নেই? : / স্ক্রিপ্টটি বিতরণ করা হবে তাই আমাকে এটিকে যতটা সম্ভব সহজ রাখতে হবে ...
শেলকোড

এটা বিপজ্জনক নয়। এটি দিয়ে চালান set -x। ঠিক কি বুঝতে পারছেন না?
মশবির

এছাড়াও, স্ট্যাকওভারফ্লোতে মূল উত্তরটি পড়ুন। এটি একটি ডেমো অন্তর্ভুক্ত।
মশবী

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

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