আমি শেলকে দেওয়া প্রতিটি কমান্ড কীভাবে পাইপ করব?


14

আমি আমার .bashrc সম্পাদনা করতে চাই যাতে শেলের উপর চালিত প্রতিটি কমান্ড কোনও কিছুতে পাইপ হয়, উদাহরণস্বরূপ:

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

আমি বরং অনুরূপ কিছু পরিচালনা করেছি, তবে পুরোপুরি নয়:

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

এটি পছন্দসই ফলাফল নয়, কারণ এটি কেবলমাত্র বর্তমান শেলটি থেকে বেরিয়ে আসার পরে ঘটে।

এটি মূলত মজা / শেখার উদ্দেশ্যে।


-nপতাকা ব্যবহার cowsayকরা দরকারী; এটি এটিকে সাদা স্থান রক্ষা করে।
wjandrea

উত্তর:


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 চরিত্রটি ব্যবহার করছি। আপনি অন্য কিছু ব্যবহার করতে পারেন যা কমান্ড আউটপুটে প্রদর্শিত হবে না unlikely

এটি প্রম্পটের পরে মুদ্রণ করা হবে, সুতরাং আউটপুট কুৎসিত হবে:

$ 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= আইএফএসকে খালি স্ট্রিংয়ে সেট করে যা ক্ষেত্র বিভাজনকে অক্ষম করে
    • -rইনপুটটিতে বিশেষত readচিকিত্সা করা থেকে বাধা দেয় \(সুতরাং \nউদাহরণস্বরূপ, পড়ুন \nএবং নতুন লাইনের চরিত্রটিতে রূপান্তরিত হয়নি)।
    • -d ''readNUL চরিত্র না হওয়া পর্যন্ত পড়তে বলার উপায়

    সম্ভব হিসাবে যতটা সম্ভব ইনপুট সামগ্রী সংরক্ষণ করার সময় পুরো জিনিসটি NUL- সীমাবদ্ধ বিভাগগুলিতে ইনপুট থেকে যায়।

  • if [[ -n $line ]]; then ... fi; done - কেবলমাত্র তখনই কাজ করুন যদি এখনও পর্যন্ত পড়া ইনপুটটি খালি না থাকে।
  • echo; printf "%s\n" "$line" | cowsay;- একটি নেতৃস্থানীয় খালি লাইন মুদ্রণ করুন, যাতে প্রসম্পটের সাথে গরুয়ের আউটপুট সংঘাত না ঘটে এবং তারপরে এতক্ষণে ইনপুট পাঠান গরুতে send 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!

তবে এটি পরে কমান্ডটি কার্যকর করবে। ইলক্কাচুকে ধন্যবাদ আমি এর আশেপাশে একটি উপায় খুঁজে পেয়েছি:

$ shopt -s extdebug
$ trap 'bash -c "$BASH_COMMAND" | cowsay; false' DEBUG
$ echo "AU is awesome!"
 __________________
< AU is awesome! >
 ------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.