क्यों कमांड इतिहास केवल बाहर निकलने पर बचा है


0

मैं प्रति टैब / टर्मिनल में एक अलग इतिहास फ़ाइल को बचाने की कोशिश कर रहा हूं, लेकिन कमांड चलाने के तुरंत बाद मैं इसे सहेजने का प्रबंधन नहीं कर सकता। इतिहास तभी बचा है जब मैं "निकास" चलाता हूं।

यह एक समस्या है कि मैं जो हासिल करना चाहता हूं वह यह है कि टर्मिनल या कंप्यूटर के दुर्घटनाग्रस्त होने की स्थिति में इतिहास की एक प्रति हो।

इंटरनेट के चारों ओर देखने के बाद, यह मेरी .bashrc फ़ाइल में है:

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

कोई आइडिया है कि मैं क्या गलत कर रहा हूँ?

धन्यवाद।


क्या निर्देशिका $HOME/HISTORIESमौजूद है? अगर इसे नहीं बनाते हैं।
mt025

बेशक यह मौजूद है ...
फिदेल

जवाबों:


3

आप PROMPT_COMMAND को गलत तरीके से असाइन कर रहे हैं। जब आप लिखते हैं

PROMPT_COMMAND=$(history -a; $PROMPT_COMMAND)

आप 'इतिहास-ए' (जो कोई आउटपुट नहीं पैदा करते हैं) चला रहे हैं, और फिर $ PROMPT_COMMAND (जो आपके स्टार्टअप स्क्रिप्ट के दौरान खाली हो सकता है) चल रहा है, और PROMPT -COMMAND के लिए उन दोनों कमांड (खाली स्ट्रिंग) के आउटपुट को असाइन कर रहा है। आप क्या चाहते हैं:

PROMPT_COMMAND='history -a'

यदि आप इसे वर्तमान में मौजूदा कमांड में जोड़ना चाहते हैं, तो करें

PROMPT_COMMAND+="history -a${PROMPT_COMMAND+=; }$PROMPT_COMMAND"

धन्यवाद, लेकिन फिर भी काम नहीं कर रहा है। मैंने दोनों चीजों की कोशिश की है। बाहर निकलने पर फ़ाइल को केवल सहेजा जाता है।
फिडेल

PROMPT_COMMAND का वर्तमान मूल्य क्या है? अगर ऐसा है history -a, तो क्या होता है tail $HISTFILE? ध्यान दें कि PROMPT_COMMAND आपके कमांड खत्म होने के बाद तक नहीं चलती है, इसलिए आप history -aएक कमांड से पहले चलने वाले डिबग ट्रैप में डालना पसंद कर सकते हैं ।
विलियम पर्ससेल

PROMPT_COMMAND का मान इतिहास -a है। $ HISTFILE मौजूद नहीं है (जैसा कि मैं शुरू से कह रहा हूं, यह केवल बाहर निकलते समय बनाया गया है), इसलिए उस चर पर पूंछ एक "ओपन नहीं कर सकता" त्रुटि देता है। क्या आप "डिबग ट्रैप" को बेहतर तरीके से समझा सकते हैं?
फिदेल

आप कोशिश कर सकते हैं PROMPT_COMMAND='touch $HISTFILE; history -a' याtrap 'touch $HISTFILE; history -a' DEBUG
विलियम पर्ससेल

वही। उन दोनों में से, परिणाम समान है, केवल अंतर यह है कि अब $ HISTFILE वहां है जब मैं एक नया टर्मिनल शुरू करता हूं, लेकिन मेरे बाहर निकलने तक कुछ भी नहीं लिखा जाता है।
फिदेल

1

शाब्दिक प्रश्न के बजाय आशय का उत्तर देना:

स्क्रिप्ट का उपयोग करके देखें। यह आपको कमांड और उनका आउटपुट देगा। ध्यान दें कि यह कोई रामबाण नहीं है, क्योंकि कर्सर पोजीशन का उपयोग करने वाले किसी भी कमांड को बाद में समझना मुश्किल है।

नाम लिपि - टर्मिनल सत्र का टाइपस्क्रिप्ट बनाएं

सिनॉप्सिस लिपि [-a] [-c COMMAND] [-f] [-q] [-t] [फ़ाइल]

विवरण स्क्रिप्ट आपके टर्मिनल पर छपी हर चीज का एक प्रकार बनाती है। यह उन छात्रों के लिए उपयोगी है जिन्हें असाइनमेंट के सबूत के रूप में एक इंटरैक्टिव सत्र की हार्डकॉपी रिकॉर्ड की आवश्यकता होती है, क्योंकि टाइपस्क्रिप्ट फ़ाइल को बाद में lpr (1) के साथ प्रिंट किया जा सकता है।

यदि तर्क फ़ाइल दी जाती है, तो स्क्रिप्ट फ़ाइल में सभी संवाद सहेजती है। यदि कोई फ़ाइल नाम नहीं दिया गया है, तो टाइपस्क्रिप्ट फ़ाइल टाइपस्क्रिप्ट में सहेजी जाती है।

विकल्प:

  -a'        Append the output to file or typescript, retaining the priorcontents.

-सी COMMAND एक इंटरेक्टिव शेल के बजाय COMMAND रन करें। यह एक स्क्रिप्ट के लिए एक प्रोग्राम के आउटपुट को कैप्चर करना आसान बनाता है जो अलग तरह से व्यवहार करता है जब उसका स्टडआउट टटी नहीं होता है। -f 'फ्लश आउटपुट प्रत्येक लिखने के बाद। यह टेलीकोपरेशन के लिए अच्छा है: एक व्यक्ति 'mkfifo फू; स्क्रिप्ट -f फू 'और दूसरा वास्तविक समय की निगरानी कर सकता है कि' कैट फू 'का उपयोग करके क्या किया जा रहा है।

-q 'चुप रहो।

-t 'आउटपुट टाइमिंग डेटा मानक त्रुटि के लिए। इस डेटा में दो फ़ील्ड होते हैं, जो एक स्पेस द्वारा अलग किए जाते हैं। पहला फ़ील्ड इंगित करता है कि पिछले आउटपुट के बाद कितना समय बीत चुका है। दूसरा फ़ील्ड इंगित करता है कि इस बार कितने वर्ण आउटपुट थे। इस जानकारी का उपयोग यथार्थवादी टाइपिंग और आउटपुट देरी के साथ टाइपप्ले को फिर से करने के लिए किया जा सकता है।

स्क्रिप्ट तब समाप्त होती है जब कांटा हुआ खोल बाहर निकलता है (सी-शेल के लिए बॉर्न शेल (श) (1)) से बाहर निकलने के लिए एक नियंत्रण-डी, और बाहर निकलें, लॉगआउट या नियंत्रण-डी (यदि इग्निओफ़ सेट नहीं है), csh (1) )।

कुछ इंटरएक्टिव कमांड, जैसे vi (1), टाइपस्क्रिप्ट फ़ाइल में कचरा पैदा करते हैं। स्क्रिप्ट उन कमांड के साथ सबसे अच्छा काम करती है जो स्क्रीन में हेरफेर नहीं करते हैं, परिणाम हार्डकॉपी टर्मिनल का अनुकरण करने के लिए होते हैं। ...

Google पर "मैन स्क्रिप्ट" खोजें। यदि आपके पास एक विशेष OS है, तो उसमें शामिल है। यह लिनक्स संस्करण है, लेकिन * बीएसडी, मैक के लिए समान संस्करणों के करीब मौजूद हैं। संभवतः विंडोज़ पोर्ट भी बाहर हैं।


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

1

किसी कारण से जो मुझे समझ नहीं आ रहा है, यह काम करता है:

export HISTFILE_NEW="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -w $HISTFILE_NEW; $PROMPT_COMMAND"

जबकि यह नहीं है

export HISTFILE="$HOME/HISTORIES/bash_history_$(basename $(tty))_$(date '+%Y-%m-%d_%H-%M-%S_%Z')"
export HISTCONTROL=ignoreboth
export HISTFILESIZE=10000
export HISTSIZE=10000
shopt -s histappend
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

बेशक, पहला समाधान सैद्धांतिक रूप से अच्छा एक (दूसरा) की तुलना में धीमा है क्योंकि पूरे इतिहास को हर बार सहेजा जाता है कि एक नया आदेश लिखा गया है।

इसलिए, अगर किसी को पता है कि यह मामला क्यों है और इसे कैसे हल किया जा सकता है, तो मैं बहुत आभारी रहूंगा।

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