बाहर निकलने के बिना इतिहास को बचाओ


16

linux ubuntu bash टर्मिनल में। क्या बाहर निकलने के बिना बैश इतिहास को बचाने का कोई तरीका है? मैंने "HISTCONTROL = erasedups" के लिए विन्यास सेट किया है

जो मेरी राय में अनदेखा से बेहतर काम करता है।

वैसे भी जब तक मैं "निकास" में टाइप करता हूं, तब तक यह bash टर्मिनल में अंतिम कुछ कमांड को नहीं सहेजेगा। मुझे टर्मिनल विंडो पर क्रॉस को क्लिक करने के लिए उपयोग किया जाता है, इसलिए मुझे हमेशा गुस्सा आता है कि जब मैं फिर से काम कर रहा था तो आखिरी कमांड्स सहेजे नहीं गए थे।

अनुस्मारक: http://www.thegeekstuff.com/2008/08/15-examples-to-master-linux-command-line-history/#more-130


जब रिमोट को पोटीन से टर्मिनल तक पहुंचना होता है तो बाहर निकलने पर बंद खिड़की चुनने का विकल्प होता है: हमेशा। जो मेरे लिए इतिहास बचाता है।
ColacX

जवाबों:


35

बैश इतिहास

सक्रिय टर्मिनल में जारी किए गए किसी भी नए कमांड .bash_historyको निम्नलिखित कमांड के साथ फाइल में जोड़ा जा सकता है :

history -a

समझने की एकमात्र मुश्किल अवधारणा यह है कि प्रत्येक टर्मिनल की अपनी बैश इतिहास सूची होती है ( .bash_historyजब आप टर्मिनल खोलते हैं तो फ़ाइल से लोड किया जाता है )

यदि आप इस सक्रिय टर्मिनल के जीवनकाल में अन्य टर्मिनलों द्वारा लिखे गए किसी भी नए इतिहास को खींचना चाहते हैं, तो आप .bash_history फ़ाइल की सामग्री को सक्रिय बैश इतिहास सूची में संलग्न कर सकते हैं।

history -c;history -r

यह वर्तमान इतिहास सूची को साफ़ कर देगा ताकि हमें बार-बार सूची न मिले, और इतिहास फ़ाइल को (अब खाली) सूची में जोड़ें।

उपाय

आप PROMPT_COMMANDप्रत्येक नए प्रॉम्प्ट के साथ कमांड जारी करने के लिए बैश वेरिएबल का उपयोग कर सकते हैं (हर बार जब आप टर्मिनल में एंटर दबाते हैं)

export PROMPT_COMMAND='history -a'

यह जारी करने के साथ ही प्रत्येक कमांड को इतिहास फ़ाइल में रिकॉर्ड करेगा ।

परिणाम

अब आपके द्वारा खोले गए किसी भी नए टर्मिनल में exitउन अन्य टर्मिनलों के बिना अन्य टर्मिनलों का इतिहास होगा । यह मेरा पसंदीदा वर्कफ़्लो है।

अधिक परिशुद्धता

मान लीजिए कि (किसी कारण से) आपके पास दो टर्मिनल हैं जो आप एक साथ उपयोग कर रहे हैं और आप चाहते हैं कि इतिहास प्रत्येक नए कमांड के लिए दोनों के बीच प्रतिबिंबित करे।

export PROMPT_COMMAND='history -a;history -c;history -r'

यहाँ मुख्य दोष यह है कि आपको विपरीत टर्मिनल से नवीनतम इतिहास प्राप्त करने के लिए PROMPT_COMMAND को फिर से चलाने के लिए एंटर दबाना पड़ सकता है।

आप देख सकते हैं कि यह अधिक सटीक विकल्प संभवतः ओवरकिल क्यों है, लेकिन यह उस उपयोग के मामले के लिए काम करता है।


यह उचित वर्कफ़्लोज़ के लिए बहुत बढ़िया है ....
मैट

2

फ़ाइल करने के लिए इतिहास को सहेजने के लिए:

history -w ~/history.txt
vim ~/history.txt

यह इतिहास को फ़ाइल में निर्यात करता है, जिसे history.txt कहा जाता है। फिर आप अपने पसंदीदा संपादक का उपयोग करके इसे देख सकते हैं।

Http://tech.karbassi.com/2007/01/14/view-and-change-bash-history/ से कॉपी किया गया उत्तर


1

वहाँ है सभी अपने bash इतिहास को बचाने के लिए एक तरह से एक अलग फाइल करने के लिए है, लेकिन आप और इतिहास तंत्र का उपयोग करने की कोशिश कर किसी कारण से वह अपने इतिहास के सभी बचत नहीं कर रहा है कर रहे हैं, कि एक अलग मुद्दा है।

अपने सभी इतिहास को एक अलग फ़ाइल में सहेजने के लिए, हमेशा, चाहे जो भी हो टर्मिनल के लिए

यहाँ प्रदान की गई एक पटकथा में चाल है।

# don't put duplicate lines in the history. See bash(1) for more options
# ... and ignore same sucessive entries.
export HISTCONTROL=ignoreboth

# set the time format for the history file.
export HISTTIMEFORMAT="%Y.%m.%d %H:%M:%S "

# If this is an xterm set the title to user@host:dir
case "$TERM" in
  xterm*|rxvt*)
  # Show the currently running command in the terminal title:
  # http://www.davidpashley.com/articles/xterm-titles-with-bash.html
  show_command_in_title_bar()
  {
    case "$BASH_COMMAND" in
      *\033]0*)
      # The command is trying to set the title bar as well;
      # this is most likely the execution of $PROMPT_COMMAND.
      # In any case nested escapes confuse the terminal, so don't
      # output them.
      ;;
      *)
      if test ! "$BASH_COMMAND" = "log_bash_eternal_history"
      then
        echo -ne "\033]0;$(history 1 | sed 's/^ *[0-9]* *//') :: ${PWD} :: ${USER}@${HOSTNAME}\007"
      fi
      ;;
    esac
  }
  trap show_command_in_title_bar DEBUG
  ;;
  *)
  ;;
esac

log_bash_eternal_history()
{
  local rc=$?
  [[ $(history 1) =~ ^\ *[0-9]+\ +([^\ ]+\ [^\ ]+)\ +(.*)$ ]]
  local date_part="${BASH_REMATCH[1]}"
  local command_part="${BASH_REMATCH[2]}"
  if [ "$command_part" != "$ETERNAL_HISTORY_LAST" -a "$command_part" != "ls" -a "$command_part" != "ll" ]
  then
    echo $date_part $HOSTNAME $rc "$command_part" >> ~/.bash_eternal_history
    export ETERNAL_HISTORY_LAST="$command_part"
  fi
}

PROMPT_COMMAND="log_bash_eternal_history"

इतिहास कमांड बताने के लिए "अभी सेव करें!" वर्चुअल टर्मिनल विंडो पर X क्लिक करते समय

सबसे पहले आपको जो समझना है, वह यह है कि आपके वर्चुअल टर्मिनल एमुलेटर bashप्रक्रिया से बाहर निकलने पर उसे मारने के लिए किस तंत्र का उपयोग करता है? - यह निर्भर करेगा कि आप किस सटीक टर्मिनल एमुलेटर का उपयोग कर रहे हैं।

कुछ विकल्प हैं, और उन सभी में UNIX सिग्नल शामिल हैं

  • SIGTERM, SIGINT, SIGQUIT: बैश जब इंटरैक्टिव मोड में इन संकेतों में से एक को प्राप्त करता है तो इसे अनदेखा करना है, इसलिए यह संभवतः ऐसा नहीं है।

  • SIGHUP: यह संकेत आमतौर पर बैश को शालीनता से समाप्त करने और सफाई करने का कारण बनता है, लेकिन मुझे यकीन नहीं है कि "क्लीनअप" में इतिहास फ़ाइल को सहेजना शामिल है। यह शायद नहीं है।

  • SIGKILL, SIGSTOP: बैश के लिए इन संकेतों को अनदेखा करना एक यूजरस्पेस प्रक्रिया के रूप में असंभव है। कर्नेल इन संकेतों का उपयोग करके किसी भी समय प्रक्रिया को जबरन मार सकता है या रोक सकता है। यदि आपका वीटी एमुलेटर इनमें से एक भेज रहा है, तो हम इसे फँसाने और बाहर निकलने से पहले कुछ नहीं कर सकते हैं, इसलिए आप भाग्य से बाहर हैं।

कुछ संदर्भ: सर्वरफॉल्ट सवाल 337123

यूनिक्स सवाल 6332

GNU बैश मैनुअल में इंटरएक्टिव रूप से इतिहास का उपयोग करना

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