जब वे एक ही हों तो मैक टर्मिनल को दो लगातार कमांड क्यों याद आते हैं?


10

मैंने हाल ही में मैक का उपयोग करना शुरू किया और इससे पहले कि मैं उबंटू पर काम करता।

मान लीजिए कि मैं अपने टर्मिनल पर एक-एक करके इन कमांडों को चलाता हूं:

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

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

यदि लगातार दो कमांड समान हैं, तो टर्मिनल को दो अलग-अलग कमांड को याद करने के बजाय केवल एक कमांड को याद रखना चाहिए।

मैं इसे macOS पर कैसे बना सकता हूं?


6
सिर्फ पांडित्य के लिए, यह वास्तव में मैक टर्मिनल नहीं है जो ऐसा कर रहा है। यह बैश है, आपके शेल टर्मिनल में चल रहा है। कई गोले हैं और डिफ़ॉल्ट शेल को किसी और चीज़ से बदलना संभव है और सामान्य zshरूप से विभिन्न लिपियों के साथ zsh को अनुकूलित करने के लिए ।
gman

जवाबों:


13

आपको HISTCONTROL पर्यावरण चर को अपने साथ जोड़ना होगा .bash_profile। अपनी .bash_profileपंक्ति में निम्न पंक्ति जोड़ें:

export HISTCONTROL=ignoreboth:erasedups

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


(टर्मिनल में) के लिए मैनुअल पेजbash से :

HISTCONTROL
इतिहास सूची पर कमांड को सहेजने के तरीके को नियंत्रित करने वाले मूल्यों की एक बृहदान्त्र-पृथक सूची। यदि मानों की सूची में इग्नोरस्पेस शामिल है , तो अंतरिक्ष वर्ण से शुरू होने वाली रेखाएं इतिहास की सूची में सहेजी नहीं जाती हैं। अनदेखा किए गए मान के कारण पिछली इतिहास प्रविष्टि से मेल खाती रेखाएं बचती नहीं हैं। का मान ignoreboth के लिए आशुलिपि है ignorespace और ignoredupsइरेडअप्स का एक मूल्य पिछली सभी लाइनों का कारण बनता है कि वर्तमान लाइन को उस सूची को सहेजने से पहले इतिहास सूची से हटा दिया जाए। उपरोक्त सूची में किसी भी मूल्य को अनदेखा नहीं किया गया है। यदि HISTCONTROLअनसेट है, या एक मान्य मान शामिल नहीं है, शेल पार्सर द्वारा पढ़ी गई सभी लाइनें इतिहास सूची में सहेजे जाते हैं, HISTIGNORE के मूल्य के अधीन हैं । मल्टी-लाइन कंपाउंड कमांड की दूसरी और बाद की लाइनों का परीक्षण नहीं किया जाता है, और इतिहास में HISTCONTROL के मूल्य की परवाह किए बिना जोड़ा जाता है ।


4

ऐसा क्यों होता है?

मैक और Ubuntu को बैश के कमांड हिस्ट्री में डुप्लिकेट को संभालने के लिए बॉक्स से अलग तरीके से कॉन्फ़िगर किया गया है। ये कॉन्फ़िगरेशन तथाकथित " डॉट-फाइल्स " में संग्रहीत हैं । ये ~ / .bash * के साथ-साथ सिस्टम वाइड / etc / प्रोफाइल का रूप लेते हैं। ये सभी फाइलें आपकी पसंद के अनुसार अनुकूलित की जा सकती हैं और इंटरैक्टिव गोले, लॉगिन गोले, दूरस्थ गोले आदि के बीच अंतर कर सकती हैं। ये फाइलें एक विशिष्ट क्रम में पढ़ी जाती हैं और विशिष्ट कार्यों की सेवा करती हैं।

MacOS पर समान व्यवहार कैसे प्राप्त करें?

यदि आप केवल यह चाहते हैं, तो "कमांड लाइन की सटीक डुप्लिकेट को अनदेखा करना" का एकल अनुकूलन, आप एलन के उत्तर जैसी किसी चीज़ के साथ जा सकते हैं, अर्थात अपनी bash_profile फ़ाइल के उदाहरण के लिए एक सिंगल लाइन जोड़ें। कोई "उचित तरीका" नहीं है लेकिन अनगिनत विकल्प हैं।

यदि यह आपके बैश के लिए एकमात्र अनुकूलन नहीं है तो यह सबसे अच्छा विकल्प नहीं हो सकता है:

कुछ अन्य नोट:

  • कुछ भी जो आलेखीय अनुप्रयोगों के लिए उपलब्ध होना चाहिए या श (या श के रूप में आह्वान किया जाना चाहिए) के लिए जरूरी है।
  • ~ / .bashrc कुछ भी आउटपुट नहीं करना चाहिए
  • जो कुछ भी केवल लॉगिन गोले के लिए उपलब्ध होना चाहिए, वह ~ / .profile में जाना चाहिए
  • सुनिश्चित करें कि ~ / .bash_login मौजूद नहीं है।

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

सभी exportsसरलीकृत निरीक्षण के लिए अपनी स्वयं की फ़ाइल में निवास कर सकते हैं।

एक फ़ाइल बनाएँ, जो आपके उपयोगकर्ता निर्देशिका के मूल में bash द्वारा पढ़ी गई है, उदाहरण के लिए जिसे .exportsइसमें शामिल है:

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

इसे "सोर्स किया गया" होना चाहिए ताकि इंटरएक्टिव स्टार्टअप पर फ़ाइल को बैश करके पढ़ा जा सके:

फ़ाइलों
को सोर्स करना यदि आपके पास बहुत अधिक शेल कॉन्फ़िगरेशन हैं, तो आप उन्हें कई उप-विभाजनों में विभाजित करना और स्रोत बिलिन का उपयोग करके उन्हें अपने .bashrc से लोड करने के लिए कर सकते हैं: source ~/.exportsइसे जोड़ने के साथ ।

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

if [ -f ~/.exports ]; then
. ~/.exports
fi

कमांड वर्तमान में चल रहे शेल के संदर्भ में . ~/.exportsस्रोत होगा ~/.exports

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


2
कैसे .exportsपढ़ा जाता है (खट्टा)?
fd0

1
@ fd0, अपने आप से, यह macOS में नहीं मिलता है। एलन का जवाब इसे प्राप्त करने का एक उचित तरीका है।
14:34 पर user3439894

का मूल्य तो HISTCONTROLमें स्थापित किया जाएगा .bashrcऔर ~/.bashrcमें प्राप्त किया जाता है ~/.bash_profileतो करने के लिए कोई जरूरत नहीं है चर। एक इंटरैक्टिव लॉगिन शेल और एक इंटरैक्टिव शेल दोनों में वैरिएबल सेट होगा। exportHISTCONTROL
fd0

@ fd0 बिल्कुल: अगर । / अगर मुझे समझ में नहीं आ रहा है: मेरा कहना था कि एलन को एक साथ पोस्ट किया गया एक एएल को एक साथ प्रदान करना है और एस्प_प्रिफ़ाइल रखना है, लेकिन बाकी को जितना संभव हो उतना साफ और सुव्यवस्थित करना है क्योंकि यह एक ऐसे परिदृश्य के लिए है जहाँ बहुत सारे विकल्प / सेटिंग्स मानी जाती हैं। क्या आपका अंतिम बिंदु एक सुधार के रूप में जोड़ने या मतलब रखने का सुझाव है क्योंकि आप उपरोक्त विधि को 'गलत' के रूप में देख सकते हैं? अब, मैं आपकी टिप्पणी को पढ़ता हूं जैसे कि मेरा और एलन के बीच जटिलता के स्तर को संबोधित किया गया है?
LngngLīngС

1

हर नए आदेश को रिकॉर्ड करने के लिए मुश्किल है। सबसे पहले आपको ~/.profileया इसके समान जोड़ने की आवश्यकता है :

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

फिर आपको इसमें जोड़ना होगा ~/.bash_logout:

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