इनपुट में बिल्ली का उपयोगी या बेकार उपयोग


3

मेरी mysql पुनर्स्थापना स्क्रिप्ट में मैं इनपुट के लिए पहले बनाई गई mysqldump फ़ाइल का उपयोग करता हूं। यह फ़ाइल नाम एक तर्क के रूप में कमांड लाइन पर प्रदान किया जाता है और इसे gzipped नहीं किया जा सकता है या नहीं किया जा सकता है। मैं फ़ाइल को mysql स्टेटमेंट के इनपुट के रूप में उपयोग करना चाहता हूं लेकिन फ़ाइल को बदल / गनज़िप न करें, बस सामग्री पढ़ें।

मैं mysql कमांड के इनपुट के लिए निम्नलिखित कोड का उपयोग करता हूं (जो मुझे पसंद है):

mysql -u $user -p"$pass" $dbname <( [[ "${mysqldumpfile: -3}" = ".gz" ]] && gzip -d -c "${mysqldumpfile}" || cat "${mysqldumpfile}" )

तो mysql डंप फ़ाइल का नाम ".gz" में समाप्त होता है, फिर मैं stdout को गनज़िप करता हूं, अन्यथा मैं stdout करने के लिए बिल्ली करता हूं। या तो stdout को mysql कमांड में stdin के रूप में उपयोग किया जाता है।

क्या यह UUOC है? वहाँ बिल्ली का उपयोग नहीं करने के लिए एक रास्ता है?

क्या ऐसा करने का एक और तरीका है (एक पंक्ति में)? और स्पष्ट होने के लिए मैं एक if / if / check / statement में जांच नहीं करना चाहता और दो अलग-अलग mysql कमांड करता हूं। मुझे एक कमांड लाइन पसंद है जो दो अलग-अलग इनपुट का उपयोग कर सकती है।

संपादित करें: जबसे zcat -f यदि डेटा संकुचित नहीं है, तो दोनों असंपीड़ित और बिल्ली या सिर्फ बिल्ली करेंगे, यह सबसे अच्छा उदाहरण नहीं है। मैं अभी भी जानना चाहूंगा कि क्या कोई और तरीका है <( test && do_this_command_as_input || cat this_is_the_input ) और बिल्ली का उपयोग नहीं करते।

और इससे पहले कि कोई इसका उल्लेख करे ... आप एक mysql कमांड लाइन का उपयोग करके इनपुट नहीं कर सकते <( )

जवाबों:


2

यह वह बिल्ली नहीं है जिसे आप ढूंढ रहे हैं :)

mysql -u $user -p"$pass" $dbname <(zcat -f  $mysqldumpfile)

संपादित करें: लघुकोष्ठक भूल गए

2 संपादित करें:

पूरी तरह से बिल्ली या zcat के बिना इस समय ठीक है:

gunzip -f $mysqldumpfile 2>/dev/null; mysql -u $user -p"$pass" $dbname < ${mysqldumpfile%%.gz}

हालांकि पहले विकल्प को प्राथमिकता दें

ठीक है 3 संस्करण और मैं कर रहा हूँ: पी

mysql -u $user -p"$pass" $dbname < (gzip -fdc $mysqldumpfile)

तो एक बुरा उदाहरण, इस मामले में zcat -f बिल्ली की तरह काम करेगा ... लगता है कि मुझे सवाल ठीक करना होगा।
johnnyB

एक बिल्ली / zcat- कम संस्करण जोड़ा
Nanzikambe

3

यह बेकार का उपयोग नहीं है cat

आपको चाहिए cat क्योंकि यह के स्थान पर तटस्थ फिल्टर है gzip। या तो फ़ाइल के माध्यम से प्रक्रिया gzip और फिर स्टडआउट करने के लिए डंप करें, या स्टडआउट के लिए कोई प्रसंस्करण और डंप न करें।

मान लीजिए कि आपको केवल gzipped फ़ाइलें मिलती हैं, तो कमांड इस तरह दिखाई देगी:

mysql -u $user -p"$pass" $dbname <( gzip -d -c "${mysqldumpfile}" )

अब आवश्यकताएं बदल जाती हैं और आपको केवल सादे फाइलें मिलती हैं:

mysql -u $user -p"$pass" $dbname <( cat "${mysqldumpfile}" )

यह एक बेकार उपयोग होगा cat क्योंकि इससे इसे सरल बनाया जा सकता है:

mysql -u $user -p"$pass" $dbname "${mysqldumpfile}"

आपके आदेश में आप को छोड़ नहीं सकते cat क्योंकि आप प्रक्रिया प्रतिस्थापन को छोड़ नहीं सकते।


यहाँ एक क्रिया के साथ आपकी आज्ञा है if then else लेकिन केवल एक mysql लाइन।

togzip_ornottogzip() {
  if [[ "${mysqldumpfile: -3}" = ".gz" ]]; then
    gzip -d -c "${mysqldumpfile}"
  else
    cat "${mysqldumpfile}"
  fi
}

mysql -u $user -p"$pass" $dbname <( togzip_ornottogzip )

अब कैसे बेहतर लिखने के लिए मेरा सुझाव:

मेरा सुझाव है कि आप अपनी स्क्रिप्ट को हमेशा स्टड में इनपुट के रूप में सादे फ़ाइलों की अपेक्षा करें:

mysql -u $user -p"$pass" $dbname <( cat )

आइए इस स्क्रिप्ट को कहते हैं domysql_stdin

फिर दो लिपियों को लिखें, दोनों एक फ़ाइलनाम को तर्क के रूप में लेते हैं। एक उम्मीद फाइल gzipped और अन्य सादे फ़ाइलों की उम्मीद है। दोनों फिर आउटपुट को पहले स्क्रिप्ट पर रीडायरेक्ट करेंगे।

एक उम्मीद gzipped फ़ाइलें:

gzip -d -c "${mysqldumpfile}" | domysql_stdin

सादे फ़ाइलों की अपेक्षा रखने वाला:

domysql_stdin < "${mysqldumpfile}"

उन्हें फोन करें domysql_gzipped तथा domysql_plain

फिर एक चौथी स्क्रिप्ट लिखें, जो एक फ़ाइलनाम को तर्क के रूप में लेती है, यह जांचें कि फ़ाइल gzipped है या नहीं और फिर gzipped उम्मीद स्क्रिप्ट या सादे उम्मीद स्क्रिप्ट की कॉल करें।

if [[ "${mysqldumpfile: -3}" = ".gz" ]]; then
  how="gzipped"
else
  how="plain"
fi

domysql_$how "${mysqldumpfile}"

इस तरह से प्रत्येक स्क्रिप्ट एक साधारण काम करता है और प्रत्येक भाग अपने आप में प्रयोग करने योग्य है।

चार फ़ाइलों के बजाय आप चार कार्यों के साथ एक फ़ाइल में सब कुछ डाल सकते हैं। आपको बस नाम टकराव और चर दृश्यता और जीवनकाल के साथ लापरवाह होना होगा।


बहुत क्रिया, और इनपुट विघटित हो जाता है (ऐसा माना जाता है कि बाद में इसे ठीक किया जाता है, लेकिन फिर भी)
Nanzikambe

इससे पहले कि मैं अपना संपादन करूँ, मुझे खुशी है कि आपने टिप्पणी की। मेरा सुधरा हुआ सुझाव और भी क्रियात्मक है। "पत्ते इनपुट विघटित" के साथ आपका क्या मतलब है? Gzip कमांड के रूप में यह स्टडआउट करने के लिए decompresses खड़े हैं। कोई फाइल नहीं लिखी है।
lesmana

मेरा बुरा, मैंने अनुमान लगाया कि गज़िप गुनज़िप के लिए एक टाइपो था जो फ़ाइल को डिस्क पर छोड़ देगा। हालाँकि आपने मुझे एक विचार दिया है ...
Nanzikambe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.