बैश स्क्रिप्ट में `1 >>` और `2 >>` का क्या अर्थ है?


15

मेरे पास निम्नलिखित बैश स्क्रिप्ट है, जो मुझे समझ में आता है >> का उपयोग कमांड के आउटपुट को अधिलेखित करने के बजाय किसी मौजूदा फ़ाइल में जोड़ने के लिए किया जाता है, लेकिन इस मामले में यह क्या कर रहा है? यह स्क्रिप्ट कुछ exe फ़ाइलों को एक प्रारूप से दूसरे प्रारूप में बदलने के लिए कह रही है। प्रत्येक फ़ाइल के लिए कई साल होते हैं, इसलिए यह फ़ाइल का नाम देखकर प्रत्येक फ़ाइल के माध्यम से लूप करता है। जब मैं इस स्क्रिप्ट को चलाता हूं तो मुझे "अस्पष्ट रीडायरेक्ट" मिलता है

#!/bin/bash
source $HOME/.bashrc

jobout=${1}
joberr=${2}

# Set some paths and prefixes

yr_bgn=2000
yr_end=2000

yr=${yr_bgn}
pth_data='/mnt/'
pth_rst='/mnt/'



while [ ${yr} -le ${yr_end} ]
do
   ./executable1 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable2 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable3 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   let yr=${yr}+1
done

आप इस स्क्रिप्ट को कैसे कहते हैं?
Hauke ​​Laging

संभव डुप्लिकेट की डुप्लिकेट संभव > $ 2
Hauke ​​Laging

@ हॉकिंग, नहीं यह नहीं है। यह प्रश्न किसी करीबी के बारे में लगता है, लेकिन ऐसा नहीं है
रोमियो निनोव

@RomeoNinov क्या आप प्रासंगिक अंतर को समझाते हैं?
15

@HaLLaging स्क्रिप्ट को .sh फ़ाइल में सहेजा गया है। मैं सिर्फ टाइप ./myscript.sh
हरमन Toothrot

जवाबों:


19

1>>और 2>>विशिष्ट फ़ाइल-डिस्क्रिप्टर के लिए पुनर्निर्देशन हैं, इस मामले में मानक आउटपुट (फ़ाइल डिस्क्रिप्टर 1) और मानक त्रुटि (फाइल डिस्क्रिप्टर 2)।

इसलिए स्क्रिप्ट सभी "मानक" संदेशों को ${jobout}और सभी त्रुटि संदेशों को पुनर्निर्देशित कर रही है ${joberr}>>दोनों मामलों में उपयोग करने का मतलब है कि सभी संदेश संबंधित फाइलों में संलग्न हैं।

ध्यान दें कि ${jobout}और ${joberr}उनके मानों को दो कमांड-लाइन मापदंडों से स्क्रिप्ट ( ${1}और ${2}) तक ले जाएं, इसलिए आपको उन फ़ाइलों को निर्दिष्ट करने की आवश्यकता है जिन्हें आप संदेशों को संग्रहीत करने के लिए उपयोग करना चाहते हैं। यदि पैरामीटर नहीं दिए गए हैं तो स्क्रिप्ट आपके द्वारा देखे गए "अस्पष्ट पुनर्निर्देशन" त्रुटि संदेश का उत्पादन करेगी; स्क्रिप्ट को वास्तव में जांचना चाहिए कि क्या पैरामीटर प्रदान किए गए हैं और एक उपयुक्त त्रुटि संदेश का उत्पादन करते हैं अन्यथा, कुछ ऐसा

if [ -z "$1" -o -z "$2" ]; then
    echo "Log files for standard and error messages must be specified"
    echo "${0} msgfile errfile"
    exit 1
fi

स्क्रिप्ट की शुरुआत में।


2

आपके मामले में 1 >> करंट स्टैडआउट हैंडलर से फ़ाइल $ {जॉबआउट} 2 तक की जानकारी संलग्न करें। वर्तमान स्टैडर हैंडलर से फ़ाइल $ {जॉबरीयर} तक की जानकारी जोड़ें।

जॉबआउट और जॉबरी फाइलें हैं, जिन्हें स्क्रिप्ट के पहले और दूसरे पैरामीटर के रूप में परिभाषित किया गया है


1

चूंकि स्क्रिप्ट को कॉल करने में कोई पैरामीटर नहीं हैं $1और पैरामीटर $2खाली हैं और इसलिए $joboutऔर हैं $joberr

आपको स्क्रिप्ट को इस तरह से कॉल करना होगा:

./myscript.sh file1 file2

पैरामीटर संख्या का >>पुनर्निर्देशन ऑपरेटरों से पहले संख्याओं से कोई लेना-देना नहीं है ।
बरमार

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