উত্তর:
এটি কাজ করে না কারণ catআপনার পাইপ অনুক্রমের echoপ্রোগ্রামটিকে স্ট্যান্ডার্ড ইনপুট থেকে প্রোগ্রামটির আউটপুট পড়ার নির্দেশ দেওয়া হয়নি ।
আপনি -স্টুডো ফাইলের নাম হিসাবে স্ট্যান্ডার্ড ইনপুট নির্দেশ করতে ব্যবহার করতে পারেন cat। থেকে man catএকটি msys2 ইনস্টলেশনের উপর:
EXAMPLES
cat f - g
Output f's contents, then standard input, then g's contents.
সুতরাং চেষ্টা কর
echo "abc" | cat - 1.txt > 2.txt
পরিবর্তে.
অন্যদের দ্বারা উল্লিখিত হিসাবে, আপনার মূল কমান্ড ব্যর্থ হয়েছে কারণ cat 1.txtএর মানক ইনপুটটিকে উপেক্ষা করে। হয় এটি নির্দেশ করুন যে এটি এর প্রথম যুক্তি ( cat - 1.txt) হওয়া উচিত , বা পুনর্নির্দেশ করতে echo abc এবং cat 1.txt একসাথে ব্লক পুনঃনির্দেশ ব্যবহার করুন । বুদ্ধিমান:
{ echo abc; cat 1.txt; } > 2.txt
ম্যানুয়াল থেকে প্রাসঙ্গিক অংশ ( man bash):
যৌগিক কমান্ডগুলি
একটি যৌগিক কমান্ড নিম্নলিখিতগুলির মধ্যে একটি। বেশিরভাগ ক্ষেত্রে কমান্ডের বিবরণে একটি তালিকা বাকি কমান্ড থেকে এক বা একাধিক নিউলাইন দ্বারা আলাদা করা যেতে পারে এবং সেমিকোলনের জায়গায় একটি নতুন লাইন অনুসরণ করা যেতে পারে।
(তালিকা)তালিকাটি একটি সাব-শেল পরিবেশে কার্যকর করা হয় (নীচে কম্যান্ড এক্সিকিউশন এনভায়রনমেন্ট দেখুন)। পরিবর্তনশীল অ্যাসাইনমেন্ট এবং বিল্টিন কমান্ডগুলি যা শেলের পরিবেশকে প্রভাবিত করে কমান্ডটি সম্পূর্ণ হওয়ার পরে কার্যকর হয় না। রিটার্নের স্থিতি হল তালিকার প্রস্থান স্থিতি।
{তালিকা;}তালিকাটি কেবল বর্তমান শেল পরিবেশে কার্যকর করা হয়। তালিকাটি অবশ্যই একটি নতুন লাইন বা সেমিকোলন দিয়ে শেষ করতে হবে। এটি একটি গ্রুপ কমান্ড হিসাবে পরিচিত । রিটার্ন অবস্থা প্রস্থান অবস্থা তালিকা । লক্ষ্য করুন metacharacters অসদৃশ
(এবং),{এবং}হয় সংরক্ষিত শব্দ এবং ঘটতে হবে যেখানে একটি সংরক্ষিত শব্দ চিনে নিতে দিতে অনুমোদিত হয়। যেহেতু তারা কোনও শব্দের বিরতি সৃষ্টি করে না, তাই তাদের অবশ্যই হোয়াইটস্পেস বা অন্য শেল মেটাচারাক্টারের দ্বারা তালিকা থেকে আলাদা করতে হবে ।
প্রথম বিকল্প (সাবহেল এনভায়রনমেন্ট) এর একগুচ্ছ পার্শ্ব প্রতিক্রিয়া রয়েছে, বেশিরভাগ ক্ষেত্রে যদি তা আপনার দৃশ্যের সাথে সম্পর্কিত নয়; তবে, যদি আপনার প্রয়োজন কমান্ডের আউটপুটকে একগুচ্ছ পুনর্নির্দেশ করা হয়, তবে এখানে বিকল্প # 2 (গ্রুপ কমান্ড) অগ্রাধিকার দেওয়া হয়েছে।
( echo "abc"; cat 1.txt ) > 2.txt
আপনি বিড়ালের প্রতিধ্বনি আউটপুটটি পাইপ করেছেন, তবে বিড়ালের ইনপুটটির কোনও ব্যবহার ছিল না এবং এটিকে উপেক্ষা করেছেন। এখন কমান্ডগুলি একের পর এক চলমান, এবং তাদের আউটপুট গোষ্ঠীভুক্ত (প্রথম বন্ধনী) এবং 2.txt এ নির্দেশিত directed
bash(1), এটি এমন আচরণের বর্ণনা দেয় যা প্রতিটি পসিক্স-কমপ্লায়েন্ট শেলকে সমর্থন করে।
যে কোনও পসিক্স শেলটিতে আপনি কমান্ড প্রতিস্থাপনের জন্য cat fileইনপুট হিসাবে ব্যবহার করতে পারেন echo:
echo $(cat file1.txt) "This Too"
বাশ-এ আপনি প্রক্রিয়া প্রতিস্থাপন ব্যবহার করতে পারেন এবং প্রতিধ্বনি হিসাবে অন্য "ফাইল" হিসাবে ইকো ব্যবহার করতে পারেন cat:
cat file1.txt <(echo This Too)
এবং তারপরে পাইপ করুন বা আউটপুটটি আপনাকে যথাযথ দেখতে দেখতে পুনর্নির্দেশ করুন।
অন্যান্য প্রতিটি উত্তরে যেমন বলা হয়েছে, বিড়াল স্ট্যান্ডিনকে উপেক্ষা করে যদি এটির জন্য কোনও ফাইল পাওয়া যায়। (আমি ড্যানিয়েল এবং এমভিডব্লিউর উত্তরগুলিও তাদের মতো করে +1 করি)
<(command)নির্মাণ একটি ব্যাশ এক্সটেনশান। এটি পসিক্স নয়, সুতরাং আপনি যে স্ক্রিপ্টগুলির সাথে মৃত্যুদন্ড কার্যকর করার কথা বলে তার উপর নির্ভর করতে পারবেন না /bin/sh।
কেবল অনুমান, তবে দেখে মনে হচ্ছে আপনার পুনরাবৃত্তিযোগ্য প্রক্রিয়া রয়েছে, যা কোনও উপাধি বা কোনও ফাংশনের জন্য ভাল প্রার্থী। উপকরণগুলি সাধারণত ব্যাশ কমান্ডগুলির অনুরোধের জন্য সংক্ষিপ্তসার হিসাবে সংক্ষিপ্তসার হয় যার যুক্তি / গুলি হিসাবে একটি একক ইনপুট প্রবাহে।
alias hg="history | grep"
তবে, এক্ষেত্রে কোনও ফাংশন বেশি পঠনযোগ্য হবে, যেহেতু আপনি একাধিক, বিচ্ছিন্ন (2) ইনপুট স্ট্রিম পাশাপাশি একাধিক ব্যাশ কমান্ডের সংমিশ্রণ করছেন। আপনার দুটি যুক্তি রয়েছে, প্রথমটি স্ট্রিং এবং অন্যটি ফাইলপথ। শেষ পর্যন্ত, আপনি চান ফলাফলটি স্টাডআউট আউটপুট স্ট্রিমে লেখা হোক।
সিএলআই প্রম্পট থেকে এটি টাইপ করুন:
# ecat()
{
echo ${1}
cat ${2}
}
আপনার ফাংশনটির নামকরণ করা হয়েছে একাট, যা স্মরণীয়।
এখন আপনি হিসাবে প্রার্থনা করতে পারেন
ecat "abc" 1.txt
সংযোজন করার জন্য, স্টডআউটকে কেবল আলাদা আউটপুট গন্তব্য সরবরাহ করুন:
ecat "abc" 1.txt >> 2.txt
অ্যাপেন্ড পুনঃনির্দেশ অপারেটর '>>' নির্দিষ্ট ফাইলের শেষে আউটপুট যুক্ত করবে।
যদি আপনি এটি পছন্দ করেন তবে পুনরায় ব্যবহারের জন্য আপনার ~ / .bashrc ফাইলটিতে যুক্ত করুন।
declare -f ecat >> ~/.bashrc
এর অর্থ হ'ল আপনি আপনার ফাংশন সংজ্ঞা অনুসারে সাজাইয়া ইত্যাদি পারেন।
আপনার ~ / .bashrc এ যুক্ত করে ফাইলগুলি ওভাররাইট হওয়া থেকে রক্ষা করার জন্য একটি ভাল ধারণা
set noclobber
"$1"এবং "$2"। এই প্রসঙ্গে, কোঁকড়া ধনুর্বন্ধনী কোনও ভাল করতে পারে না। দেখুন এর ${name}অর্থ এই নয় যে আপনি কী ভাবেন এটি করে… ।
noclobberপরামর্শটি কীভাবে হাতে রয়েছে প্রশ্নের প্রতিক্রিয়াশীল? (আমি এটিও অত্যন্ত দৃcon়ভাবে বিবেচনা করি না যে এটি ভাল পরামর্শ - বিশ্বব্যাপী আচরণ পরিবর্তন করা স্ক্রিপ্টগুলি / পরামর্শ / বিবেচনাগুলি ডিফল্টগুলি বিবেচনা করে তৈরি করা অনুশীলনগুলি ভঙ্গ করে)।
নিম্নলিখিত কোডটিও কাজ করবে:
echo abc >> 1.txt && cat 1.txt > 2.txt
আউটপুট প্রতিধ্বনি এবিসি সঙ্গে 1.txt করতে যোগ করা হবে >> এরপর && কমান্ড যা হবে পরবর্তী সেট চালানোর জন্য এটা বলতে হবে বিড়াল 1.txt এটি আউটপুট এবং তারপর 2.txt । মূলত, এটি প্রথম কমান্ডের আউটপুট 1.txt এ সংযোজন করে এবং তারপরে 1.txt এর আউটপুট 2.txt এ প্রেরণ করে।
আপনি যদি প্রথমে অ্যাবিকে উপস্থিত হতে চান তবে নীচের কোডটি ব্যবহার করতে পারেন:
echo abc >> 2.txt && cat 1.txt >> 2.txt
abcএ নিচ এর 2.txt; প্রশ্ন শীর্ষে এটি চায়। (2) সংশোধন1.txt ফাইল; এটা অগ্রহণযোগ্য.
echoআগে catনমুনা কমান্ডে, আমি অনুমান এটা ঠিক, যে স্পষ্টভাবে , বলছেন যে এটা আগে প্রতিধ্বনি থেকে আউটপুট চায় ইনপুট ফাইলের বিষয়বস্তু। দেখে মনে হচ্ছে বেশিরভাগ লোকেরা সেভাবে এটি ব্যাখ্যা করেছিলেন। (2) 1.txtএকটি ইনপুট ফাইল। প্রশ্নটি সংশোধন সম্পর্কে কিছু বলে না 1.txt। ইনপুট ফাইলগুলি সংশোধন করা উচিত নয় এ কথাটি বলাই বাহুল্য।
catকেবল কোনও ফাইলের যুক্তি না থাকলে স্ট্যান্ডার্ড ইনপুট থেকে পড়া।