ক্যাট কমান্ড এবং প্রতিধ্বনি


14

আমি কোনও ফাইলের বিষয়বস্তু সহ প্রতিধ্বনি থেকে আউটপুট সংযুক্ত করতে চাই। আমি নিম্নলিখিত কমন্ড চেষ্টা করেছি:

echo "abc" | cat 1.txt > 2.txt

তবে 2.txtফাইলটিতে কেবলমাত্র সামগ্রী রয়েছে 1.txt। কেন এটি কাজ করে না?


3
প্রোগ্রামগুলির মধ্যে catকেবল কোনও ফাইলের যুক্তি না থাকলে স্ট্যান্ডার্ড ইনপুট থেকে পড়া।
বর্মার

উত্তর:


23

এটি কাজ করে না কারণ 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

পরিবর্তে.


21

অন্যদের দ্বারা উল্লিখিত হিসাবে, আপনার মূল কমান্ড ব্যর্থ হয়েছে কারণ cat 1.txtএর মানক ইনপুটটিকে উপেক্ষা করে। হয় এটি নির্দেশ করুন যে এটি এর প্রথম যুক্তি ( cat - 1.txt) হওয়া উচিত , বা পুনর্নির্দেশ করতে echo abc এবং cat 1.txt একসাথে ব্লক পুনঃনির্দেশ ব্যবহার করুন । বুদ্ধিমান:

{ echo abc; cat 1.txt; } > 2.txt 

ম্যানুয়াল থেকে প্রাসঙ্গিক অংশ ( man bash):

যৌগিক কমান্ডগুলি
একটি যৌগিক কমান্ড নিম্নলিখিতগুলির মধ্যে একটি। বেশিরভাগ ক্ষেত্রে কমান্ডের বিবরণে একটি তালিকা বাকি কমান্ড থেকে এক বা একাধিক নিউলাইন দ্বারা আলাদা করা যেতে পারে এবং সেমিকোলনের জায়গায় একটি নতুন লাইন অনুসরণ করা যেতে পারে।

(তালিকা)

    তালিকাটি একটি সাব-শেল পরিবেশে কার্যকর করা হয় (নীচে কম্যান্ড এক্সিকিউশন এনভায়রনমেন্ট দেখুন)। পরিবর্তনশীল অ্যাসাইনমেন্ট এবং বিল্টিন কমান্ডগুলি যা শেলের পরিবেশকে প্রভাবিত করে কমান্ডটি সম্পূর্ণ হওয়ার পরে কার্যকর হয় না। রিটার্নের স্থিতি হল তালিকার প্রস্থান স্থিতি।

{তালিকা; }

    তালিকাটি কেবল বর্তমান শেল পরিবেশে কার্যকর করা হয়।  তালিকাটি অবশ্যই একটি নতুন লাইন বা সেমিকোলন দিয়ে শেষ করতে হবে। এটি একটি গ্রুপ কমান্ড হিসাবে পরিচিত । রিটার্ন অবস্থা প্রস্থান অবস্থা তালিকা । লক্ষ্য করুন metacharacters অসদৃশ (এবং ), {এবং }হয় সংরক্ষিত শব্দ এবং ঘটতে হবে যেখানে একটি সংরক্ষিত শব্দ চিনে নিতে দিতে অনুমোদিত হয়। যেহেতু তারা কোনও শব্দের বিরতি সৃষ্টি করে না, তাই তাদের অবশ্যই হোয়াইটস্পেস বা অন্য শেল মেটাচারাক্টারের দ্বারা তালিকা থেকে আলাদা করতে হবে ।

প্রথম বিকল্প (সাবহেল এনভায়রনমেন্ট) এর একগুচ্ছ পার্শ্ব প্রতিক্রিয়া রয়েছে, বেশিরভাগ ক্ষেত্রে যদি তা আপনার দৃশ্যের সাথে সম্পর্কিত নয়; তবে, যদি আপনার প্রয়োজন কমান্ডের আউটপুটকে একগুচ্ছ পুনর্নির্দেশ করা হয়, তবে এখানে বিকল্প # 2 (গ্রুপ কমান্ড) অগ্রাধিকার দেওয়া হয়েছে।


7
( echo "abc"; cat 1.txt ) > 2.txt

আপনি বিড়ালের প্রতিধ্বনি আউটপুটটি পাইপ করেছেন, তবে বিড়ালের ইনপুটটির কোনও ব্যবহার ছিল না এবং এটিকে উপেক্ষা করেছেন। এখন কমান্ডগুলি একের পর এক চলমান, এবং তাদের আউটপুট গোষ্ঠীভুক্ত (প্রথম বন্ধনী) এবং 2.txt এ নির্দেশিত directed


1
এটি কীভাবে কাজ করে এবং কেন ওপি-র আসল প্রচেষ্টা কাজ করে না তা ব্যাখ্যা করে এই উত্তরটি উন্নত করা যেতে পারে ।
বব

ঠিক আছে, চেষ্টা করে দেখুন
জেরার্ড এইচ। পিল

5
এখানে সাবসেলের স্পষ্টরূপে প্রয়োজন নেই, সম্ভবত গ্রুপ কমান্ড ব্যবহার করা ভাল। আরও তথ্যের জন্য আমার উত্তর দেখুন।
নুবার্কে

আহ, তবে আমি কখনই বাশ ব্যবহার করব না।
জেরার্ড এইচ। পিল

1
@ জেরার্ডএইচ.পিল: ড্যানিয়েলের উত্তরগুলি উদ্ধৃত করার সময় bash(1), এটি এমন আচরণের বর্ণনা দেয় যা প্রতিটি পসিক্স-কমপ্লায়েন্ট শেলকে সমর্থন করে।
জি-ম্যান

2

আপনার কমান্ড cat 1.txtআউটপুট দিয়ে কিছু করে না echo "abc"

পরিবর্তে: (echo "abc"; cat 1.txt) > 2.txt উভয় কমান্ডের আউটপুট 2.txt এ লিখবে।


প্রস্তাবিত বিকল্প কীভাবে কাজ করে তা ব্যাখ্যা করে এই উত্তরটি উন্নত করা যেতে পারে।
বব

1

যে কোনও পসিক্স শেলটিতে আপনি কমান্ড প্রতিস্থাপনের জন্য cat fileইনপুট হিসাবে ব্যবহার করতে পারেন echo:

echo $(cat file1.txt) "This Too"

বাশ-এ আপনি প্রক্রিয়া প্রতিস্থাপন ব্যবহার করতে পারেন এবং প্রতিধ্বনি হিসাবে অন্য "ফাইল" হিসাবে ইকো ব্যবহার করতে পারেন cat:

cat file1.txt <(echo This Too)

এবং তারপরে পাইপ করুন বা আউটপুটটি আপনাকে যথাযথ দেখতে দেখতে পুনর্নির্দেশ করুন।

অন্যান্য প্রতিটি উত্তরে যেমন বলা হয়েছে, বিড়াল স্ট্যান্ডিনকে উপেক্ষা করে যদি এটির জন্য কোনও ফাইল পাওয়া যায়। (আমি ড্যানিয়েল এবং এমভিডব্লিউর উত্তরগুলিও তাদের মতো করে +1 করি)


1
এই উত্তরটি কেন ওপি-র আসল প্রয়াসটি কাজ করে না (এবং তার পরিবর্তে এটি কেন প্রয়োজনীয়) তা ব্যাখ্যা করে উন্নত করা যেতে পারে।
বব

1
<(command)নির্মাণ একটি ব্যাশ এক্সটেনশান। এটি পসিক্স নয়, সুতরাং আপনি যে স্ক্রিপ্টগুলির সাথে মৃত্যুদন্ড কার্যকর করার কথা বলে তার উপর নির্ভর করতে পারবেন না /bin/sh
Rhialto মনিকা সমর্থন

0

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

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

2
আপনার ফাংশনটি সঠিকভাবে আচরণ করার জন্য আপনার ব্যবহার করা উচিত "$1"এবং "$2"। এই প্রসঙ্গে, কোঁকড়া ধনুর্বন্ধনী কোনও ভাল করতে পারে না। দেখুন এর ${name}অর্থ এই নয় যে আপনি কী ভাবেন এটি করে…
জি-ম্যান

1
noclobberপরামর্শটি কীভাবে হাতে রয়েছে প্রশ্নের প্রতিক্রিয়াশীল? (আমি এটিও অত্যন্ত দৃcon়ভাবে বিবেচনা করি না যে এটি ভাল পরামর্শ - বিশ্বব্যাপী আচরণ পরিবর্তন করা স্ক্রিপ্টগুলি / পরামর্শ / বিবেচনাগুলি ডিফল্টগুলি বিবেচনা করে তৈরি করা অনুশীলনগুলি ভঙ্গ করে)।
চার্লস ডাফি

0

নিম্নলিখিত কোডটিও কাজ করবে:

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

1
এই ইচ্ছার (1) করা abcনিচ এর 2.txt; প্রশ্ন শীর্ষে এটি চায়। (2)  সংশোধন1.txt ফাইল; এটা অগ্রহণযোগ্য.
জি-ম্যান বলছেন 'পুনরায় ইনস্টল মনিকা'

এটা কোথায় বলে? রিংগার 81 কখনই নির্দিষ্ট করে নি যেখানে 2. টেক্সটে তিনি আব্বাসকে হাজির হতে চেয়েছিলেন। আপনি এমন জিনিস ধরে নিচ্ছেন যা প্রশ্নটি কখনই বলে না।
নাসির রিলে

(1) ঠিক আছে, আপনি # 1 এ একটি বৈধ পয়েন্ট উত্থাপন। প্রশ্ন পাঠে "একটি ফাইলের বিষয়বস্তু" আগে "একো থেকে আউটপুট", উল্লেখ এবং তারপর রাখে যদিও echoআগে catনমুনা কমান্ডে, আমি অনুমান এটা ঠিক, যে স্পষ্টভাবে , বলছেন যে এটা আগে প্রতিধ্বনি থেকে আউটপুট চায় ইনপুট ফাইলের বিষয়বস্তু। দেখে মনে হচ্ছে বেশিরভাগ লোকেরা সেভাবে এটি ব্যাখ্যা করেছিলেন। (2)  1.txtএকটি ইনপুট ফাইল। প্রশ্নটি সংশোধন সম্পর্কে কিছু বলে না 1.txt। ইনপুট ফাইলগুলি সংশোধন করা উচিত নয় এ কথাটি বলাই বাহুল্য।
জি-ম্যান

ইমপুট ফাইলটি পরিবর্তন না করার বিষয়ে আপনার বক্তব্যটি আমি বুঝতে পারি। আমার দ্বিতীয় কোডটি এটি না করে পছন্দসই প্রভাব অর্জন করবে।
নাসির রিলে

1
একটি ফাইল খোলার, এতে সংযোজন করা, এটি বন্ধ করে দেওয়া , আবার খুলতে, আবার সংযোজন করা ... কেন এটি কেবল একবার খোলার পরিবর্তে এবং উভয় ক্রিয়াকলাপের জন্য পুনর্নির্দেশটি স্থানে রাখা উচিত?
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.