मेकफाइल कैसे पता लगा सकता है कि क्या स्थानीय मशीन में एक कमांड उपलब्ध है?


11

मैंने जीटीडी -स्टाइल सिस्टम में अपने कार्यों की योजना के लिए ओआरजी-मोड का उपयोग करना शुरू किया । ड्रॉपबॉक्स फ़ोल्डर की निर्देशिका में प्रत्येक ऑर्ग फाइलों को डालते हुए , मैं तीन अलग-अलग स्थानीय मशीनों से इन फ़ाइलों को संपादित / प्रबंधित करने के लिए emacs चलाता हूं: साइगविन, मैक ओएस एक्स, और डेबियन। जैसा कि मैं अपने आईपैड से इन ऑर्ग फाइलों तक पहुंचने के लिए मोबाइलऑर्ग का उपयोग करता हूं, जब कोई बदलाव किया जाता है तो एक फाइल को अप-टू-डेट रखा जाना चाहिए। इसे चलाकर किया जा सकता है ।checksums.datmd5sum *.org > checksums.dat

समस्या यह है कि कमांड के लिए तीन अलग-अलग md5sumकमांड हैं: md5sum.exeसिग्विन में, md5मैक ओएस एक्स में, और md5sumडेबियन में। सबसे आदर्श स्थिति एक मेकफाइल है, जो ड्रॉपबॉक्स फोडर में संग्रहीत है, पता लगाता है कि कौन सी कमांड वर्तमान मशीन में उपलब्ध है और उस कमांड को md5 चेकसम ऑपरेशन करने के लिए चलाता है।



1
@ केविन जो एक ओवरकिल की तरह लगता है। मैं तीन अलग-अलग प्रणालियों में एक प्रोग्राम स्थापित नहीं करना चाहता। प्रत्येक प्रणाली में, एक ड्रॉपबॉक्स फ़ोल्डर स्थानीय निर्देशिका के रूप में सुलभ है। जब मैं make checksumड्रॉपबॉक्स फ़ोल्डर के तहत चेकसम डेटा उत्पन्न करने के लिए दौड़ता हूं , तो मैं चाहता हूं कि यह पता लगाने के बाद कि वर्तमान मशीन में चेकसम कमांड उपलब्ध है, मेकफाइल एक उपयुक्त कमांड का उपयोग करता है।
फेडेरिको मैग्लानेज़

यदि आप महत्वपूर्ण मात्रा में स्क्रिप्टिंग करने जा रहे हैं, और प्रोजेक्ट छोटा है, तो मैं आपको सुझाव दूंगा।
फहीम मीठा

जवाबों:


7

चेकसम उत्पन्न करने के लिए संभावित कमांड

दुर्भाग्य से, क्रिप्टोग्राफिक चेकसम उत्पन्न करने के लिए कोई मानक उपयोगिता नहीं है। सीआरसी उत्पन्न करने के लिए एक मानक उपयोगिता है cksum:; यह गैर-शत्रुतापूर्ण वातावरण में परिवर्तनों का पता लगाने के आपके उद्देश्य के लिए पर्याप्त हो सकता है।

मैं MD5 के बजाय SHA1 का उपयोग करने की सलाह दूंगा। ऐसी कई प्रणालियाँ नहीं हैं जिनके पास MD5 उपयोगिता है, लेकिन कोई SHA1 नहीं है, और यदि आप क्रिप्टोग्राफ़िक चेकसम का उपयोग करने जा रहे हैं, तो आप टकरावों को खोजने के लिए कोई ज्ञात विधि के साथ एक एल्गोरिथ्म का उपयोग कर सकते हैं (यह मानकर कि आप आकार की जाँच भी करते हैं)।

एक उपकरण जो मानक नहीं है, लेकिन आम है और यह पचा सकता है कि ओपनएसएसएल है । यह साइगविन, डेबियन और ओएसएक्स के लिए उपलब्ध है, लेकिन दुर्भाग्य से ओएसएक्स पर डिफ़ॉल्ट स्थापना का हिस्सा नहीं है।

openssl dgst -sha1

OSX 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) $< >$@

पोर्टेबल (POSIX) बनाते हैं

आप केवल शेल कमांड को नियम में चला सकते हैं, इसलिए चेकसम की गणना करने वाले प्रत्येक नियम में लुकअप कोड शामिल होता है। आप स्निपेट को एक चर में रख सकते हैं। याद रखें कि नियमों में अलग-अलग रेखाओं का मूल्यांकन स्वतंत्र रूप से किया जाता है। यह भी याद रखें कि $जिन संकेतों को शेल को पारित किया जाना है, उनसे बचने की आवश्यकता है $$

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पोर्टेबिलिटी के लिए उपयोग कर सकते हैं ।
गिल्स एसओ- बुराई को रोकना '

ऐसा प्रतीत होता है कि आपने उपयोग typeकरने से स्विच किया है command। क्या अन्य तरीकों को भी अद्यतन किया जाना चाहिए?
सीन

@ सीन अन्य विधियां ठीक हैं: typeएक कमांड की उपस्थिति का परीक्षण करने का एक सही, पोर्टेबल तरीका है, इसके साथ समस्या यह है कि यह sha1sum is /usr/bin/sha1sumकेवल प्रोग्राम नाम के बजाय आउटपुट का उत्पादन करता है । यह एकमात्र ऐसी जगह थी, जहां मैंने typeकेवल अपने रिटर्न वैल्यू के बजाय आउटपुट का उपयोग किया था ।
गिल्स एसओ- बुराई को रोकना '

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 के साथ आपका परीक्षण व्यर्थ है।
क्रिस डाउन

"प्रकार" का उपयोग करने पर अधिक: cmd = $ (foo md5 md5sum कॉपी में cmd ​​के लिए; $ $ cmd> / dev / null 2> & 1 && echo $ cmd && break; किया गया) टाइप करें। $ cmd file1 file2 file3> md5.txt
michael


1

या तो GNU ऑटोटूलस (जैसा कि एक टिप्पणी में उल्लेख किया गया है), या सीएमके भी एक विकल्प है।

GNU ऑटोटॉल्स अधिक पारंपरिक दृष्टिकोण हैं, लेकिन (और शायद केवल खुद के लिए बोल रहे हैं) मुझे नहीं लगता कि लोग वास्तव में शुरू में प्रोजेक्ट का उपयोग करने की संभावना पर बहुत उत्साहित हैं। खैर, यह किसी भी मामले में एक सीखने की अवस्था है। सीएमके ब्लॉक पर नया बच्चा है, और शायद कम आम (और अभी भी सीखने की अवस्था है)। इसका अपना सिंटैक्स है, और यह आपके प्लेटफ़ॉर्म के लिए मेकफ़ाइल्स बनाता है। सीएमके का इतना संयुक्त नहीं होने का अलग फायदा है * एक्स-केंद्रित; यह यूनिक्स, विंडोज और मैक पर मज़बूती से काम करता है (उदाहरण के लिए, यह एमएसईएक्स प्रोजेक्ट्स बना सकता है, उदाहरण के लिए, मेकाइल के बजाय।)

संपादित करें: और बेशक 'मेकफाइल्स' का सुझाव दिया गया था, यह उत्तर उस अनुमान के साथ जाता है। लेकिन शायद सिर्फ एक अजगर लिपि या (हांस्प) एक साधारण जावा कार्यक्रम इस कार्य के लिए अधिक उपयुक्त होगा; स्क्रिप्टिंग / प्रोग्रामिंग भाषा प्लेटफ़ॉर्म पर ऐसा ही करेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.