बैश: "इतिहास संख्या" बनाम "कमांड संख्या"


11

पीएस 1 चर के माध्यम से अपने शेल प्रॉम्प्ट को कैसे अनुकूलित किया जाए, इसे देखते हुए, मैं उन विशेष वर्णों की तालिकाओं को देख रहा हूं जिनका उपयोग किया जा सकता है। विशेष रूप से:

          \!     the history number of this command
          \#     the command number of this command

"इतिहास संख्या" का उपयोग आमतौर पर अधिक किया जाता है, और मुझे पता है कि !523इतिहास से आदेशों को फिर से कैसे करना है। लेकिन मैं यह पता नहीं लगा सकता कि क्या "कमांड नंबर" में समान कार्यक्षमता है। मैंने \#अपने PS1 चर में डालने की कोशिश की है , और यह एक विशेष सत्र में दर्ज आदेशों की संख्या को आउटपुट करने के लिए लगता है (इसके विपरीत \!, जो लॉगआउट / निकास के बाद बनी रहती है)।

किसी को पता है कि "कमांड नंबर" का उपयोग सुविधाजनक या सार्थक तरीके से कैसे किया जाए?


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

1
दिलचस्प सवाल। यदि आप उस टिप्पणी को उत्तर देते हैं, तो मैं उसे वोट करूंगा।
पीटर कॉर्डेस

जवाबों:


1

बैश का कमांड नंबर केवल प्रदर्शन के लिए है।

सबसे पहले, कुछ पृष्ठभूमि bashref:

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

स्रोत के माध्यम से गोताखोरी, parse.yहम देखते हैं कि '\#'वैश्विक स्थिर चर को हल करता है current_command_number:

case '#':                                                                     
  n = current_command_number;                                                 
  /* If we have already incremented current_command_number (PS4,              
 ${var@P}), compensate */                                                     
  if (orig_string != ps0_prompt && orig_string != ps1_prompt && orig_string != ps2_prompt)
n--;                                                                          
  temp = itos (n);                                                            
  goto add_string;                                                            

जिसमें केवल एक अन्य उपयोग होता है: eval.cइसमें, कमांड चलाने पर वेतन वृद्धि होती है:

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

जो कुछ रखा गया है वह एक संख्या है, वास्तविक कमांड या समतुल्य इतिहास संख्या नहीं है। इसलिए, प्रत्येक कमांड के निष्पादन पर, यह भूल जाता है कि कौन सी कमांड किस कमांड नंबर से जुड़ी है, प्रदर्शन और स्क्रॉल संदर्भ के अलावा किसी अन्य चीज के लिए कमांड संख्या को अनुपयोगी बनाना।


5

जहां तक ​​मैं बता सकता हूं (और यह आपके शोध से प्रमाणित होता है), उस जादुई संख्या को अंतःक्रियात्मक fcया !nशॉर्टकट के माध्यम से संदर्भित करने का कोई तरीका नहीं है । वे निश्चित रूप से इतिहास की सूची में केवल पूर्ण स्थिति को संदर्भित करते हैं, न कि सापेक्ष स्थिति के बाद से यह विशिष्ट शेल शुरू हुआ (जो कि वाह्ट को \#संदर्भित करता है, जैसा कि आपने सही ढंग से बताया है)।

यहाँ इस अच्छे को बनाने के लिए मैंने केवल एक ही रास्ता तय किया है:

export HISTFILESIZE=1001
export HISTSIZE=-1

उस तरफ:

  1. एक नए सत्र का इतिहास शुरू होता है 1000, जिससे यह जानना आसान हो जाता है कि मैं सत्र में कहां हूं
  2. (कुछ असंबंधित) मैं दिए गए सत्र में पुराना इतिहास नहीं खोता (लेकिन फिर भी फ़ाइल को बाढ़ नहीं देता)

मूल रूप से, इसने मेरा संशोधित प्रॉम्प्ट ( PS1="\\!$ "):

499$ 

सेवा:

1000$ 

... जो इसे शुरू में थोड़ा साफ करता है। लेकिन शायद वह जवाब नहीं है जिसकी आपको तलाश थी। :)

(वैसे, मैंने एक समाधान के लिए zsh को भी देखा, और ऐसा लगता है कि यह बस के बराबर नहीं है \#, इसलिए यह बिल्कुल भी मदद नहीं करता है।)

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