मैं शेल को दिए गए प्रत्येक कमांड को कैसे पाइप कर सकता हूं?


14

मैं अपने .bashrc को संपादित करना चाहूंगा ताकि शेल पर निष्पादित प्रत्येक कमांड किसी चीज़ के लिए पाइप हो, उदाहरण के लिए:

 $ sudo apt update
  _________________
< sudo apt update >
 -----------------
    \   ^__^
     \  (oo)\_______
        (__)\       )\/\
            ||----w |
            ||     ||

मैंने कुछ इसी तरह प्रबंधित किया है, लेकिन पूरी तरह से नहीं:

$ bash
$ exec > >(cowsay)
$ echo "Hello AU!"
$ exit
 _______
< Hello AU! >
 -------
    \   ^__^
     \  (oo)\_______
        (__)\       )\/\
            ||----w |
            ||     ||

यह वांछित परिणाम नहीं है, क्योंकि यह केवल वर्तमान शेल से बाहर निकलने के बाद होता है।

यह मुख्य रूप से मनोरंजन / सीखने के उद्देश्यों के लिए है।


के लिए -nध्वज का उपयोग करना cowsayउपयोगी है; यह इसे व्हाट्सएप का संरक्षण करता है।
वंजेंड्रिया

जवाबों:


12

आप अपने तरीके को थोड़ा अनुकूलित कर सकते हैं। cowsayसीधे पाइपिंग के बजाय , एक परिसीमन वर्ण तक आउटपुट पढ़ें, उस आउटपुट को भेजें cowsay, फिर हर कमांड के बाद उस वर्ण को प्रिंट करें:

exec > >(while IFS= read -d '' -r line; do if [[ -n $line ]]; then echo; printf "%s\n" "$line" | cowsay; fi; done)
PROMPT_COMMAND='printf "\0"'

यहाँ, मैं ASCII NUL चरित्र का उपयोग कर रहा हूँ। आप कुछ और उपयोग कर सकते हैं जो कमांड आउटपुट में दिखाई देने की संभावना नहीं है।

यह प्रॉम्प्ट के बाद प्रिंट करेगा, इसलिए आउटपुट बदसूरत होगा:

$ export LC_ALL=C
$ exec > >(while IFS= read -d '' -r line; do if [[ -n $line ]]; then echo; printf "%s\n" "$line" | cowsay; fi; done)
$ PROMPT_COMMAND='printf "\0"'
$ ls
$
 ______________________________________
/ Desktop Documents Downloads Music    \
| Pictures Public Templates Videos
\ examples.desktop                     /
 --------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

$ echo foo
$
 ______
< foo  >
 ------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

ध्यान दें कि यह किसी भी कमांड को तोड़ देगा जो जटिल आउटपुट की कोशिश करता है या इसमें एक टेक्स्ट यूजर इंटरफेस है (थिंक कमांड लाइन एडिटर, पेजर आदि)।

आप पहले से ही जानते हैं कि क्या exec > >(...)करता है, प्रक्रिया प्रतिस्थापन में हिस्सा है:

  • while IFS= read -d '' -r line; do ... done: यह ASCII NUL चरित्र द्वारा सीमांकित डेटा पढ़ने के लिए एक बहुत ही सामान्य मुहावरा है:

    • IFS= IFS को रिक्त स्ट्रिंग में सेट करता है, जो क्षेत्र विभाजन को निष्क्रिय करता है
    • -rविशेष रूप से इनपुट में readउपचार से रोकता है \(इसलिए, \nउदाहरण के लिए, के रूप में पढ़ा जाता है \nऔर न्यूलाइन वर्ण में परिवर्तित नहीं होता है)।
    • -d ''readNUL वर्ण तक पढ़ने का तरीका बताने का तरीका है

    तो पूरी बात एनयूएल-सीमांकित वर्गों में इनपुट पर लूप करती है, जितना संभव हो उतना इनपुट की सामग्री को संरक्षित करते हुए।

  • if [[ -n $line ]]; then ... fi; done - यदि अभी तक पढ़ा गया इनपुट खाली नहीं है तो ही कार्य करें।
  • echo; printf "%s\n" "$line" | cowsay;- एक प्रमुख खाली लाइन को प्रिंट करें, ताकि गाय का उत्पादन शीघ्रता से न टकराए, और फिर गाय को अब तक पढ़े गए इनपुट को भेजें। printfसे अधिक विश्वसनीय और सुरक्षित है echo

1
मेरी शीघ्र उस में एक LINEBREAK cowsay उत्पादन गया है है यह के दूसरे भाग के साथ संघर्ष - शायद यह भी कुछ गैर ध्यान भंग करने के लिए संकेत सेट?
डेसर्ट

16

आप trapबैश के DEBUGसंकेत का दुरुपयोग और दुरुपयोग कर सकते हैं :

trap 'bash -c "$BASH_COMMAND" | cowsay' DEBUG

उदाहरण चलाते हैं

$ trap 'bash -c "$BASH_COMMAND" | cowsay' DEBUG
$ echo "AU is awesome!"
 __________________
< AU is awesome! >
 ------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
AU is awesome!

हालाँकि, यह अभी भी बाद में कमांड निष्पादित करेगा। Ilkachachu के लिए धन्यवाद मुझे एक रास्ता मिल गया:

$ shopt -s extdebug
$ trap 'bash -c "$BASH_COMMAND" | cowsay; false' DEBUG
$ echo "AU is awesome!"
 __________________
< AU is awesome! >
 ------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.