BASH

2011-11-22 18 views
51

में एमवी के साथ फ़ाइल नाम में टाइमस्टैम्प जोड़ना ठीक है, मैं एक लिनक्स नौसिखिया हूं, और मुझे एक साधारण बैश स्क्रिप्ट के साथ कोई समस्या है।BASH

मेरे पास एक प्रोग्राम है जो चल रहा है, जबकि एक लॉग फ़ाइल में जोड़ता है। समय के साथ कि लॉग फ़ाइल बड़ी हो जाती है। मैं एक स्टार्टअप स्क्रिप्ट बनाना चाहता हूं जो प्रत्येक रन से पहले लॉग फ़ाइल का नाम बदलकर स्थानांतरित करेगा, प्रभावी रूप से प्रोग्राम के प्रत्येक भाग के लिए अलग-अलग लॉग फाइलें बनायेगा। यहाँ मैं अब तक क्या कर लिया है:

pastebin

DATE=$(date +"%Y%m%d%H%M") 
mv server.log logs/$DATE.log 
echo program 

जब चलाने के लिए, मैं इस देखें:

: command not found 
program 

जब मैं लॉग निर्देशिका के लिए सीडी और dir चलाने के लिए, मैं इस देखें:

201111211437\r.log\r 

क्या चल रहा है? मुझे लगता है कि कुछ वाक्यविन्यास समस्या है जो मुझे याद आ रही है, लेकिन मुझे यह पता लगाना प्रतीत नहीं होता है।


अद्यतन: धन्यवाद shellter करने के लिए नीचे दिए गए टिप्पणी, मैं समस्या हो पाया है तथ्य यह है मैं संपादन कर रहा हूँ कि Notepad ++ में .sh फ़ाइल खिड़कियों में, और उसके बाद सर्वर से एफ़टीपी के माध्यम से भेजने के कारण, जहां मैं एसएसएच के माध्यम से फ़ाइल चलाता हूं। फ़ाइल पर dos2unix चलाने के बाद, यह काम करता है।

नया प्रश्न: फ़ाइल को फिर से भेजने पर हर बार इस फिक्स को निष्पादित करने से बचने के लिए, मैं फ़ाइल को पहले स्थान पर कैसे सहेज सकता हूं?

+2

'\ r' carriage_return, अपने bash स्क्रिप्ट की जांच, शायद स्क्रिप्ट – ajreal

+0

के अंदर शामिल किया जाता है वह कैरिज रिटर्न कहां से आ रहा है? मैं अनुमान लगा रहा हूं कि 'लॉग/$ DATE.log' के बारे में कुछ गलत है, लेकिन टाइपिंग 'echo लॉग/$ DATE.log' सही पथ आउटपुट करता है। – Cat5InTheCradle

+0

मुझे कैसे पता चलेगा? कृपया ब्रांडेड बैश स्क्रिप्ट संलग्न करें, संभावना है कि अनजान व्हाइटस्पेस – ajreal

उत्तर

19

कुछ लाइनों आप अपनी स्क्रिप्ट से तैनात मुझे ठीक लग रही है। यह शायद थोड़ा गहरा है।

आपको यह पता लगाना होगा कि कौन सी लाइन आपको यह त्रुटि दे रही है। अपनी स्क्रिप्ट के शीर्ष पर set -xv जोड़ें। यह लाइन नंबर और कमांड को प्रिंट करेगा जिसे STDERR पर निष्पादित किया जा रहा है। यह आपको यह पहचानने में मदद करेगा कि आपकी स्क्रिप्ट में आपको यह विशेष त्रुटि क्यों मिल रही है।

बीटीडब्ल्यू, क्या आपके पास अपनी स्क्रिप्ट के शीर्ष पर shebang है? जब मुझे ऐसा कुछ दिखाई देता है, तो मैं आमतौर पर शेबांग के साथ एक मुद्दा की उम्मीद करता हूं। उदाहरण के लिए, यदि आपके पास शीर्ष पर #! /bin/bash था, लेकिन आपका बैश दुभाषिया /usr/bin/bash में स्थित है, तो आपको यह त्रुटि दिखाई देगी।

संपादित

न्यू प्रश्न: मैं पहली जगह में सही ढंग से फाइल को सेव कर सकते हैं कैसे, इस हर बार जब मैं फ़ाइल को पुन: भेजने को ठीक प्रदर्शन करने के लिए होने से बचने के लिए?

दो तरीके:

  1. का चयन करें संपादित करें> EOL Conversion-> यूनिक्स स्वरूप मेनू आइटम है जब आप एक फ़ाइल को संपादित। एक बार जब यह सही रेखा समाप्त हो जाए, तो नोटपैड ++ उन्हें बनाए रखेगा।
  2. यह सुनिश्चित करने के लिए कि सभी नई फाइलों में सही रेखा समाप्ति हो, सेटिंग्स-> प्राथमिकता मेनू आइटम पर जाएं, और प्राथमिकता संवाद बॉक्स खींचें। नया दस्तावेज़/डिफ़ॉल्ट निर्देशिका टैब का चयन करें। के तहत नया दस्तावेज़ और प्रारूप, यूनिक्स रेडियो बटन का चयन करें। पर क्लिक करें बटन बंद करें।
+0

के बीच एक जगह नहीं होनी चाहिए मैं देखूंगा कि मैं कोशिश कर सकता हूं या नहीं। फ़ाइल को मेरे लिनक्स सर्वर पर ftp'd करने के बाद dos2unix चल रहा है समस्या हल करती है, लेकिन मैं उस अतिरिक्त चरण के चारों ओर एक रास्ता तलाश रहा हूं। मेरे पास शुरुआत में एक शेबांग नहीं है, यह कुंजी हो सकती है। – Cat5InTheCradle

+1

@AgentSnazz - आह हे! यही समस्या है। यूनिक्स शैल स्क्रिप्ट में यूनिक्स लाइन एंडिंग होना चाहिए। लाइन के अंत को चिह्नित करने के लिए विंडोज/एमएस-डॉस कैरिज रिटर्न-लाइनफीड (उर्फ सीआरएलएफ या \ r \ n) का उपयोग करता है। यूनिक्स केवल एक लाइनफीड (उर्फ एलएफ या \ n) का उपयोग करता है। यदि आप विंडोज मशीन पर यूनिक्स के लिए एक फ़ाइल संपादित कर रहे हैं, तो आपको एक प्रोग्राम एडिटर का उपयोग करना होगा जो सही लाइन समाप्ति (जैसे [विम] (http://www.vim.org) या [नोटपैड ++] (http://notepad-plus-plus.org/) ** ** नोटपैड ** का कभी भी उपयोग न करें। यही कारण है कि आप फ़ाइल नाम में '\ r' देख रहे हैं। प्रत्येक पंक्ति के अंत में एक अदृश्य '\ r' है आपके प्रोग्राम में –

+0

@AgentSnazz - मेरे उत्तर संपादन को देखो। –

4

अच्छा, यह आपके प्रश्न का सीधा जवाब नहीं है, लेकिन जीएनयू/लिनक्स में एक उपकरण है जिसका काम नियमित रूप से लॉग फ़ाइलों को घुमाने के लिए है, पुराने लोगों को एक निश्चित सीमा तक जोड़ दिया जाता है। यह logrotate

+0

मैं इसे देख लूंगा, मुझे अपनी विधि पसंद है क्योंकि यह प्रोग्राम की प्रत्येक रन को अपनी लॉग फ़ाइल में अच्छी तरह से लपेटती है। – Cat5InTheCradle

46
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log 
+11

'दिनांक +"% वाई% एम% डी% एच% एम "' यदि आपका बैश थोड़ा अलग है – zinking

+2

@ ज़िंकिंग के बिंदु पर तनाव के लिए, ** ** ** प्लस साइन और डबल कोट्स – puk

0

आप नोटपैड में अपनी स्क्रिप्ट लिख सकते हैं लेकिन सिर्फ यह सुनिश्चित कर लें कि आप उन्हें का उपयोग कर परिवर्तित इस -> $ एसईडी मैं के/\ r $ // 'yourscripthere

मैं यह सब वे समय का उपयोग जब मैं साइगविन में काम कर रहा हूं और यह काम करता है। उम्मीद है कि यह

2

बैश के भीतर एक एकल पंक्ति विधि इस तरह काम करता है।

[कुछ बाहर डाल]> $ (तारीख "+% वाई% मीटर।% डी% एच% एम% S")।

ver

ver साथ एक टाइमस्टैम्प नाम के साथ एक फ़ाइल पैदा करेगा विस्तार। एक कार्यरत फ़ाइल सूची स्नैप शॉट दिनांक दिनांक स्टाम्प फ़ाइल नाम पर निम्नानुसार काम कर सकती है।

find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver

बेशक

cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver

या और भी आसान

ls > $(date "+%Y.%m.%d-%H.%M.%S").ver

 संबंधित मुद्दे