एक फ़ोल्डर में "स्थानीय" बैश इतिहास याद रखें?


11

मेरे पास एक फ़ोल्डर में एक स्क्रिप्ट है जिसे मैं लंबे तर्कों के साथ उपयोग करता हूं। क्या कोई मौका है कि मैं पूरे इतिहास के माध्यम से वापस जाने के बजाय उस विशिष्ट निर्देशिका में निष्पादित आदेशों का इतिहास रख सकता हूं?


3
दिलचस्प सवाल। BTW, "पूरे इतिहास के माध्यम से" वापस जाने के लिए, आप इसे खोजने के लिए Ctrl + R का उपयोग कर सकते हैं, ऐसी स्थितियों में मैं यही करूंगा।
phk

हाँ, यह मदद करता है लेकिन इस तरह से मेरे पास केवल आखिरी है। क्या एक से अधिक परिणाम होने की संभावना है?
फैबर

1
एक बार जब आप कमांड नाम का हिस्सा दर्ज कर लेते हैं तो आप Ctrl + R दबाए रख सकते हैं।
mtahmed

history | lessशायद? यह वास्तव में आपके प्रश्न का उत्तर नहीं देता है, लेकिन यह वह जगह है जहाँ मैं शुरू करूँगा।
रोज़ा

@roaima और फिर आगे की ओर / पीछे की खोज के लिए "/" + खोज-शब्द + दर्ज करें और फिर "n" / "N" का उपयोग करके खोज करें
phk

जवाबों:


2

बैश के PROMPT_COMMAND में हुक लगाने से, यह फ़ंक्शन हर बार आपको नया प्रॉम्प्ट चलाने के लिए मिलता है, इसलिए यह देखने का एक अच्छा समय है कि क्या आप एक निर्देशिका में हैं, जिसके लिए आप एक कस्टम इतिहास चाहते हैं। समारोह की चार मुख्य शाखाएँ हैं:

  1. यदि वर्तमान निर्देशिका ( $PWD) नहीं बदली गई है, तो कुछ भी न करें (वापसी)।

लोक निर्माण विभाग तो है बदल गया है, तो हम एक स्थानीय समारोह जिसका एकमात्र उद्देश्य कारक के लिए एक स्थान में "कस्टम निर्देशिका" कोड है की स्थापना की। आप मेरी परीक्षा-निर्देशिकाओं को अपने (अलग करके |) बदलना चाहेंगे ।

  1. यदि हम कस्टम निर्देशिका में नहीं या बाहर बदल गए हैं, तो बस "पिछली निर्देशिका" चर को अपडेट करें और फ़ंक्शन से बाहर लौटें।

चूंकि हमने निर्देशिकाओं को बदल दिया है, इसलिए "पिछली निर्देशिका" चर को अपडेट करें, फिर इन-मेमोरी इतिहास को हिस्टीमर पर सहेजें, फिर इन-मेमोरी इतिहास को साफ़ करें।

  1. यदि हम एक कस्टम निर्देशिका में बदल गए हैं , तो .bash_historyवर्तमान निर्देशिका में एक फ़ाइल होने के लिए HISTFILE सेट करें ।

  2. अन्यथा, हम एक कस्टम डायरेक्टरी से बदल गए हैं , इसलिए HISTFILE को स्टॉक एक पर रीसेट करें।

अंत में, जब से हमने इतिहास की फाइलें बदली हैं, उस पिछले इतिहास में वापस पढ़ें।

चीजों को प्राप्त करने के लिए, स्क्रिप्ट PROMPT_COMMAND मान सेट करता है और दो आंतरिक-उपयोग चर (स्टॉक हिस्टीमर और "पिछली निर्देशिका") को बचाता है।

prompt_command() {
  # if PWD has not changed, just return
  [[ $PWD == $_cust_hist_opwd ]] && return

  function iscustom {
    # returns 'true' if the passed argument is a custom-history directory
    case "$1" in
      ( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
      ( * ) return 1;;
    esac
  }

  # PWD changed, but it's not to or from a custom-history directory,
  # so update opwd and return
  if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
  then
    _cust_hist_opwd=$PWD
    return
  fi

  # we've changed directories to and/or from a custom-history directory

  # save the new PWD
  _cust_hist_opwd=$PWD

  # save and then clear the old history
  history -a
  history -c

  # if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
  if iscustom "$PWD"
  then
    HISTFILE=$PWD/.bash_history
  else
    HISTFILE=$_cust_hist_stock_histfile
  fi

  # pull back in the previous history
  history -r
}

PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD

0

यदि आप एक ही निर्देशिका के लिए इतिहास चाहते हैं, तो जेफ़ का जवाब बहुत अच्छा है, लेकिन यदि आप zsh स्थापित करने के साथ ठीक हैं, तो आप सभी निर्देशिकाओं के लिए निर्देशिका के लिए एक इतिहास विशिष्ट प्राप्त करने के लिए प्रति-इतिहास-निर्देशिका का उपयोग कर सकते हैं ।

आप द्वारा zsh स्थापित कर सकते हैं:

brew install zsh

वैकल्पिक रूप से, यदि आप ओह-माय-ज़श को स्थापित करना चाहते हैं, तो आप हिस्टडब प्लगइन में जोड़ सकते हैं और sqlite db को क्वेरी करने के लिए एक कस्टम क्वेरी लिख सकते हैं जिसमें histdb जोड़ता है। मैंने इसके बारे में लिखा था और एक देव डायरीज़ पोस्ट में ऑटो पूर्णता जोड़ रहा था । बोनस कमांड अनुभाग की जाँच करें ।

क्वेरी इस तरह दिखती है

show_local_history() {
    limit="${1:-10}"
    local query="
        select history.start_time, commands.argv 
        from history left join commands on history.command_id = commands.rowid
        left join places on history.place_id = places.rowid
        where places.dir LIKE '$(sql_escape $PWD)%'
        order by history.start_time desc
        limit $limit
    "
    results=$(_histdb_query "$query")
    echo "$results"
}

यह एक वैकल्पिक सीमा को भी स्वीकार करता है:

show_local_history 50

उदाहरण के लिए।


-1

जब मुझे कई बार लंबे तर्कों के साथ एक कमांड का उपयोग करने की आवश्यकता होती है, तो मैं आमतौर पर मेरे लिए एक उपनाम बनाता हूं ~/.bash_aliasesया ~/.bashrcयदि आप चाहें तो आप इसे अपने पास रख सकते हैं। यह आसान है और इतिहास में पुराने आदेशों को देखने के बजाय समय की बचत करें।


1
यह एक अच्छा संकेत है, लेकिन ओपी की तलाश नहीं थी। ओपी वह / वह क्या देख रहा था के लिए काफी विशिष्ट था (एक समाधान मैं बीटीडब्ल्यू भी साइन अप करूंगा)।
phk

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