2011-08-03 12 views
7

bash पर दिए गए प्रत्येक आदेश को रोकने का कोई तरीका है? मैं किसी विशेष कमांड को रोक सकता हूं, उदाहरण के लिए, cd फ़ंक्शन cd() परिभाषित करके और मैं इसे अन्य कमांड के लिए एक-कमांड-ए-ए-टाइम के लिए भी कर सकता हूं। लेकिन क्या मैं एक फंक्शन लिख सकता हूं जिसे हर कमांड को निष्पादित करने से पहले बुलाया जाता है? मैं आदेशों की कुछ बहीखाता करना चाहता हूं, और फिर आदेश को निष्पादित किया।बैश: प्रत्येक आदेश को कैसे रोकें

मीकल Šrajer के विचार PS4='$(echo $(date) $(history 1) >> /tmp/trace.txt) TRACE: ' बहुत आशाजनक दिखता है, लेकिन यहां उत्पादन मैं मिलता है:

$ ping www.google.com 
TRACE: ping www.google.com 
PING www.l.google.com (74.125.224.52) 56(84) bytes of data. 
64 bytes from 74.125.224.52: icmp_seq=1 ttl=56 time=3.77 ms 
64 bytes from 74.125.224.52: icmp_seq=2 ttl=56 time=2.33 ms 
^C 
--- www.l.google.com ping statistics --- 
2 packets transmitted, 2 received, 0% packet loss, time 1001ms 
rtt min/avg/max/mdev = 2.334/3.054/3.774/0.720 ms 
    TRACE: echo -ne '\033]0;myhost.com /home/yogeshwer/github/myproject\007' 
    TRACE: grep -e '\* ' 
    TRACE: git branch 
    TRACE: sed 's/^..\(.*\)/ {\1}/' 

और Wed Aug 3 12:47:27 PDT 2011 6672 ping www.google.com /tmp/trace.txt कि 5 बार में लिखा मिलता है। चार अन्य लोग PS1 की मेरी परिभाषा से आते हैं जहां मैं निम्न आदेश चलाता हूं: $(git branch 2> /dev/null | grep -e "\* " | sed "s/^..\(.*\)/ {\1}/")। दो प्रश्न:

  • क्या यह आदेश /tmp/trace.txt पर लिखना संभव है?
  • और सबसे महत्वपूर्ण बात यह है कि कमांड के आउटपुट को अव्यवस्थित करना संभव नहीं है, लेकिन केवल /tmp/trace.txt पर कमांड लिखना संभव है?

मैं अपने सभी बैश सत्रों से एक ही स्थान पर आदेश रिकॉर्ड करने में सक्षम होने की संभावना के बारे में बहुत उत्साहित हूं!

+0

'.bash_history' आपकी आवश्यकताओं के लिए पर्याप्त नहीं है, मैं इसे लेता हूं? – Andrew

+0

ध्यान दें कि '.bash_history' केवल तभी अपडेट किया जाता है जब खोल निकलता है। –

+0

PROMPT_COMMAND के बारे में क्या? –

उत्तर

1

प्रत्येक आदेश को अवरुद्ध करने के बारे में निश्चित नहीं है लेकिन लिनक्स के कुछ संस्करणों में प्रत्येक आदेश ~/.bash_history पर लॉग हो जाता है। आप या तो यह पता लगा सकते हैं कि यह कैसे काम करता है या अंतिम आदेश देखने के लिए उस फ़ाइल को पार्स करता है।

4

$PROMPT_COMMAND, यदि सेट है, तो प्रॉम्प्ट प्रिंट करने से पहले निष्पादित करने के लिए एक आदेश होता है ($PS1)। इसे किसी फ़ंक्शन के नाम पर सेट करें जो history 1 के आउटपुट को कैप्चर करता है। तब

PS4='$(echo $(date) $(history 1) >> /tmp/trace.txt) TRACE: ' 

का पता लगाने, सक्षम:

set -x 

अनुरेखण को रोकने के लिए

8

आप PS4 चर, जो हर आदेश सिर्फ क्रियान्वयन से पहले निष्पादित किया जा रहा है, तो ट्रेस पर है के लिए मूल्यांकन किया जाता है सेट कर सकते हैं , बस:

set +x 
+0

में निष्पादित करता है यह _very_ वादा करता है। मैंने सवाल संपादित किया है (क्योंकि मुझे टिप्पणी में कोड के टुकड़े लिखना मुश्किल लगता है)। मैं काफी करीब हूं, लेकिन आखिरी कदम नहीं समझ सकता। –

1

आपतरह यह करने के लिए, डीबग साथ जाल का उपयोग कर सकते 0।

2

यदि किसी को भी Google के माध्यम से यह प्रश्न मिलता है, तो मैंने इसे ~/.bashrc पर निम्नलिखित जोड़कर हल किया।

PROMPT_COMMAND='echo "$(date +"%Y/%m/%d (%H:%M)") $(history 1 |cut -c 7-)" >> /tmp/trace' 
export PROMPT_COMMAND 

इस तरह के

2015/01/21 (14:34) pwd 
2015/01/21 (14:36) less /tmp/trace 
2015/01/21 (14:36) cd Documents 
2015/01/21 (14:36) cd .. 
2015/01/21 (14:36) ls -la 
2015/01/21 (14:36) pwd 
2015/01/21 (14:36) echo "helloWorld" 
  • PROMPT_COMMAND हर आदेश है कि पार्टी के माध्यम से चलाया जाता है के बाद मार डाला जाता है
  • $(date +"%Y/%m/%d (%H:%M)") प्रिंट दिनांक और समय
  • के रूप में/tmp/ट्रेस होने सामग्री में जो परिणाम $(history 1 |cut -c 7-)
      कमांड प्रिंट करता है
    • cut -c 7- संख्या कि history अन्यथा शामिल होंगे
  • >> /tmp/trace फ़ाइल आपके द्वारा निर्दिष्ट करने के लिए पूरी स्ट्रिंग संलग्न कर देता है निकालता है। (जब तक आप कंप्यूटर को पुनरारंभ नहीं करते हैं, तब तक मैं /tmp/ में कुछ भी इसके खिलाफ सलाह देना चाहूंगा।)
संबंधित मुद्दे