इसे कमांड किए बिना हिस्ट्री कमांड को कमांड लाइन पर रखें


57

मैं उपयोग करता हूं! N (जहां) इतिहास फ़ाइल में एक पंक्ति निष्पादित करने के लिए लाइन नंबर है जो मैं कमांड प्रॉम्प्ट पर निष्पादित करना चाहता हूं जो मुझे इतिहास के माध्यम से मिलता है।

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

श्रेष्ठ,

जवाबों:


71

यह अनुरोध करने के लिए कि इतिहास प्रतिस्थापन के बाद निष्पादित होने के बजाय कमांड को प्रिंट किया जाए, :p संशोधक जोड़ें , जैसे !42:p। परिणामी आदेश भी इतिहास में दर्ज किया जाएगा, इसलिए आप Upइसे संपादित करने के लिए दबा सकते हैं ।

यदि आपके पास histverify विकल्प सेट ( shopt -s histverify) है, तो आपके पास हमेशा इतिहास प्रतिस्थापन के परिणाम को संपादित करने का अवसर होगा।

fcBuiltin इतिहास विस्तार (कोई शब्द designators) तक सीमित पहुंच देता है, और आप एक बाहरी संपादक में पिछले एक आदेश संपादित करने देता है।

आप उपयोग कर सकते हैं !prefixपिछले आदेश के साथ शुरुआत का उल्लेख करने के prefixसाथ, !?substringके साथ शुरुआत पिछले आदेश का उल्लेख करने के substring। जब आप जानते हैं कि आप क्या देख रहे हैं, तो यह बहुत समय बचा सकता है history | less

पिछले इतिहास के माध्यम से खोज करने का दूसरा तरीका वृद्धिशील खोज है: Ctrl+ दबाएं Rऔर जो आप ढूंढ रहे हैं उसका एक विकल्प दर्ज करना शुरू करें। प्रेस Ctrl+ Rअब तक खोज स्ट्रिंग के पिछले घटना में जाना है और करने के लिए Ctrl+ Sयदि आप बहुत दूर चले गए हैं। Ctrl+ R, Ctrl+ S, Backspaceऔर साधारण वर्णों के अलावा अधिकांश कुंजियाँ वृद्धिशील खोज को समाप्त करती हैं और उनका सामान्य प्रभाव होता है (उदाहरण के लिए, आप जिस लाइन पर पहुंच गए हैं, Enterकमांड को चलाने के लिए तीर कुंजियों को स्थानांतरित करने के लिए )।


आपके पहले उदाहरण में एक टाइपो है ...
pbm

9
stty -ixonCtrl-s काम करने से पहले आपको करना होगा।
डेनिस विलियमसन 23

@ डेनिस: वाह, आधुनिक टर्मिनल एमुलेटर डिफ़ॉल्ट रूप से ऐसा नहीं करते हैं? <परीक्षण> आप सही हैं, यहां तक ​​कि उबंटू में सूक्ति-टर्मिनल का प्रवाह नियंत्रण है!
गिलेस एसओ- बुराई को रोकना '

मुझे नहीं पता कि वे अभी भी क्यों करते हैं। स्क्रॉल करते समय कुछ पकड़ना असंभव है। जब तक आप Ctrl-s दबाते हैं, तब तक आपको फिर से एक संकेत मिल जाता है। और धीमी धारावाहिक कनेक्शन ज्यादातर अतीत की बात है।
डेनिस विलियमसन

@ डेनिस के बारे Ctrl-sमें बात महत्वपूर्ण है, अन्यथा जैसा मैं करता था वैसे ही अटक जाता है ।
इम्ज़ - इवान ज़खरीशेव

15

एक और छोटा एक: Alt+#

वर्तमान लाइन से टिप्पणी करता है और इसे इतिहास बफ़र में ले जाता है।

इसलिए जब आप एक कमांड लाइन को असेम्बल कर रहे हों और आपको एक फाइल खोजने के लिए एक अंतरिम कमांड जारी करने की आवश्यकता हो, तो आप बस हिट Alt+ करें #, दूसरी कमांड जारी करें, इतिहास में ऊपर जाएं और आगे बढ़ें।


2
इसके अलावा Esc, #काम करता है
स्टीवन पेनी

और आप वास्तव में इसे मैक पर रख सकते हैं (होल्ड शिफ्ट, प्रेस ESC और # एक साथ), अन्य ket कॉम्बो (fn + alt + shift + #) के विपरीत; ;-)
0xF2

7

दर्ज करने से पहले इतिहास का विस्तार करने के लिए आप जादू की जगह का उपयोग कर सकते हैं। अपने .inputrc में, मैजिक स्पेस के लिए स्पेस मैप करें:

$if Bash
     Space: magic-space
$endif

अब, जब भी आप एक इतिहास विनिर्देशन के बाद एक स्थान टाइप करते हैं, तो इसे तुरंत विस्तारित किया जाएगा - यदि आप इसे संपादित करना चाहते हैं, तो यह बहुत आसान है!


7

डिफ़ॉल्ट रूप history-expand-lineसे बाध्य, कमांड पर एक नज़र डालें Alt+^। यह लाइन को उस जगह पर विस्तारित करेगा जिसे आप तब संपादित कर सकते हैं।


4

Ctrl+rआप इतिहास का उपयोग कर सकते हैं:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

कोई भी आदेश जो आपको मिल सकता है संपादित किया जा सकता है ...


मुझे लगता है कि मुझे वही मिला जिसकी आपको आवश्यकता है: रन shopt -s histverifyऔर अगली बार जब आप !nकमांड का उपयोग करना चाहते हैं, तो निष्पादित नहीं किया जाएगा, लेकिन केवल कमांड कमांड में डाल दिया जाएगा ...


आपको Ctrl + r के साथ खोजे जाने से पहले एक कमांड निष्पादित करना होगा, न कि वैस जो पूछ रहा है।
फुन्नेहे

1
मुझे समझ नहीं आता कि यह वह कैसे नहीं करता है जो वह पूछता है। मुझे लगता है कि यदि आप इसे चलाने से पहले कमांड को संपादित करना चाहते हैं, तो आप सही कमांड मिलने के बाद बस TAB को हिट कर सकते हैं।
स्टीवन डी

2
तो यह प्रक्रिया होगी, (1) Ctrl + r, (2) टाइप करें जब तक आपको कमांड नहीं मिलती है, (3) TAB, (4) एडिट कमांड, (5) ENTER।
स्टीवन डी

1
@phuenhehe: "लेकिन एक कमांड लाइन इतिहास की घटना है जिसे मैं मैन्युअल रूप से संशोधित करना चाहता हूं"
pbm

1
!n:pकाम नहीं करेगा ?
एलेक्स

1

मुझे अक्सर यही चाहिए होता है। जब मैंने csh (और tcsh) का उपयोग किया, तो मेरे पास एक मुहावरा था:
!:88*:p

यह मुहावरा पिछले आदेश के "शब्द 88 के माध्यम से" पिछले कमांड के उस बिंदु पर सम्मिलित करता है जहां आप वर्तमान कमांड लाइन पर टाइप कर रहे हैं, जो आमतौर पर अंत है। Csh में, इस तरह की अभिव्यक्ति के लिए कोई शब्द उत्पन्न करना कोई त्रुटि नहीं है। यही है, वहाँ एक शब्द 88 की जरूरत नहीं है, और न ही कोई है कि यह पालन करें। यदि कोई शब्द 88 नहीं है, तो यह टाइप किए जा रहे कमांड के अंत में कोई शब्द नहीं जोड़ता है, और फिर परिणामी कमांड लाइन को बिना निष्पादन के इतिहास में धकेल देता है।

जैसा कि आप शायद जानते हैं,
*! (जैसे !! और -1) पिछली कमांड है;
*: 88 शब्द 88 है (पहला शब्द - आमतौर पर कमांड - शून्य है) और csh को ऐसे शब्द की आवश्यकता होगी, लेकिन ...
*: 88 * सभी शब्द 88 शब्द से शुरू होते हैं, और फिर csh करता है। अस्तित्व के लिए शब्द की आवश्यकता नहीं है;
*: p का अर्थ है प्रिंट, लेकिन कमांड लाइन को निष्पादित नहीं करते हैं।
साथ या बिना: p, कमांड लाइन को कमांड हिस्ट्री में जोड़ा जाता है।

"88 क्यों?" आपको आश्चर्य होगा? क्योंकि यह वही कुंजी है जो * मुझे चाहिए होगी। यदि आपके पास लंबे समय तक आज्ञा है, तो शायद !: 888 *: p वह है जो आपको चाहिए। क्षमा करें, यह bash AFAIK के साथ काम नहीं करता है। बैश तो कहेंगे ही bash: :88*: bad word specifier

मजेदार तथ्य: आपके आदेश को आमतौर पर पहले होने की आवश्यकता नहीं है।
> /tmp/foo echo My command is word 3
बैश और csh में मान्य है।


चूँकि प्रश्न को बैश के लिए टैग किया गया है, इसलिए यह कहना अच्छा होगा कि आपका समाधान केवल (t) csh में काम करता है।
ज़गरिस्मान

0

मैं आम तौर पर खोज करने के लिए Ctrl+ rका उपयोग करता हूं और फिर Ctrl+ eनिष्पादन के बिना लाइन के अंत तक जाने के लिए।



@JeffSchaller मैं इसे नहीं देख रहा हूं। मैं CTRL + R संदर्भ देखता हूं। नहीं, जहां मैं CTRL + E देखता हूं जो उपरोक्त पोस्टों में पहेली का लापता टुकड़ा है।
nikc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.