bash-এ প্রয়োজনীয় কমান্ড চেক করার সময় এবং ইন্টারফেসের গল্প

9 min

language: ja bn en es hi pt ru zh-cn zh-tw

নমস্কার, আমি অযোগ্য।
কর্মক্ষেত্রে আমার শেষ দিন শেষ করার পর, আমি একই কর্মক্ষেত্রের একটি মেয়ের কাছ থেকে চকোলেট পেয়েছি, অবসরের ঠিক আগে আমাকে ইয়াকিনিকু খেতে নিয়ে যাওয়া হয়েছিল, এবং ২৫ বছর ধরে নেটওয়ার্ক ইঞ্জিনিয়ার হিসেবে কাজ করা একজন ব্যক্তির সাথে তার অতীত এবং বর্তমান হোম নেটওয়ার্ক পরিবেশ নিয়ে কথা বলে এবং আমি আমার হোম সার্ভার সেটআপ নিয়ে কথা বলে একটি আনন্দময় সময় কাটিয়েছি।
আমি মনে করি যে একজন অপরিণত ব্যক্তি হিসাবে আমি যা করতে পেরেছি তা আমি যতটা সম্ভব করেছি, তবে আমি প্রায়শই ত্রুটিপূর্ণ, তাই আমি দুঃখিত বোধ করছি।


আমি প্রতিদিন অনুভব করি যে শেল স্ক্রিপ্টগুলি খুব শক্তিশালী।
অবশ্যই, তাদের কম পোর্টেবিলিটির অর্থ হল যে ফাংশনাল বর্ণনা, যেমন csh-এ যা বর্তমানে FreeBSD-এর ডিফল্ট শেল, তা করা যায় না এবং এই সমস্যাটি অস্বীকার করা যায় না।
তবে, আমি বিশ্বাস করি যে শেল স্ক্রিপ্টগুলির ব্যবহারিক শক্তি ইন্টারফেসগুলি পরিচালনা করার সহজতার মধ্যে নিহিত।

C এবং শেল স্ক্রিপ্ট ইন্টারফেস

উদাহরণস্বরূপ, ধরা যাক আপনি একটি শেল স্ক্রিপ্টে নিম্নলিখিতভাবে echo ব্যবহার করেন।

echo "test"

এটি C ভাষার স্ট্যান্ডার্ড আউটপুটের সাথে মিলে যায়।

#include <stdio.h>

int main() {
    const char *message = "test";

    // স্ট্যান্ডার্ড আউটপুটে বার্তা প্রিন্ট করুন
    fprintf(stdout, "%s\n", message);

    return 0;
}

যদি আপনি স্ট্যান্ডার্ড এরর আউটপুটে আউটপুট করতে চান, তাহলে আপনি নিম্নলিখিতভাবে রিডাইরেক্ট করবেন।

echo "testerr" 1>&2

এবং C ভাষার ক্ষেত্রে, এটি নিম্নলিখিত হবে।

#include <stdio.h>

int main() {
    const char *message = "testerr";

    // স্ট্যান্ডার্ড এরর আউটপুটে বার্তা প্রিন্ট করুন
    fprintf(stderr, "%s\n", message);

    return 0;
}

এছাড়াও, বেশিরভাগ GNU/Linux কমান্ড এক্সিকিউশনের ব্যর্থতার জন্য রিটার্ন ভ্যালুগুলি অতীতের অগ্রগামীদের ধন্যবাদে সূক্ষ্মভাবে ডিজাইন করা হয়েছে, যা বিচার শর্তগুলি পরীক্ষা করা সহজ করে তোলে এবং স্ক্রিপ্টিং ভাষার মতো ব্যবহার করা হলে এটি বেশ কার্যকর।
তবে সমস্যা হল, এই সুবিধাটি কেবল সেই পরিবেশগুলিতে উপভোগ করা যেতে পারে যেখানে শেল স্ক্রিপ্ট ব্যবহার করা যায়।
অন্যান্য ভাষায় অনুরূপ কোড লেখা হলেও এর বহুমুখিতা প্রযোজ্য, তবে কমান্ডগুলি এমন একটি প্রক্রিয়ায় কাজ করে যা প্রোগ্রামিং ভাষার লাইব্রেরির সাথে মিলে যায়, এবং আমি মনে করি এই কারণেই তাদের বহুমুখিতা কম বলা হয়।
তবে, আমি ফাইল ডিস্ক্রিপ্টরগুলি এত সহজে ম্যানিপুলেট করতে পারাটা অত্যন্ত শক্তিশালী বলে মনে করি।

else-এর জন্যও, আপনাকে কেবল দুটি পাইপ সংযুক্ত করতে হবে।
※লেখার পরে আমার মনে হয়েছিল, তবে কঠোরভাবে বলতে গেলে, এটি else নয় ^^;
এটি কেবল একটি else-এর মতো কাজ করে যখন রিটার্ন ভ্যালু 0 না হয়।

$ curl aa || echo "wtf"
curl: (6) Could not resolve host: aa
wtf

যদি আমি জুনিয়র হাই স্কুলে এমন একটি সুবিধাজনক জিনিস সম্পর্কে জানতাম তবে তা কতই না চমৎকার হত।
আমি চাই যে যেকোনো ওয়েবসাইট শেল স্ক্রিপ্টিং শেখার আরও সুযোগ দিত।

অথবা বরং, এখন আমার মনে পড়ছে, তখনকার GNU/Linux-এর জাপানিজ পরিবেশ বেশ কঠিন ছিল, এবং আমার মনে আছে যে জাপানিজ ইনপুটের জন্য ভবিষ্যদ্বাণীমূলক টেক্সট ইনপুট ব্যবহারিক স্তরে ছিল না। তাই, সম্ভবত বর্তমান সহজতা Chrome OS-এর প্রসারের কারণে, যা OSS জাপানিজ ইনপুটের উন্নতি ঘটিয়েছে।
আমার জুনিয়র হাই স্কুলের সময় আমার একজন অদ্ভুত বন্ধু Ubuntu ইনস্টল করা একটি ThinkPad চেয়েছিল এবং আমি সেটি সেটআপ করে দিয়েছিলাম এমন স্মৃতিও আমার আছে...

তাহলে, কমান্ড চেক কিভাবে করবেন?

Bash শেল স্ক্রিপ্টে কমান্ড চেক লেখার সময়, আমি ভাবছিলাম যে একটি স্মার্ট এবং সহজে পঠনযোগ্য উপায় আছে কিনা।

তা সত্ত্বেও, একটি অ্যারে থেকে একটি লুপে for ব্যবহার করে পাস করা অবশ্যই সুবিধাজনক, যা মূলত স্মার্ট, তবে অ্যারে সংরক্ষণের সময় বর্ণনাটি দেখলে...

#!/bin/bash
cmds=(aa bb cc)
for i in ${cmds[@]}; do
  command -v $i 1> /dev/null || echo "Please install $i"
done

এটি () ব্যবহার করে একটি অ্যারে হিসাবে cmds-এ সংরক্ষণ করা হয় এবং ${cmds[@]} ব্যবহার করে অ্যারেটি প্রসারিত করা হয়।
তবে, যদি কমান্ডের সংখ্যা বাড়ে এবং আপনি সেগুলিকে cmds=()-এ যোগ করতে থাকেন, তাহলে আপনার মনে হতে পারে যে এখানে সেগুলি লেখার আদৌ প্রয়োজন আছে কিনা।
অন্যান্য ভাষায়, নির্ভরতার তথ্য Cargo.toml, deno.json, go.mod, Gemfile, বা প্রায়শই অপছন্দ করা requirements.txt-এর মতো ফাইলগুলিতে থাকে।
এইভাবে একত্রিত একটি ফাইল থাকলে তা সুবিধাজনক হবে।

তাই, আমি এরকম কিছু চেষ্টা করেছি।

#!/bin/bash
cat ./cmd | xargs which 1> /dev/null || echo "Please install cmd"

এবং cmd ফাইলটি কেমন দেখতে হবে?

$ cat cmd
ls
pwd
cargo

আসলে, আমি command কমান্ড দিয়ে চেক করতে চেয়েছিলাম, কিন্তু command একটি অভ্যন্তরীণ শেল কমান্ড হিসাবে চলে এবং xargs-এ পাস করা যায়নি।

$ which command
which: no command in (/home/haturatu/.rbenv/bin:/home/haturatu/.rbenv/shims:/home/haturatu/.deno/bin:/home/haturatu/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/opt/android-sdk/platform-tools:/var/lib/flatpak/exports/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/usr/lib/plan9/bin:/home/haturatu/.local/bin:/home/haturatu/.local/bin:/home/haturatu/Android/Sdk/cmdline-tools/tools/bin:/home/haturatu/Android/Sdk/platform-tools:/home/haturatu/Android/Sdk/emulator:/home/haturatu/Android/Sdk/tools:/home/haturatu/Android/Sdk/tools/bin:/home/haturatu/Android/Sdk/cmdline-tools/tools/bin:/home/haturatu/Android/Sdk/platform-tools:/home/haturatu/Android/Sdk/emulator:/home/haturatu/Android/Sdk/tools:/home/haturatu/Android/Sdk/tools/bin:/home/haturatu/.npm-global/bin:/home/haturatu/go/bin)

আমি ভুল করলে ক্ষমা চাইছি, তবে xargs দিয়ে পাস করা হলে, এটি এক্সিকিউটিং bash প্রক্রিয়া থেকে একটি পৃথক xargs প্রক্রিয়া হিসাবে চলে বলে মনে হয়, এবং তাই এটি অচেনা হয়ে যায়।
সুতরাং, আমি which দিয়ে ব্যর্থ হওয়া কমান্ডটি Please install cmd-এ পাস করতে পারি না, তবে তার আগে which-এর এরর আউটপুট আসে, তাই আমি ভেবেছিলাম এটি অপ্রয়োজনীয় হতে পারে।
※লেখার পরে আমার মনে হয়েছিল, তবে xargs /bin/bash command -v কাজ করতে পারে...

এই কমান্ড গ্রুপটিকে একটি আলাদা ফাইলে রাখার আরও একটি সুবিধা আছে।
আপনি এই ফাইল থেকে সেগুলিকে একসাথে ইনস্টল করতে পারেন।

cat cmd | xargs -I {} sudo pacman -S --noconfirm {}

apt-এর ক্ষেত্রে, -y অপশন দিয়ে একইভাবে সম্ভব।


সুতরাং, আমি এটি আসলে ব্যবহার করি কিনা তা একপাশে রেখে, আমি এটিকে একটি ধারণা হিসাবে রেখে দিচ্ছি।
আবার দেখা হবে। শুভকামনা। (বছরের শেষ নিবন্ধ থেকে আমি কয়েকটি নিবন্ধ লিখেছি তা সম্ভবত আমার কল্পনা)।

Related Posts