প্যাসিটার বা পাইপ থেকে ইনপুট গ্রহণ করে এমন বাশ ফাংশন


10

আমি নিম্নলিখিত বাশ ফাংশনটি এমনভাবে লিখতে চাই যাতে এটি কোনও যুক্তি বা পাইপ থেকে এর ইনপুট গ্রহণ করতে পারে:

b64decode() {
    echo "$1" | base64 --decode; echo
}

পছন্দসই ব্যবহার:

$ b64decode "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ b64decode < file.txt
$ b64decode <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ="
$ echo "QWxhZGRpbjpvcGVuIHNlc2FtZQ=" | b64decode

2
একটি অর্থহীন ফাংশনের মতো মনে হয় যখন base64এবং bashযাইহোক সমস্ত কিছু করতে পারে। কেন কেবলমাত্র বিকল্প -dবা --decodeবিকল্পটি এড়াতে কোনও ফাংশন লিখবেন ? আপনার যদি সত্যিই b64decodeতখন কিছু বলা থাকে alias b64decode='base64 --decode'b64dআরও সংক্ষিপ্ত হবে, এমনকি আরও টাইপিং সংরক্ষণ করুন।
কাস

3
আপনি ঠিক বলেছেন, যদিও এটি কেবল উদাহরণ হিসাবে ব্যবহৃত হয়েছিল।
tyrondis

উত্তর:


16

আপনি /dev/stdinস্ট্যান্ডার্ড ইনপুট থেকে পড়তে ব্যবহার করতে পারেন

b64decode()
{
    if (( $# == 0 )) ; then
        base64 --decode < /dev/stdin
        echo
    else
        base64 --decode <<< "$1"
        echo
    fi
}
  • $# == 0 কমান্ড লাইন আর্গুমেন্টের সংখ্যা শূন্য কিনা তা পরীক্ষা করে
  • base64 --decode <<< "$1"একটিকে herestringব্যবহার echoএবং পাইপিংয়ের পরিবর্তে ব্যবহার করতে পারেনbase64

1
কেবল একটি পরিষ্কার সিনট্যাক্স ইমো, echo and pipeদ্রুত হতে পারে .. দেখুন ইউনিক্স.স্ট্যাকেক্সেঞ্জার.কম / সেকশনস /59007/ … এবং এটি হ'ল herestring, আমি একটি ভুল করেছি
সুদীপ

2
tr -d "\n"লাইন ব্রেকগুলি সরাতে আপনি ইনপুটটি পাইপ করতে পারেন।
জুলি পেলেটিয়ার

3
বেস 64 একাধিক ইনপুট লাইন সমর্থন করে? অবশ্যই এটি করে, এটি না হলে এটি বেশ অকেজো হবে। নিজের জন্য দেখুন:ls -l /usr/bin/ | base64 | base64 -d
কাস

1
বিটিডব্লিউ, +১ আপনার এমন একটি প্রশ্নের উত্তরের উত্তর যা কেবলমাত্র আরও বেশি জটিল কাজ করার জন্য যদি স্ট্যান্ডিন থাকে তবে তা কোনও অর্থবোধ করে।
কাস

4
আপনার আসলে দরকার নেই < /dev/stdin; একটি ফাইল ছাড়া, base64কেবল মান ইনপুট এটা তার পিতা বা মাতা, যা থেকে ইনহেরিট থেকে পড়তে হবে /dev/stdin
চিপনার

2

সন্দীপের উত্তরটি কাজ করে base64কারণ সেই ইউটিলিটি একাধিক লাইন সমর্থন করে না। আরও সাধারণ ক্ষেত্রে আরও সাধারণ সমাধান fix

এরকম কিছু

my_function() {
    if (( ${#} == 0 )) ; then
        while read -r line ; do
            target_utility "${line}"
        done
    else
        target_utility "${@}"
    fi
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.