2014-04-06 4 views
5

मैं "बाहर निकलने" आदेश के बाद इसे सहेजने के बजाय प्रत्येक दर्ज कमांड के बाद tcsh में इतिहास को सहेजने का प्रयास करता हूं। ऐसा इसलिए होता है क्योंकि आमतौर पर मैं एक ही समय में लगभग 10 टैब खोलता हूं और उसके बाद मैं प्रत्येक टैब में "बाहर निकलने" के बजाय टर्मिनल विंडो बंद करता हूं। परिणाम यह है कि इतिहास केवल अंतिम टैब के लिए सहेजा जाता है। जब मैं टर्मिनल विंडो बंद करता हूं तो यह समाधान काम नहीं करता है: https://stackoverflow.com/a/3577709/2773143tcsh - कमांड के बाद इतिहास को सुरक्षित करें

क्योंकि मैं कोई समाधान नहीं मिला सिर्फ इतिहास आदेशों का उपयोग करते हैं, मैं एक अलग तरीके से इसे हल करने की कोशिश की: सीधे ~/.tcsh_history के लिए हर आदेश गूंज और .tcshrc फ़ाइल में set histfile= ~/.tcsh_history की स्थापना। हालांकि मुझे यह करने का कोई तरीका नहीं मिला। मैंने .alias में सभी आदेशों के लिए alias * '*; ~/someScript.tcsh (कई अन्य संस्करणों के साथ) में एक उपनाम करने के बारे में सोचा लेकिन यह काम नहीं किया। मैंने पाया कि यह प्रत्येक कमांड के लिए अलग-अलग उपनाम करके इसे कैसे काम करता है, लेकिन यह कुछ हद तक बदसूरत है।
उदाहरण के लिए:
alias cd 'cd \!*; ~/saveHist.tcsh \!:0 \!*'
alias grep 'grep \!*; ~/saveHist.tcsh \!:0 \!*'
(आदि)
और ~/saveHist.tcsh फ़ाइल में:

#!/bin/tcsh -f 

echo "$argv" >> ~/.tcsh_history 

लेकिन निश्चित रूप से यह कुछ हद तक बदसूरत है और इस तरह से कुछ आदेश लिखा जाएगा खिड़की बंद करने के बाद ~/.tcsh_history में दो बार।

कोई विचार?

उत्तर

1

यदि आप नीचे दिखाए गए अनुसार savehist शैल चर सेट करते हैं, तो यह इतिहास को हर बार सहेजने पर मौजूदा इतिहास में विलय कर देगा। history -S के उपयोग पर मैन पेज से नीचे:

-एस के साथ, दूसरा रूप इतिहास नाम को इतिहास सूची में सहेजता है। यदि savehist shell variable का पहला शब्द किसी संख्या पर सेट किया गया है, तो अधिकतर कई पंक्तियां सहेजी जाती हैं। यदि सेविस्टिस्ट का दूसरा शब्द 'विलय' पर सेट किया गया है, तो इतिहास सूची को मौजूदा इतिहास फ़ाइल के साथ विलय कर दिया गया है (यदि कोई है तो) और समय टिकट द्वारा क्रमबद्ध किया गया है। (+) विलय का उद्देश्य X विंडो सिस्टम जैसे पर्यावरण के लिए एक साथ उपयोग में कई गोले के साथ है। यदि सेविस्टिस्ट का दूसरा शब्द 'विलय' है और तीसरा शब्द 'लॉक' पर सेट किया गया है, तो इतिहास फ़ाइल अपडेट को अन्य शैल सत्रों के साथ क्रमबद्ध किया जाएगा जो संभवतः एक ही समय में इतिहास को मर्ज करना पसंद करेंगे।

2

आपके द्वारा दर्ज किए गए प्रत्येक शेल कमांड के बाद स्वचालित रूप से कमांड चलाने के लिए, कमांड को postcmd उपनाम पर सेट करें। उदाहरण के लिए:

alias postcmd 'date' 

... "तारीख" कमांड को चलाने के लिए सही होने के बाद आप एक आदेश डालें (हालांकि यह वास्तव में से पहले आदेश आप में प्रवेश किया, जहाँ तक मैं बता सकता हूँ कार्यान्वित) का कारण होगा।

और, जैसा कि मार्क आर्मस्ट्रांग अपने उत्तर में इंगित करता है, history -S वर्तमान इतिहास बचाता है। तो, सैद्धांतिक रूप से, आप

alias postcmd 'history -S' 

... अपने .tcshrc में डाल सकता है, और अपने इतिहास फ़ाइल हर बार जब आप एक आदेश डालें सहेजा जाएगा - हर आदेश आप संभवतः इस्तेमाल कर सकते हैं के लिए अन्य नाम बना ताकि कोई जरूरत नहीं है, या करने के लिए मैन्युअल रूप से अपनी इतिहास फ़ाइल को लिखने के लिए कुछ कस्टम स्क्रिप्ट का उपयोग करें।

मैं कहता हूं कि यह सैद्धांतिक रूप से काम करता है क्योंकि जब मैं इसे कोशिश करता हूं (क्योंकि जब मैं टर्मिनल विंडो बंद करने से पहले exit भूल जाता हूं तो भी मुझे अपने इतिहास से उड़ाया जाता है ...), .history फ़ाइल केवल इतिहास के इतिहास के साथ लिखी जाती है वर्तमान खोल, भले ही mergesavehist चर में निर्दिष्ट है - बहुत निराशाजनक। लेकिन शायद आपका सिस्टम अलग-अलग व्यवहार करता है (मैं ओएस एक्स पर हूं), तो शायद इसे आज़माएं।

+0

हम्म। ऐसा लगता है कि आपको कुछ प्रकार के प्रीकॉमैंड उपनामों में 'इतिहास-एम' जैसे कुछ की आवश्यकता होगी। (untested) –

+0

'उर्फ precmd' इतिहास -एम 'काम करने लगता है, लेकिन यह कमांड इतिहास संख्या के साथ विनाश खेलता है। –

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