यह, कुछ महीने पहले मेरे ब्लॉग में एक पोस्टिंग से , एक विचार से निकला है कि मुझे लगा कि मैं हाल ही में स्मृति में खांसी की सबसे अच्छी हैक में से एक है। मैं इसे यहां पूरा उद्धृत करता हूं:
==================
मैं काफी समय बैश में बिताता हूं। Uninitiated के लिए, bash एक ऐसी प्रणाली है जो आपको अधिकांश unix मशीनों पर मिलेगी और, शुक्र है कि कुछ विंडोज़ और हर मैक बाहर। पहले ब्लश पर, यह कमांड-लाइन इंटरफ़ेस से अधिक नहीं है, और इसलिए अधिकांश उपयोगकर्ताओं के रडार से दूर हैं जो इस तरह की चीजों को एनाक्रोनिज़्म के रूप में देखते हैं जो वे भूल जाते हैं।
मैं लगभग सबकुछ बैश में करता हूं। मैंने एक COMMAND LINE से मेरा EMAD READ किया, यही कारण है कि मैंने चिह्नित ईमेल को एस्कॉव किया। मैं निर्देशिकाओं को नेविगेट करता हूं, फाइलों को संपादित करता हूं, अपने दैनिक स्रोत कोड चेकआउट और डिलीवरी में संलग्न होता हूं, फाइलों की खोज करता हूं, फाइलों के अंदर खोज करता हूं, अपनी मशीन को रिबूट करता हूं, और यहां तक कि कभी-कभी कमांड लाइन से वेब पेज ब्राउज़ करता हूं। बैश मेरे डिजिटल अस्तित्व का दिल और आत्मा है।
मुसीबत यह है कि मैं एक समय में लगभग 6 बैश खिड़कियां खोल देता हूं। आज काम पर, मैं एक वेब सर्वर चला रहा था, मेरे डेटाबेस के साथ एक और फ़िडलिंग, एक तीसरी, चौथी और पांचवीं संपादन अलग-अलग फाइलें, जबकि एक छठा मेरी मशीन के माध्यम से सिस्टम पर हर फ़ाइल के नाम रिकॉर्ड करने की कोशिश कर रहा था। क्यों? क्योंकि इस तरह के एक संग्रह के माध्यम से खोज करने में सक्षम होना आसान है यदि आप जानना चाहते हैं कि फ़ाइल नाम से कोई ऑब्जेक्ट कहां मिलेगा।
जब आप ऐसा करते हैं, तो आप अपने कंट्रोल बार में बहुत सी विंडो के साथ समाप्त होते हैं, जिसका नाम बस "बैश" है। यह ठीक है अगर आपके पास केवल उनमें से एक है, लेकिन इसकी पीड़ा जब आपके पास 6 या अधिक है .... और दो दर्जन अन्य चीजें चल रही हैं। मेरे पास एक कीबोर्ड / माउस पेयर की एक साथ कमांड के तहत तीन मॉनिटर हैं और मुझे अभी भी अधिक की आवश्यकता महसूस होती है। उन खिड़कियों में से प्रत्येक में कई बैश टर्मिनल खुले हैं।
इसलिए मैंने इसे एक साथ जोड़ दिया है। सबसे पहले, इन लाइनों को अपने .bash_profile में रखें:
export PROMPT_COMMAND='export TRIM=`~/bin/trim.pl`'
export PS1="\[\e]0;\$TRIM\a\]\$TRIM> "
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
मैंने इस बारे में दर्जनों पैराग्राफ लिखे और लिखा कि यह सब कैसे काम करता है और वास्तव में यह इस तरह से क्यों सेट किया गया है, लेकिन आप वास्तव में रुचि नहीं रखते हैं। मुझ पर विश्वास करो। ...
उस तीसरी पंक्ति में मैंने "CMD = ; गूंज ..." पुस्तक का एक पूरा अध्याय है । बहुत से लोग (ब्लूहोस्ट, जहां मेरा दूसरा डोमेन होस्ट किया गया है) का उपयोग कर रहे हैं और अभी भी पुराने संस्करणों के बश का उपयोग कर रहे हैं और यह कैसे जाल से निपटता है, इसलिए हम इसके साथ फंस गए हैं। आप CMD को हटा सकते हैं और इसे $ BASH_COMMAND से बदल सकते हैं यदि आप अपने बैश संस्करण पर मौजूद हैं और शोध करने का मन कर रहे हैं।
वैसे भी, पहली स्क्रिप्ट जिसका उपयोग मैं यहां कर रहा हूं। यह एक अच्छा संकेत बनाता है जिसमें आपकी मशीन का नाम और निर्देशिका होती है, जो एक उचित लंबाई तक कटा हुआ होता है:
============trim.pl===========
#!/usr/bin/perl
#It seems that my cygwin box doesn't have HOSTNAME available in the
#environment - at least not to scripts - so I'm getting it elsewhere.
open (IN, "/usr/bin/hostname|");
$hostname = <IN>;
close (IN);
$hostname =~ /^([A-Za-z0-9-]*)/;
$host_short = $1;
$preamble = "..." if (length($ENV{"PWD"})>37);
$ENV{"PWD"} =~ /(.{1,37}$)/;
$path_short = $1;
print "$host_short: $preamble$path_short";
==============================
इस ब्लॉग पोस्ट के शीर्ष पर एक चेतावनी है जिसे अब आपको पढ़ना चाहिए इससे पहले कि आप बेवकूफ सवाल पूछना शुरू कर दें, जैसे "आपने @ENV के माध्यम से HOSTNAME पर्यावरण चर का उपयोग क्यों नहीं किया?" सरल: क्योंकि यह उन सभी प्रणालियों के लिए काम नहीं करता है, जिन पर मैंने कोशिश की थी।
अब वास्तव में शांत बिट के लिए। .Bash_profile जोड़ की रेखा 3 याद रखें?
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
यह पहले से ही कंटेनर में ट्रिम.प्ल स्क्रिप्ट आउटपुट को डंप कर रहा है, जो कमांड प्रॉम्प्ट और विंडो शीर्षक दोनों को प्रिंट कर रहा है, लेकिन इस बार यह कमांड जोड़ रहा है जिसे आपने अभी टाइप किया है! यही कारण है कि आप अपने .bashrc में यह सब नहीं करना चाहते हैं: आप जो भी स्क्रिप्ट चलाते हैं (मेरी मशीन पर, आदमी उनमें से एक है) हर लाइन पर इस चीज को ट्रिगर करेगा। हम यहां जो कर रहे हैं, उससे मनुष्य का उत्पादन गंभीरता से प्रभावित होता है। हम टर्मिनल के साथ बिल्कुल अच्छा नहीं खेल रहे हैं।
आपके द्वारा लिखी गई कमांड को हथियाने के लिए, हम बैश के इतिहास को लेते हैं और इसे थोड़ा ऊपर उठाते हैं:
===========hist.pl============
#!/usr/bin/perl
while (<STDIN>)
{
$line = $_
}
chomp $line;
$line =~ /^.{27}(.*)/;
print $1;
==============================
तो अब, मेरे पास एक बज़िलियन खिड़कियां हैं और वे कहते हैं जैसे कि:
castro: /home/ronb blog
Ron-D630: /C/ronb/rails/depot script/server
Ron-D630: /C/ronb/rails/depot mysql -u ron -p
Ron-D630: /C/ronb/rails/depot find . > /C/ronb/system.map
Ron-D630: /C/ronb/rails/depot vi app/views/cart.html.erb
Ron-D630: /C/perforce/depot/ p4 protect
Ron-D630: /C/perforce/depot/ p4 sync -f
Ron-D630: /C/perforce/depot/
स्क्रीन के निचले भाग में खुश छोटी पट्टी से, अब मैं बता सकता हूं कि कौन सा पल की नज़र में है। और क्योंकि हमने PS1 सेट किया है, जैसे ही एक कमांड निष्पादित होता है, कमांड नाम को केवल ट्रिम.प्लप के आउटपुट से बदल दिया जाता है।
अद्यतन (एक ही दिन): इस सामान (.bash_profile प्रविष्टियों) ने मुझ पर सभी प्रकार के नरक डाल दिए, जब मैंने इसे अपने .bashrc में आज़माया। जब भी आप भाषा के रूप में बैश का आह्वान करते हैं तो आपकी .bashrc को गैर-संवादात्मक स्क्रिप्ट द्वारा निष्पादित किया जाता है। मैंने इसे तब मारा जब मैं आदमी का उपयोग करने की कोशिश कर रहा था। सभी प्रकार के कचरे (मैनबाश का पूरा पाठ, प्लस एस्केप चौरर्स) मैन पेज के शीर्ष पर दिखाई दिए। मैं सुझाव दूंगा कि एक बार आप सभी को एक साथ मिल कर कमांड लाइन पर एक त्वरित 'मैन मैन' इनवोकेशन के साथ इस रत्न का परीक्षण करें।
मुझे लगता है कि यह मेरे लिए कस्टम कचरा मेरे .bashrc से बाहर खींचने का समय है और इसे वह जगह है जहाँ यह है ...
इस प्रक्रिया में एक बिंदु पर, मैंने खुद को 'मैन ट्रैप' टाइप करते हुए पाया।