ব্যাশ ব্যাকটিক্সের সমতুল্য


97

বাশের সাথে কাজ করার সময়, আমি একটি কমান্ডের আউটপুটটিকে অন্য কমান্ডে এভাবে রাখতে পারি:

my_command `echo Test`

হিসাবে একই জিনিস হবে

my_command Test

(স্পষ্টতই, এটি কেবল একটি ব্যবহারিক উদাহরণ নয়))

আমি কেবল ভাবছি আপনি ব্যাচে একই জিনিস করতে পারেন কিনা।


উত্তর:


53

আপনি প্রথমে কোনও ফাইলে আউটপুট পুনর্নির্দেশ করে এটি করতে পারেন। উদাহরণ স্বরূপ:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%

16
অস্থায়ী ফাইল সঞ্চয় করার জন্য আপনার এমন লেখার অ্যাক্সেসের জায়গা খুঁজে পাওয়া দরকার; আপনি নিজের পরে পরিষ্কার করতে হবে; এই খুব উদাহরণ আপনাকে ইনপুট খুব প্রথম লাইন পড়তে সক্ষম করে। সমস্ত ব্যবহারিক উদ্দেশ্যে for /fভেরিয়েন্টটি আরও ভাল একটি।
জোয়

@ গ্রাটিউটি - সহ%random%
বেকার

4
@ জোয়ি এটি প্রতিটি লাইন পড়তে পারে তবে কীভাবে কোনও একক আদেশে একটি কমান্ড লাইন যুক্তি যুক্ত করতে পারে ।
ব্যবহারকারীর 877329

কীভাবে এটি নিউলাইন (গুলি) পরিচালনা করে?
andrewrk

104

আপনি for /fকমান্ডটি দিয়ে cmd.exe স্ক্রিপ্ট ব্যবহার করে অনুরূপ কার্যকারিতা পেতে পারেন :

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

হ্যাঁ, এটি স্পষ্টত অ-সুস্পষ্ট (কমপক্ষে বলতে গেলে), তবে এটি সেখানে।

for /?বিষণ্ণ বিবরণ জন্য দেখুন ।

সিডিনোট: আমি ভেবেছিলাম যে echo" for /f" কমান্ডের " " ব্যাকটিক্সের অভ্যন্তরে " cmd.exe /c echo Test" ব্যবহার করার echoজন্য একটি অভ্যন্তরীণ কমান্ড cmd.exeহওয়ায় " " ব্যবহার করা দরকার , তবে এটি আরও প্রাকৃতিক উপায়ে কাজ করে। উইন্ডোজ ব্যাচের স্ক্রিপ্টগুলি সর্বদা আমাকে কোনও না কোনওভাবে অবাক করে দেয় (তবে সাধারণত ভাল ভাবে হয় না)।


4
আপনাকে সাধারণত বহিরাগত প্রোগ্রামগুলি থেকে শেল-বিল্টিনগুলি সম্পাদন করার সময় এটি করতে হবে যা স্বয়ংক্রিয়ভাবে শেলটি ছড়িয়ে দেয় না। আই সি ভাল system()ছিল, প্রথমত, যেহেতু এটি যে কোনও ক্ষেত্রে শেল শুরু করে কিন্তু নেট নেট Process.Startস্পষ্টভাবে শেলটি শুরু করতে হবে। এরকম কিছু, iirc। যাই হোক না কেন, আমি এটিকে গৃহীত উত্তরগুলির চেয়ে উত্তম উত্তর হিসাবে বিবেচনা করি :-)
জয়ে

4
forক্ষতি না করে বিকল্পটিকে বিভ্রান্ত করার বিকল্পগুলি । এটি সম্পর্কে কী:for /f %%a in ('"echo Test"') do my_command %%a
ইভান হাশ

9
একটি ব্যাচ স্ক্রিপ্টের চেয়ে কমান্ড লাইনে একই সম্পাদন করার সময় %% এর পরিবর্তে একক% ব্যবহার করুন।
jsears

4
পাইপিংয়ের সাথে ভাল কাজ করছে বলে মনে হচ্ছে না, উদাহরণস্বরূপ ">" অপারেটর। তবে অন্যথায় এটি দুর্দান্ত। যদি না এটি ছিল আমার কেবলমাত্র% বনাম %% ইস্যু।
জোনাথন

4
@ ইভান: tokens=*গুরুত্বপূর্ণ। অন্যথায়, যদি কমান্ডের ফলাফলটিতে স্পেস অন্তর্ভুক্ত থাকে তবে কেবল প্রথম শব্দটি আউটপুট। প্রম্পটে এই রান: for /f %a in ('"echo foo bar"') do echo "%a"। এটি মুদ্রণ করবে "foo"
ড্যান ড্যাসক্লেস্কু

29

"ফর" কমান্ডের জন্য ডকুমেন্টেশন পড়ুন: for /?

দুঃখজনকভাবে আমি নিজে এটি যাচাই করার জন্য উইন্ডোজটিতে লগ ইন করি নি, তবে আমি মনে করি এরকম কিছু আপনি কী চান তা আনুমানিক করতে পারে:

for /F %i in ('echo Test') do my_command %i

6
যদি অন্য কেউ এতে হোঁচট খায়, যখন ব্যাচ ফাইল (* .bat) থেকে কমান্ডটি কার্যকর করা হয়, উভয়% i ভেরিয়েবলের দ্বিগুণ শতাংশ চিহ্ন হওয়া দরকার: %% i।
মিগ্রাউইন

3

আপনি উইশ এর ভিতরে সর্বদা বাশ চালাতে পারতেন । আমি এটা দিয়ে সব সময় MSYS (অনেক অধিক কার্যকরী Cygwin )।


দুর্ভাগ্যক্রমে এমএসওয়াইএস এখন সবেমাত্র রক্ষণাবেক্ষণ করা হয়, একটি আপ টু ডেট বাশ পেতে আপনাকে আলাদাভাবে ইনস্টল করতে হবে
এড র্যান্ডাল

4
ব্যাসিবক্স আরও ছোট (~ 432 কেবি)। যদিও পুরো অ্যাশ নয়, কেবল অ্যাশ। এখানে বেসরকারী উইন্ডোজ বন্দরটি পান: frippery.org/busybox
মার্টিন

3

হতে পারে আমি স্ট্যান্ডার্ড for /fপদ্ধতির বাক্য গঠন বদ্ধ করছি , তবে যখন আমি && এবং | এর সাথে জড়িত একটি খুব জটিল কমান্ড রাখি এর সীমাতে ব্যাকটিক্সের মধ্যে for /fএটি সমস্যা সৃষ্টি করে। সাধারণ থেকে সামান্য পরিবর্তন একটি স্বেচ্ছাসেবী জটিলতার আদেশটি পরিচালনা করা সম্ভব:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

আপনার পূর্ণ এবং জটিল কমান্ডটি প্রথমে একটি ভেরিয়েবলের মধ্যে রেখে, তারপরে জটিল কমান্ডটিকে সরাসরি লুপের সীমাতে না রেখে বরং সীমাতে পরিবর্তনকের একটি রেফারেন্স রেখে সিনট্যাক্স ব্যাখ্যা সংক্রান্ত সমস্যাগুলি এড়াতে পারবেন। বর্তমানে যদি আমি VVউপরের উদাহরণে ভেরিয়েবলটিতে যে সঠিক কমান্ডটি সেট করেছি সেখানে এটি ব্যবহার করা হয় %VV%, তবে এটি সিনট্যাক্স ত্রুটির সৃষ্টি করে।


4
এটি আমার পক্ষে কাজ করে নি, তবে আমি দেখতে পেয়েছি আপনি ক্যারেটের (^) দিয়ে পালিয়ে গেলে আপনি সরাসরি কমান্ডের মধ্যে পাইপিং করতে পারেন: / f "usebackq টোকেনস = *" %% এ ইন (`কমান্ড ^ | কমান্ড`)%% কমান্ড করুন
হেপাটাইতে

@ হেপাটাইট কার্ড পলায়ন আমার পক্ষে কাজ করে না, তবে ডাবল কোট সহ আশেপাশের কমান্ড লাইন কাজ করে।
আলেকজান্ডার জারুবকিন

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