কোনও মেকফাইল কীভাবে সনাক্ত করতে পারে যে স্থানীয় মেশিনে একটি কমান্ড পাওয়া যায়?


11

আমি জিটিডি- স্টাইল সিস্টেমে আমার কাজগুলি পরিকল্পনার জন্য org- মোড ব্যবহার করতে শুরু করেছি । ড্রপবক্স ফোল্ডারের প্রতিটি ডিরেক্টরি ফাইল রেখে আমি তিনটি স্থানীয় মেশিন: সাইগউইন, ম্যাক ওএস এক্স এবং ডেবিয়ান থেকে এই ফাইলগুলি সম্পাদনা / পরিচালনা করতে ইম্যাক চালাচ্ছি। আমি যেমন আমার আইপ্যাড থেকে এই org ফাইলগুলি অ্যাক্সেসের জন্য মোবাইলআরজি ব্যবহার করি, কোনও পরিবর্তন করার সময় কোনও ফাইল অবশ্যই আপ টু ডেট রাখতে হবে। দৌড় দিয়ে এটি করা যেতে পারে ।checksums.datmd5sum *.org > checksums.dat

সমস্যাটি হ'ল কমান্ডের জন্য তিনটি পৃথক md5sumকমান্ড রয়েছে: md5sum.exeসাইগউইন, md5ম্যাক ওএস এক্স এবং md5sumডেবিয়ানে। সর্বাধিক আদর্শ পরিস্থিতি হ'ল একটি মেকফাইল, একটি ড্রপবক্স ফডারে সঞ্চিত, বর্তমান মেশিনে কোন কমান্ড উপলব্ধ তা সনাক্ত করে এবং এমডি 5 চেকসাম ক্রিয়াকলাপ করতে সেই আদেশটি চালায়।



1
@ কেভিন এটি ওভারকিলের মতো শোনাচ্ছে। আমি তিনটি স্বতন্ত্র সিস্টেমে কোনও প্রোগ্রাম ইনস্টল করতে চাই না। প্রতিটি সিস্টেমে একটি ড্রপবক্স ফোল্ডার স্থানীয় ডিরেক্টরি হিসাবে অ্যাক্সেসযোগ্য। যখন আমি make checksumএকটি ড্রপবক্স ফোল্ডারের অধীনে চেকসাম ডেটা উত্পন্ন করতে চালিত করি , আমি চাই মেকফিল বর্তমান মেশিনে কোন চেকসাম কমান্ড উপলব্ধ তা সনাক্ত করার পরে একটি উপযুক্ত কমান্ড ব্যবহার করবে uses
ফেডেরিকো

আপনি যদি উল্লেখযোগ্য পরিমাণে স্ক্রিপ্টিং করতে চলেছেন এবং প্রকল্পটি ছোট হয় তবে আমি স্ক্যানগুলি পরামর্শ দেব।
ফাহিম মিঠা

উত্তর:


7

একটি চেকসাম তৈরির সম্ভাব্য কমান্ড commands

দুর্ভাগ্যক্রমে, একটি ক্রিপ্টোগ্রাফিক চেকসাম উত্পন্ন করার জন্য কোনও স্ট্যান্ডার্ড ইউটিলিটি নেই। সেখানে একটি প্রমিত উপযোগ একটি সিআরসি জেনারেট করতে হল: cksum; একটি প্রতিকূল পরিবেশে পরিবর্তনগুলি সনাক্ত করার উদ্দেশ্যে এটি আপনার পক্ষে পর্যাপ্ত হতে পারে।

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

একটি সরঞ্জাম যা স্ট্যান্ডার্ড নয় তবে সাধারণ এবং হজমগুলি গণনা করতে পারে তা হ'ল ওপেনএসএসএল । এটি সাইগউইন, ডেবিয়ান এবং ওএসএক্সের জন্য উপলব্ধ, তবে দুর্ভাগ্যক্রমে ওএসএক্সে ডিফল্ট ইনস্টলেশনটির অংশ নয় of

openssl dgst -sha1

ওএসএক্স 10.6-তে, একটি shasumইউটিলিটি রয়েছে, যা দেবিয়ানেও উপস্থিত রয়েছে (এটি perlপ্যাকেজের অংশ ) এবং আমি সাইগউইনের উপরও বিশ্বাস করি। এটি পার্ল স্ক্রিপ্ট। বেশিরভাগ ইউনিক্স সিস্টেমে পার্ল ইনস্টল করা আছে, তাই আপনি যদি এই স্ক্রিপ্টটি কোথাও উপলব্ধ না হন তবে উদ্বিগ্ন হন তবে আপনি আপনার মেকফিলের পাশাপাশি সেই স্ক্রিপ্টটি বান্ডিল করতে পারেন।

আপনার সিস্টেমের জন্য সঠিক কমান্ড নির্বাচন করা

ঠিক আছে, আসুন আমরা বলি যে আপনি সত্যিই কোনও আদেশ খুঁজে পাবেন না যা সর্বত্র কাজ করে।

খোলের মধ্যে

typeকোনও কমান্ড উপলব্ধ কিনা তা দেখতে অন্তর্নির্মিতটি ব্যবহার করুন ।

sum=
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do
  if type "${x%% *}" >/dev/null 2>/dev/null; then sum=$x; break; fi
done
if [ -z "$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
$sum *.org

জিএনইউ মেক করুন

মেকফিলটি লোড হয়ে গেলে শেল স্নিপেট চালানোর জন্য আপনি shellফাংশনটি ব্যবহার করতে পারেন এবং আউটপুটটিকে একটি ভেরিয়েবলের মধ্যে সঞ্চয় করতে পারেন।

sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
        $(sum) $< >$@

পোর্টেবল (পসিক্স) তৈরি করুন

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

determine_sum = \
        sum=; \
        for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \
          if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \
        done; \
        if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi

checksums.dat: FORCE
    $(determine_sum); \
    $$sum *.org

সঠিকভাবে কাজ করার জন্য উপরে বর্ণিত "জিএনইউ মেক" পদ্ধতিটি পেতে আমাকে কমান্ডের -Pবিকল্পটি ব্যবহার typeকরতে হয়েছিল, তাই আমি শেষ করেছি sum := $(shell { type -P sha1sum || type -P sha1 || type -P shasum; } 2>/dev/null)
শান

@ সিয়ান বাগ রিপোর্টের জন্য ধন্যবাদ। type -Pকেবলমাত্র আপনার শেলটি বাশ হলেই কাজ করে, এটি উদাহরণস্বরূপ ksh বা ড্যাশ নয় (যা অন্যদের মধ্যে উবুন্টুর ক্ষেত্রে)। আপনি command -vবহনযোগ্যতার জন্য ব্যবহার করতে পারেন ।
গিলস 8:32-

দেখা যাচ্ছে আপনি ব্যবহার typeকরা থেকে স্যুইচ করেছেন command। অন্যান্য পদ্ধতিও কি আপডেট করা উচিত?
শান

@ শিয়ান অন্যান্য পদ্ধতিগুলি ঠিক আছে: typeএকটি কমান্ডের উপস্থিতি পরীক্ষা করার জন্য সঠিক, বহনযোগ্য উপায়, এটির সাথে সমস্যাটি হ'ল এটি sha1sum is /usr/bin/sha1sumকেবল প্রোগ্রামের নামের পরিবর্তে আউটপুট তৈরি করে । এটি একমাত্র জায়গা যেখানে আমি typeকেবলমাত্র তার ফেরতের মানের চেয়ে আউটপুট ব্যবহার করি ।
গিলস 17'12 এ 'খারাপ হওয়া বন্ধ করুন'

5

এটি হ্যাকের কিছু, তবে আপনি প্রতিটি পরীক্ষা করে দেখতে পারেন এবং তারা যদি তা করে তবে তা কার্যকর করতে পারেন:

[ -x "`which md5 2>/dev/null`" ] && md5 newfile >>sums
[ -x "`which md5sum 2>/dev/null`" ] && md5sum newfile >>sums

আমি বেশ কিছু নির্দিষ্ট সাইগউইন হ'ল কমান্ডগুলি (সহ md5sum) স্বীকৃতি দিচ্ছি .exe, তবে আপনাকে যদি তা করতে হয় তবে তা অন্তর্ভুক্ত করুন।


4
whichপ্রস্থান মূল্যগুলি পোর্টেবল নয়। typeপরিবর্তে ব্যবহার করুন (এবং আপনি সম্ভবত if; then; elifএকাধিক এক্সিকিউটেবলের মধ্যে সমস্যা এড়াতে ব্যবহার করতে চান )। whichএবং typeযেভাবেই হোক এক্সিকিউটেবলের সন্ধান করুন, সুতরাং -x এর সাথে আপনার পরীক্ষাটি অর্থহীন।
ক্রিস ডাউন

"টাইপ" ব্যবহারের ক্ষেত্রে আরও: সেন্টিমিডি = $ (ফু এমডি 5 এমডি 5সাম বারে সিএমডি করার জন্য; টাইপ করুন $ সেমিডি> / দেব / নাল 2> & 1 && প্রতিধ্বনি $ সেমিডি && বিরতি; সম্পন্ন); $ সেমিডি ফাইল 1 ফাইল 2 ফাইল3> md5.txt
মাইকেল


1

হয় জিএনইউ অটটুলগুলি (যেমন একটি মন্তব্যে উল্লিখিত হয়েছে), বা সিএমকেকও একটি বিকল্প।

জিএনইউ অটটুলগুলি আরও traditionalতিহ্যবাহী পদ্ধতির, তবে (এবং সম্ভবত কেবল নিজের জন্য কথা বলছি) আমি মনে করি না যে লোকেরা প্রাথমিকভাবে এগুলি ব্যবহার করে কোনও প্রকল্প স্থাপনের প্রত্যাশায় সত্যিই খুব উত্সাহিত। হ্যাঁ, এটি একটি শিক্ষার বক্ররেখা, যে কোনও ক্ষেত্রেই। সিএমকে ব্লকটির নতুন বাচ্চা, এবং সম্ভবত কম সাধারণ (এবং এখনও একটি শেখার বক্ররেখা রয়েছে)। এটির নিজস্ব সিনট্যাক্স রয়েছে এবং এটি আপনার প্ল্যাটফর্মের জন্য মেকফাইলগুলি তৈরি করে। সিএমকে এতটা আন * এক্স-কেন্দ্রিক না হওয়ার আলাদা সুবিধা রয়েছে; এটি ইউনিক্স, উইন্ডোজ এবং ম্যাকের জন্যও নির্ভরযোগ্যভাবে কাজ করে (উদাহরণস্বরূপ, এটি মেকফিলের পরিবর্তে এমএসভিসি প্রকল্পগুলি তৈরি করতে পারে))

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

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