"প্রতিধ্বনি" কমান্ডে কোনও ফাইলের সামগ্রী পুনর্নির্দেশ করা হচ্ছে


41

আমার একটি ফাইল রয়েছে যার my_file.txtনামকরণটি কেবল স্ট্রিং Hello। আমি কীভাবে এর বিষয়বস্তু কমান্ডে পুনর্নির্দেশ করতে পারি echo?

আমি জানি আমি কমান্ড আছে less, cat, more... কিন্তু আমি সঙ্গে এটি করতে প্রয়োজন echo

আমি এটি চেষ্টা করেছি:

$ cat my_file.txt | echo

এবং এটিও:

$ echo < my_file.txt

তবে উভয় ক্ষেত্রে এটি স্টাডআউটে কেবল ফাঁকা প্রদর্শিত হবে, আমার_ফিল.টিএসটিএসটির সামগ্রী নয়।

আমি এটা কিভাবে করতে পারি?


7
আপনি কেন জেদ করেন echo?
কেভিন

7
কেভিন, সম্ভবত অবশেষে তিনি ফাইলটিতে এএনএসআই সি পালানোর ক্রমগুলি ( \n, b...) প্রসারিত করতে চান , যা echo(কমপক্ষে একটি মান echo) এর বৈধ ব্যবহার হবে of অথবা সম্ভবত তিনি বুঝতে চান যে এটি কেন সেভাবে কাজ করে না। যাই হোক না কেন, আইএমওকে হ্রাস করার কোনও কারণ নেই।
স্টাফেন চেজেলাস

3
আমি এখানে এসেছি কারণ আমি যখন << file.txt প্রতিধ্বনি করি তখন কেন এটি কাজ করে না তা সম্পর্কে আগ্রহী ছিলাম। SE তে যুক্তিযুক্ত প্রশ্ন মনে হচ্ছে, উত্তরটি খুব সহায়ক ছিল। আমার কাছ থেকে +1
নিউরনেট

উত্তর:


53

আপনি যা চান তা পুনর্নির্দেশ করতে পারেন echoতবে এটি এটি দিয়ে কিছুই করবে না। echoএটির স্ট্যান্ডার্ড ইনপুটটি পড়ে না। এটি কেবল স্ট্যান্ডার্ড আউটপুটে লেখার জন্য তার আর্গুমেন্টগুলিকে একটি স্পেস অক্ষর দ্বারা পৃথক করে এবং একটি নিউলাইন চরিত্র দ্বারা সমাপ্ত করা হয় (এবং কিছু echoপ্রয়োগের সাথে কিছু এ্যাসিক সিকোয়েন্সগুলি প্রসারিত এবং / অথবা যুক্তিগুলি -সম্ভবত বিকল্প হিসাবে বিবেচিত হয়)।

আপনি যদি echoকোনও ফাইলের বিষয়বস্তু প্রদর্শন করতে চান তবে আপনাকে সেই বিষয়বস্তুটির পক্ষে যুক্তি হিসাবে পাস করতে হবে echo। কিছুটা এইরকম:

echo "$(cat my_file.txt)"

লক্ষ্য করুন $(...)চিহ্ন newline অক্ষর রেখাচিত্রমালা গুলি যে আউটপুট থেকে catকমান্ড, এবং echoযোগ করে এক ফিরে।

আরও মনে রাখবেন যে বাদ দিয়ে zshআপনি কোনও কমান্ডের আর্গুমেন্টগুলিতে NUL অক্ষরগুলি পাস করতে পারবেন না, যাতে উপরেরগুলি সাধারণত বাইনারি ফাইলগুলির সাথে কাজ করে না। yashবৈধ অক্ষরের অংশ নয় এমন বাইটগুলিও সরিয়ে ফেলবে।

তাহলে যে কাজ করতে অনুপস্থিত জন্য কারণ কারণ আপনি চান echoপ্রসারিত করতে \n, \b, \0351... ফাইলে পালাবার ক্রম (Unix conformant যেমন echoবাস্তবায়নের না, কিন্তু সব ), তারপর আপনি বরং ব্যবহার করতে চাই printfপরিবর্তে :

printf '%b\n' "$(cat my_file.txt)"

বিপরীতে echo, এটি পোর্টেবল এবং ফাইলের সামগ্রীটি শুরু হলে সমস্যা হবে না -


বিকল্প হিসেবে $(cat file), সঙ্গে ksh, zshএবং bash, এক এছাড়াও করতে পারেন: $(<file)। এটি একটি বিশেষ অপারেটর যার মাধ্যমে শেল বিপরীতে catফাইলের সামগ্রীটি পড়ার বিপরীতে । এটি এখনও পিছনে থাকা নতুন লাইনের রেখাচিত্রগুলি বাদ দেয় এবং এ ছাড়া এন ইউ এল বাইটগুলিকে চোক করে zsh। ইন bash, এটি এখনও একটি অতিরিক্ত প্রক্রিয়া কাঁটাচামচ করে। এছাড়াও মনে রাখবেন যে একটি পার্থক্য হ'ল সেই ধরণের ডিরেক্টরি টাইপের ডিরেক্টরি পড়ার চেষ্টা করলে আপনি কোনও ত্রুটি পাবেন না। এছাড়াও, $(< file)বিশেষ হওয়ার সময় , $(< file; other command)এটি ( অন্তর্নিহিত কমান্ডটি (সাধারণত পেজার)) চালিয়ে zshঅন্য শেলটি অনুকরণ না করার সময় এটির বিষয়বস্তু প্রসারিত করতে পারে ।file $READNULLCMD


3
উভয় ব্যাশ ও zsh আপনি এড়িয়ে যেতে পারেন catএবং মাত্র শেল সরাসরি এটা পড়তে আছে: echo "$(<my_file.txt)"
কেভিন

1
হ্যাঁ, আপনি ksh , zsh এবং বাশ দিয়ে ব্যবহার করতে পারেন $(<filename)
দিমিত্রে রাদৌলভ

আপনাকে অনেক ধন্যবাদ, এটাই আমার প্রয়োজন ছিল এবং এটি কাজ করেছিল! :-)
danielmbcn

@ কেভিন, দিমিত্রে এখন যোগ করেছেন।
স্টাফেন চেজেলাস

4

অন্যান্য উত্তরে যুক্ত করা, আপনি পরিবর্তে ইনপুট পুনর্নির্দেশের চেষ্টা করতে পারেন cat

echo $(<my_file.txt)

অথবা

echo `<my_file.txt`

$()এবং thing the একই জিনিস সম্পাদন করে, তারা তাদের সুযোগের ভিতরে কমান্ডগুলি চালায় এবং শেলটিকে আউটপুট দেয় যেন এটি কোনও ব্যবহারকারী কোনও ইনপুট হিসাবে দেয়। এই দুটিয়ের মধ্যে একমাত্র পার্থক্য হ'ল rec () পুনরাবৃত্ত হতে পারে এবং `rec পুনরাবৃত্তি হতে পারে না।


2

সহজ উত্তর: আপনি পারবেন না। echo(এটি শেল্ট অন্তর্নির্মিত বা নিয়মিত বাইনারি হোক) এর স্ট্যান্ডার্ড ইনপুটটি প্রক্রিয়াজাত করে না - এটি কেবল একমাত্র উপায়।


প্রশ্নটি হল, আপনি আসলে এটি করতে চান কেন?
পিটার্ফ

2

যেমন বলা হয়েছিল,

আপনি যদি echoকোনও ফাইলের বিষয়বস্তু প্রদর্শন করতে চান তবে আপনাকে সেই বিষয়বস্তুটির পক্ষে যুক্তি হিসাবে পাস করতে হবেecho

উদাহরণস্বরূপ, আপনি এটির সাহায্যে এটি করতে পারেন xargs(আপনার ব্যাকস্ল্যাশ পলায়নের ব্যাখ্যা সক্ষম করার প্রয়োজন বিবেচনা করে ):

$ cat my_file.txt | xargs echo -e

অথবা কেবল আপনি যা চেয়েছিলেন (পলায়নক্রমের ক্রমগুলির ব্যাখ্যা ছাড়া ):

$ cat my_file.txt | xargs echo

তবে নোট করুন যে ডিফল্ট কমান্ড xargs echoহিসাবে xargsবিটিডব্লিউ হিসাবে ব্যবহার করার সময় echo, এটি echoফাইল সিস্টেমের কমান্ড যা চালানো হবে, শেলের বিল্টিন echoকমান্ড নয়। এছাড়াও নোট করুন যে xargsএটির ইনপুটটি খুব নির্দিষ্ট বিন্যাসে প্রত্যাশা করে (যেখানে ফাঁকা, নিউলাইনগুলি, উদ্ধৃতিগুলি, ব্যাকস্ল্যাশগুলির বিশেষ অর্থ রয়েছে)। catঅনেক ইন্দ্রিয় এখানে দেখা যায় না সেখানে শুধুমাত্র একটি CONCATENATE ফাইল (যেমন একই হিসাবে < file.txt xargs echoনোট করুন যে ইউনিক্স অনুবর্তী। echoডিফল্ট এবং আউটপুট দ্বারা ব্যাকস্ল্যাশ পালাবার সম্প্রসারণ না -eউপরে echo -e
Stéphane Chazelas

0

ব্যাশে, নিম্নলিখিতগুলিরও কাজ করা উচিত:

echo `cat my_file.txt`

ব্যাকটিকের অংশটি সেই আদেশের আউটপুট দ্বারা প্রতিস্থাপিত হয়, অর্থাত্ এই ক্ষেত্রে ফাইলের সামগ্রী দ্বারা প্রতিস্থাপন করা হয়।


সত্য, ব্যাকটিকস এর মতো কাজ করে $( . . . )। যে লোকেরা ব্যবহার করে তারা $()সাধারণত তাদের পছন্দ করে কারণ আপনি বাসা বাঁধতে পারেন। এই প্রশ্নটি পুরানো, যদিও ইতিমধ্যে উত্তর না দেওয়া প্রশ্নের উত্তর দেওয়া অনেক বেশি সন্তোষজনক!
Law29

বেশ না। একটি সূক্ষ্ম পার্থক্য আছে। যখন ব্যাক-টিক ফর্মটি ব্যবহৃত হয়, তখন ব্যাকস্ল্যাশ তার আক্ষরিক অর্থ ধরে রাখে except, `, বা followed অনুসরণ না করে \ ব্যাকস্ল্যাশ এর আগে না হওয়া প্রথম ব্যাক টিকটি কমান্ডটি সমাপ্ত করে। $ (,,,) ফর্মটি ব্যবহার করার সময়, প্রথম বন্ধনীগুলির মধ্যে সমস্ত অক্ষর কমান্ডটি তৈরি করে।
এফএমপুরফি

যেহেতু কমান্ড প্রতিস্থাপনের উদ্ধৃতি দেওয়া হয়নি, স্প্লিট + গ্লোব অপারেটর এটি প্রয়োগ করা হবে। উদাহরণস্বরূপ যদি my_file.txtথাকে তবে *তা বর্তমান ডিরেক্টরিতে ফাইলের নামের তালিকা মুদ্রণ করবে।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.