উইন্ডোজ ব্যাচ এবং লিনাক্স ব্যাশ উভয় ক্ষেত্রেই কি একক স্ক্রিপ্ট চলবে?


97

উইন্ডোজ (.bat হিসাবে বিবেচিত) এবং লিনাক্স (বাশের মাধ্যমে) উভয়তেই কার্যকর হয় এমন একক স্ক্রিপ্ট ফাইল লেখা সম্ভব?

আমি উভয়ের বুনিয়াদি বাক্য গঠন জানি, কিন্তু খুঁজে পাইনি। এটি সম্ভবত কিছু বাশের অস্পষ্ট সিনট্যাক্স বা কিছু উইন্ডোজ ব্যাচের প্রসেসরের গণ্ডিকে কাজে লাগাতে পারে।

এক্সিকিউট করার কমান্ডটি অন্য স্ক্রিপ্টটি চালানোর জন্য কেবল একটি লাইন হতে পারে।

অনুপ্রেরণা হল উইন্ডোজ এবং লিনাক্স উভয়ের জন্য কেবল একটি একক অ্যাপ্লিকেশন বুট কমান্ড থাকা।

আপডেট: সিস্টেমের "নেটিভ" শেল স্ক্রিপ্টের প্রয়োজনটি হ'ল এটির জন্য সঠিক দোভাষীর সংস্করণ বেছে নেওয়া দরকার, কিছু নির্দিষ্ট পরিবেশের ভেরিয়েবলের সাথে সামঞ্জস্য করা ইত্যাদি Cy ডাউনলোড করুন এবং চালান "।

উইন্ডোজের জন্য বিবেচনার জন্য কেবলমাত্র অন্যান্য ভাষা হ'ল উইন্ডোজ স্ক্রিপ্টিং হোস্ট - ডাব্লুএসএইচ, যা 98 সাল থেকে পূর্বনির্ধারিত is


9
পার্ল বা পাইথনটি দেখুন। এগুলি উভয় প্ল্যাটফর্মে উপলব্ধ স্ক্রিপ্টিং ভাষা।
a_horse_with_no_name

গ্রোভি, অজগর, রুবি কেউ? stackoverflow.com/questions/257730/...
Kalpesh সোনি

গ্রোভি ডিফল্টরূপে সমস্ত সিস্টেমে থাকতে দুর্দান্ত লাগত, আমি এটিকে শেল স্ক্রিপ্টিং ল্যাং হিসাবে নেব। হয়ত কোনও দিন :)
ওন্দ্র Žižka


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

উত্তর:


92

আমি যা করেছি তা হল সিএমডি এর লেবেল সিনট্যাক্সটি মন্তব্য মার্কার হিসাবে ব্যবহার করুন । লেবেল অক্ষর, একটি কোলন ( :), trueবেশিরভাগ পসিক্সিশ শেলের সমতুল্য । যদি আপনি তাত্ক্ষণিকভাবে অন্য কোনও চরিত্র দ্বারা লেবেল অক্ষর অনুসরণ করেন যা একটিতে ব্যবহার করা যায় না GOTO, তবে আপনার cmdস্ক্রিপ্টটি মন্তব্য করা আপনার কোডকে প্রভাবিত করবে না cmd

হ্যাকটি চরিত্রের ক্রম " :;" এর পরে কোডের লাইন স্থাপন করা হয় । আপনি যদি বেশিরভাগ ওয়ান-লাইন স্ক্রিপ্টগুলি লিখছেন বা যেমনটি হতে পারে তবে shঅনেকগুলি লাইনের জন্য একটি লাইন লিখতে পারেন cmd, নিম্নলিখিতটি ঠিক আছে might ভুলে যাবেন না যে কোনও ব্যবহার $?অবশ্যই আপনার পরবর্তী কোলনের আগে হওয়া উচিত :কারণ 0 এ :পুনরায় সেট $?করা।

:; echo "Hi, I’m ${SHELL}."; exit $?
@ECHO OFF
ECHO I'm %COMSPEC%

রক্ষার একটি খুব স্বীকৃত উদাহরণ $?:

:; false; ret=$?
:; [ ${ret} = 0 ] || { echo "Program failed with code ${ret}." >&2; exit 1; }
:; exit
ECHO CMD code.

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

:; echo "I am ${SHELL}"
:<<"::CMDLITERAL"
ECHO I am %COMSPEC%
::CMDLITERAL
:; echo "And ${SHELL} is back!"
:; exit
ECHO And back to %COMSPEC%

আপনার প্রয়োজন বা কোডিং শৈলীর উপর নির্ভর করে, ইন্টারলেসিং cmdএবং shকোডটি বোধগম্য হতে পারে বা নাও পারে। হেরডোকস ব্যবহার করা এই জাতীয় ইন্টারলেসিংয়ের একটি পদ্ধতি। এটি অবশ্য GOTOপ্রযুক্তির সাহায্যে বাড়ানো যেতে পারে :

:<<"::CMDLITERAL"
@ECHO OFF
GOTO :CMDSCRIPT
::CMDLITERAL

echo "I can write free-form ${SHELL} now!"
if :; then
  echo "This makes conditional constructs so much easier because"
  echo "they can now span multiple lines."
fi
exit $?

:CMDSCRIPT
ECHO Welcome to %COMSPEC%

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

: # This is a special script which intermixes both sh
: # and cmd code. It is written this way because it is
: # used in system() shell-outs directly in otherwise
: # portable code. See /programming/17510688
: # for details.
:; echo "This is ${SHELL}"; exit
@ECHO OFF
ECHO This is %COMSPEC%

সুতরাং, আমি জানি যতদূর সম্ভব (এবং আউটপুট ছাড়াই ) গুরুতর পার্শ্ব প্রতিক্রিয়া ছাড়াই shএবং cmdসামঞ্জস্যপূর্ণ স্ক্রিপ্টগুলি অর্জনের কিছু ধারণা এবং উপায় ।cmd'#' is not recognized as an internal or external command, operable program or batch file.


5
লক্ষ্য করুন এর জন্য স্ক্রিপ্টটি .cmdএক্সটেনশান হওয়া দরকার, অন্যথায় এটি উইন্ডোতে চলবে না। কোন workaround আছে?
jviotti

4
আপনি যদি ব্যাচের ফাইলগুলি লিখছেন তবে আমি কেবল তাদের নামকরণ .cmdএবং তাদের সম্পাদনযোগ্য হিসাবে চিহ্নিত করার পরামর্শ দেব । এইভাবে, উইন্ডোজ বা ইউনিক্সের ডিফল্ট শেল থেকে স্ক্রিপ্টটি কার্যকর করা কার্যকর হবে (কেবল বাশ দিয়ে পরীক্ষা করা হবে)। যেহেতু আমি জোরে জোরে সিএমডি অভিযোগ না করে কোনও শেবাং অন্তর্ভুক্ত করার কোনও উপায় ভাবতে পারি না, আপনাকে অবশ্যই সর্বদা শেলের মাধ্যমে স্ক্রিপ্টটি আহ্বান করতে হবে। উদাহরণস্বরূপ, অবশ্যই নিশ্চিত হন execlp()বা execvp()(আমি মনে করি system()এটি আপনার পক্ষে "সঠিক" উপায়টি করে ) বরং ( execl()বা execv()এইগুলি পরবর্তী ফাংশনগুলি কেবল শেবাংগুলির সাথে স্ক্রিপ্টগুলিতে কাজ করবে কারণ তারা আরও সরাসরি ওএসে যায়)।
বিনকি

আমি ফাইল এক্সটেনশানগুলি সম্পর্কে আলোচনা বাদ দিলাম কারণ আমি আমার পোর্টেবল কোডটি শেলআউটগুলিতে লিখছিলাম (যেমন, <Exec/>এমএসবিল্ড টাস্ক ) স্বতন্ত্র ব্যাচের ফাইল হিসাবে না। ভবিষ্যতে আমার কিছুটা সময় থাকলে আমি এই মন্তব্যে থাকা তথ্যের সাথে উত্তরটি আপডেট করব ...
বিনকি

23

আপনি এটি চেষ্টা করতে পারেন:

#|| goto :batch_part
 echo $PATH
#exiting the bash part
exit
:batch_part
 echo %PATH%

সম্ভবত আপনাকে /r/nইউনিক্স শৈলীর পরিবর্তে একটি নতুন লাইন হিসাবে ব্যবহার করতে হবে I আমি যদি মনে করি সঠিকভাবে ইউনিক্স নতুন লাইনটি স্ক্রিপ্টগুলি দ্বারা একটি নতুন লাইন হিসাবে ব্যাখ্যা করা হয় না n অন্য কোনও .batউপায় হ'ল #.exeপথে কোনও ফাইল তৈরি করা যা এতে কিছুই না করে does এখানে আমার উত্তর হিসাবে একই পদ্ধতি: একটি অস্থায়ী ফাইল ব্যবহার না করে একটি ব্যাচ ফাইলের মধ্যে ভিবিএস স্ক্রিপ্ট এম্বেড এবং সম্পাদন করা সম্ভব?

সম্পাদনা

Binki এর উত্তর প্রায় নির্ভুল কিন্তু এখনও উন্নত করা যেতে পারে:

:<<BATCH
    @echo off
    echo %PATH%
    exit /b
BATCH

echo $PATH

এটি আবার :কৌশল এবং একাধিক লাইন মন্তব্য ব্যবহার করে cm দেখতে ইউএমএস স্টাইল EOL এর সাথে cmd.exe (কমপক্ষে উইন্ডোজ 10 এ) সমস্যা ছাড়াই কাজ করে যাতে আপনার স্ক্রিপ্টটি লিনাক্স ফর্ম্যাটে রূপান্তরিত হয়েছে তা নিশ্চিত হন। (একই পদ্ধতির ব্যবহার এখানে এবং এখানে আগে দেখা গেছে )। যদিও শেবাং ব্যবহার করলে অপ্রয়োজনীয় আউটপুট তৈরি হবে ...


4
/r/nলাইনগুলির শেষে বাশ স্ক্রিপ্টে অনেক মাথাব্যাথা সৃষ্টি করে আপনি যদি প্রতিটি লাইনকে একটি #(অর্থাত্ #/r/n) দিয়ে শেষ না করেন - এইভাবে \rমন্তব্যটির অংশ হিসাবে বিবেচিত হবে এবং উপেক্ষা করা হবে।
গর্ডন ডেভিসন

4
আসলে, আমি খুঁজে পেয়েছি যে কমান্ডটি খুঁজে পাওয়া যায় নি সে # 2>NUL & ECHO Welcome to %COMSPEC%.সম্পর্কে ত্রুটিটি আড়াল করতে পরিচালিত #করে cmd। এই কৌশলটি কার্যকর যখন আপনার একটি স্ট্যান্ডেলোন লাইন লিখতে হবে যা কেবলমাত্র cmd(যেমন, এ Makefile) দ্বারা সম্পাদিত হবে write
বিনকি

11

আমি মন্তব্য করতে চেয়েছিলাম, তবে এই মুহূর্তে কেবল একটি উত্তর যুক্ত করতে পারি।

প্রদত্ত কৌশলগুলি দুর্দান্ত এবং আমি সেগুলিও ব্যবহার করি।

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

অন্য সমস্যাটি হ'ল নেটওয়ার্ক মাউন্ট করা ফাইল সিস্টেমগুলি (বা সিডি) যা বিভিন্ন সিস্টেমের ধরণের মধ্যে ভাগ করা হয় (বিশেষত যেখানে আপনি ব্যবহারকারীর কাছে উপলব্ধ সফ্টওয়্যারটি নিয়ন্ত্রণ করতে পারবেন না)।

সুতরাং একটি ডস লাইন বিরতি ব্যবহার করা উচিত এবং প্রতিটি লাইন ( ) এর শেষে একটি মন্তব্য রেখে /r/nডস থেকে বাশ স্ক্রিপ্ট রক্ষা করা উচিত । আপনি ব্যাশে লাইন ধারাবাহিকতা ব্যবহার করতে পারবেন না কারণ/r#/r তাদের বিরতি হতে হবে।

এই স্ক্রিপ্টটি যে কেউ ব্যবহার করে এবং যে কোনও পরিবেশে এটি কাজ করবে।

আমি পোর্টেবল মেকফিলগুলি তৈরির সাথে এই পদ্ধতিটি ব্যবহার করছি!


6

উপরের উত্তরগুলির বিপরীতে বাশ 4 এবং উইন্ডোজ 10 এর সাথে কোনও ত্রুটি বা ত্রুটি বার্তা ছাড়াই নিম্নলিখিতটি আমার পক্ষে কাজ করে। আমি ফাইলটির নাম "যাইহোক সিএমডি" chmod +xরাখি , এটি লিনাক্সে এক্সিকিউটেবল করার জন্য করি এবং dos2unixবাশকে চুপ করে রাখতে ইউনিক্স লাইনের সমাপ্তি তৈরি করতে পারি ।

:; if [ -z 0 ]; then
  @echo off
  goto :WINDOWS
fi

if [ -z "$2" ]; then
  echo "usage: $0 <firstArg> <secondArg>"
  exit 1
fi

# bash stuff
exit

:WINDOWS
if [%2]==[] (
  SETLOCAL enabledelayedexpansion
  set usage="usage: %0 <firstArg> <secondArg>"
  @echo !usage:"=!
  exit /b 1
)

:: windows stuff

3

একই স্ক্রিপ্টের সাথে bashএবং বিভিন্ন কমান্ড কার্যকর করার বিভিন্ন উপায় রয়েছে cmd

cmd:;অন্যান্য উত্তরে উল্লিখিত হিসাবে শুরু হওয়া লাইনগুলি উপেক্ষা করবে । কমান্ড দিয়ে যদি বর্তমান লাইনটি শেষ হয় তবে এটি পরবর্তী লাইনটিকেও উপেক্ষা করবে rem ^, কারণ ^অক্ষরটি লাইন বিরতি থেকে রক্ষা পাবে এবং পরবর্তী লাইনটি একটি মন্তব্য হিসাবে বিবেচিত হবে rem

লাইন bashউপেক্ষা করার জন্য cmd, একাধিক উপায় আছে। আমি এটি না ভেঙে কিছু করার জন্য কিছু উপায় গণনা করেছি cmdআদেশগুলি :

অস্তিত্বহীন #কমান্ড (প্রস্তাবিত নয়)

স্ক্রিপ্টটি #চালু cmdহওয়ার সময় যদি কোনও কমান্ড উপলব্ধ না থাকে তবে আমরা এটি করতে পারি:

# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #

#শুরুতে চরিত্র cmdলাইন তোলে bashএকটি মন্তব্য হিসাবে যে লাইন আচরণ।

#শেষে চরিত্র bashলাইন মন্তব্য করতে ব্যবহার করা হয় \r, চরিত্র হিসাবে ব্রায়ান Tompsett মধ্যে নির্দিষ্ট তার উত্তর । এটি ছাড়া, bashযদি ফাইলটির \r\nলাইন শেষ হয় তবে এটির একটি ত্রুটি ছুঁড়ে দেবে cmd

করার মাধ্যমে # 2>nul, আমরা cmdকিছু অস্তিত্বহীন #কমান্ডের ত্রুটি উপেক্ষা করার চেষ্টা করছি , তবুও নিম্নলিখিত আদেশটি কার্যকর করা হচ্ছে।

যদি কোনও #কমান্ড উপলব্ধ থাকে PATHবা যদি আপনার কাছে উপলব্ধ কমান্ডগুলির উপর আপনার কোনও নিয়ন্ত্রণ না থাকে তবে এই সমাধানটি ব্যবহার করবেন না cmd


চরিত্রটি echoউপেক্ষা করার জন্য ব্যবহার করা #হচ্ছেcmd

echoএর আউটপুটটি পুনঃনির্দেশিত এর সাথে মন্তব্য করা অংশে cmdকমান্ড সন্নিবেশ করতে আমরা ব্যবহার করতে পারি bash:

echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #

যেহেতু #চরিত্রটির কোনও বিশেষ অর্থ নেই cmd, তাই এটি পাঠ্যের অংশ হিসাবে বিবেচিত হবে echo। আমাদের যা করতে হয়েছিল তা হ'ল echoকমান্ডের আউটপুট পুনর্নির্দেশ করা এবং এর পরে অন্যান্য কমান্ড সন্নিবেশ করানো।


খালি #.batফাইল

echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #

echo >/dev/null # 1>nul 2> #.batলাইন একটি খালি সৃষ্টি #.batফাইল থাকাকালীন cmd(অথবা প্রতিস্থাপন বিদ্যমান #.bat, যদি থাকে), এবং কিছুই না থাকাকালীনbash

এই ফাইলটি cmdলাইন (গুলি) দ্বারা ব্যবহৃত হবে যা এরপরে অন্য কোনও #কমান্ড থাকলেও অনুসরণ করবে PATH

del #.batকমান্ড cmd-specific কোড তৈরি করা হয়েছে যে ফাইল মুছে ফেলা হবে। আপনাকে কেবল শেষ cmdলাইনে এটি করতে হবে ।

যদি কোনও #.batফাইল আপনার বর্তমান কার্যক্ষম ডিরেক্টরিতে থাকতে পারে তবে এই সমাধানটি ব্যবহার করবেন না কারণ সেই ফাইলটি মোছা হবে।


পুনরুদ্ধার করা: আদেশগুলি উপেক্ষা করতে এখানে-নথি ব্যবহার cmdকরাbash

:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:

^চরিত্রটি cmdরেখার শেষে রেখে আমরা লাইন ব্রেকটি এড়াতে চলেছি এবং :এখানে-নথির ডিলিমিটার হিসাবে ব্যবহার করে , ডিলিমিটার লাইনের সামগ্রীগুলির কোনও প্রভাব পড়বে না cmd। এইভাবে, cmdলাইনটি শেষ হওয়ার পরে কেবল তার রেখাটি কার্যকর করা হবে :, একই আচরণ করেbash

আপনি যদি উভয় প্ল্যাটফর্মে একাধিক লাইন রাখতে চান এবং কেবলমাত্র ব্লকের শেষে এগুলি সম্পাদন করতে চান, আপনি এটি করতে পারেন:

:;( #
  :;  echo 'Hello'  #
  :;  echo 'bash!'  #
:; );<<'here-document delimiter'
(
      echo Hello
      echo cmd!
) & rem ^
here-document delimiter

যতক্ষণ না cmdহুবহু কোনও লাইন নেই here-document delimiter, এই সমাধানটি কাজ করা উচিত। আপনি here-document delimiterঅন্য কোনও পাঠ্যে পরিবর্তন করতে পারেন ।


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

এই সমাধানগুলি অবশ্যই \r\nলাইন ব্রেক হিসাবে ফাইলগুলিতে সংরক্ষণ করতে হবে, অন্যথায় তারা কাজ করবে না cmd


আগের চেয়ে আরও দেরী ... এটি অন্যান্য উত্তরগুলির চেয়ে আমাকে আরও বেশি সাহায্য করেছে। ধন্যবাদ !!
এ-ডিডি

3

আপনি ভেরিয়েবলগুলি ভাগ করতে পারেন:

:;SET() { eval $1; }

SET var=value

:;echo $var
:;exit
ECHO %var%

2

পূর্ববর্তী উত্তরগুলি সমস্ত বিকল্পগুলি বেশ কভার করে বলে মনে হয়েছে এবং আমাকে অনেক সাহায্য করেছে। আমি এই উত্তরটি এখানে যুক্ত করছি কেবল একই পদ্ধতিতে আমি ব্যাশ স্ক্রিপ্ট এবং একটি উইন্ডোজ সিএমডি স্ক্রিপ্ট উভয়ই একই ফাইলটিতে অন্তর্ভুক্ত করেছিলাম used

LinuxWindowsScript.bat

echo >/dev/null # >nul & GOTO WINDOWS & rem ^
echo 'Processing for Linux'

# ***********************************************************
# * NOTE: If you modify this content, be sure to remove carriage returns (\r) 
# *       from the Linux part and leave them in together with the line feeds 
# *       (\n) for the Windows part. In summary:
# *           New lines in Linux: \n
# *           New lines in Windows: \r\n 
# ***********************************************************

# Do Linux Bash commands here... for example:
StartDir="$(pwd)"

# Then, when all Linux commands are complete, end the script with 'exit'...
exit 0

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

:WINDOWS
echo "Processing for Windows"

REM Do Windows CMD commands here... for example:
SET StartDir=%cd%

REM Then, when all Windows commands are complete... the script is done.

সারসংক্ষেপ

লিনাক্সে

প্রথম লাইন ( echo >/dev/null # >nul & GOTO WINDOWS & rem ^) উপেক্ষা করা হবে এবং exit 0কমান্ডটি কার্যকর না হওয়া পর্যন্ত স্ক্রিপ্টটি তত্ক্ষণাত প্রতিটি লাইনের মধ্য দিয়ে প্রবাহিত হবে । একবার exit 0পৌঁছে গেলে , স্ক্রিপ্টের প্রয়োগটি শেষ হবে, এর নীচে উইন্ডোজ কমান্ডগুলি উপেক্ষা করে।

উইন্ডোজে

প্রথম লাইনটি GOTO WINDOWSকমান্ডটি কার্যকর করবে , লিনাক্স কমান্ডগুলি তত্ক্ষণাত এড়িয়ে চলবে এবং লাইনে প্রয়োগ চালিয়ে যাবে :WINDOWS

উইন্ডোজ মধ্যে ক্যারিজ রিটার্ন অপসারণ

যেহেতু আমি উইন্ডোজে এই ফাইলটি সম্পাদনা করছিলাম, তাই আমাকে লিনাক্স কমান্ডগুলি থেকে নিয়মিতভাবে ক্যারেজ রিটার্ন (syste r) অপসারণ করতে হবে অথবা অন্যথায় বাশ অংশটি চালানোর সময় আমি অস্বাভাবিক ফলাফল পেয়েছি। এটি করতে, আমি নোটপ্যাড ++ এ ফাইলটি খুললাম এবং নিম্নলিখিতগুলি করেছি:

  1. লাইন অক্ষরের শেষ দেখার জন্য বিকল্প চালু করুন ( View> Show Symbol> Show End of Line)। ক্যারেজের রিটার্নগুলি তখন CRঅক্ষর হিসাবে প্রদর্শিত হবে ।

  2. একটি অনুসন্ধান করুন এবং প্রতিস্থাপন ( Search> Replace...) করুন এবং Extended (\n, \r, \t, \0, \x...)বিকল্পটি চেক করুন ।

  3. ক্ষেত্রটি টাইপ করুন \rএবং Find what :ক্ষেত্রটি ফাঁকা করুন Replace with :যাতে এতে কিছুই নেই।

  4. ফাইলের শীর্ষে শুরু করে, শীর্ষস্থানীয় লিনাক্স অংশ থেকে Replaceসমস্ত ক্যারেজ রিটার্ন ( CR) অক্ষর মুছে ফেলা না হওয়া পর্যন্ত বোতামটি টিপুন । CRউইন্ডোজ অংশের জন্য ক্যারেজ রিটার্ন ( ) অক্ষর রেখে যেতে ভুলবেন না ।

ফলাফলটি হওয়া উচিত যে প্রতিটি লিনাক্স কমান্ডটি কেবল একটি লাইন ফিডে শেষ হয় ( LF) এবং প্রতিটি উইন্ডোজ কমান্ড একটি ক্যারেজ রিটার্ন এবং লাইন ফিড ( CR LF) এ শেষ হয়।


নোটপ্যাড ++ এ কেবল সম্পাদনা> ইওল রূপান্তর> এলএফ নির্বাচন করুন , এ জাতীয় প্রতিস্থাপন করার দরকার নেই। এবং প্রতিবার এটি করার দরকার নেই, সেটিংস> অগ্রাধিকারে প্রয়োজনে LF কে ডিফল্ট হিসাবে সেট করুন। অন্যথায় উইন্ডোজে
সিআরএলএফ

2

আমি রান্নেবল জার ফাইলগুলি তৈরি করতে এই কৌশলটি ব্যবহার করি। যেহেতু জার / জিপ ফাইলটি জিপ শিরোনামে শুরু হয়, তাই এই ফাইলটি শীর্ষে চালানোর জন্য আমি একটি সর্বজনীন স্ক্রিপ্ট রাখতে পারি:

#!/usr/bin/env sh\n
@ 2>/dev/null # 2>nul & echo off & goto BOF\r\n
:\n
<shell commands go here with \n line endings>
exit\n
\r\n
:BOF\r\n
<cmd commands go here with \r\n line endings>\r\n
exit /B %errorlevel%\r\n
}

উপরে বর্ণিত হিসাবে লাইন এন্ডিংগুলি সেট করা গুরুত্বপূর্ণ কারণ তারা বিভিন্ন প্ল্যাটফর্মগুলিতে সমস্যা সৃষ্টি করতে পারে। এছাড়াও জ্যাম লেবেলের আশেপাশে যদি সঠিক লাইন শেষ না পাওয়া যায় তবে কিছু ক্ষেত্রে গোটো স্টেটমেন্টটি সঠিকভাবে কাজ করবে না।

উপরের কৌশলটি হ'ল আমি বর্তমানে যা ব্যবহার করি। নীচে একটি পুরাতন সংস্করণ রয়েছে যা গভীরতর ব্যাখ্যা সহ:

#!/usr/bin/env sh
@ 2>/dev/null # 2>nul & echo off
:; alias ::=''
:: exec java -jar $JAVA_OPTS "$0" "$@"
:: exit
java -jar %JAVA_OPTS% "%~dpnx0" %*
exit /B
  • প্রথম লাইনটি সেমিডিতে প্রতিধ্বনিত করে এবং sh এ কোনও প্রিন্ট করে না এর কারণ এটি @একটি ত্রুটি ছুড়ে দেয় যা পাইপ করা হয় /dev/nullএবং তার পরে একটি মন্তব্য শুরু হয়। সিএমডি-তে পাইপ /dev/nullব্যর্থ হয় কারণ ফাইলটি উইন্ডোগুলিতে স্বীকৃত নয় তবে যেহেতু উইন্ডোজ কোনও #মন্তব্য হিসাবে চিহ্নিত না করে ত্রুটিটি পাইপ করা হয়েছে nul। তারপরে এটি একটি প্রতিধ্বনি বন্ধ করে দেয়। পুরো লাইনটি এর আগে রয়েছে কারণ এটি @সেন্টিমিডিতে প্রিনেট পায় না।
  • দ্বিতীয়টি সংজ্ঞায়িত করে ::, যা সেমিডিতে একটি মন্তব্য শুরু করবে, শের নূরে। এই সুবিধা যে হয়েছে ::রিসেট নেই $?করার 0। এটি " :;একটি লেবেল" ট্রিক ব্যবহার করে।
  • এখন আমি sh কমান্ডগুলি প্রিপেন্ড করতে পারি ::এবং সেগুলি সেমিডিতে উপেক্ষা করা হয়
  • উপর :: exitSH স্ক্রিপ্ট প্রান্ত এবং আমি cmd কমান্ড কমান্ড লিখতে পারেন
  • এটি মুদ্রিত হওয়ার পরে কেবল প্রথম লাইন (শেবাং) সেন্টিমিডিতে সমস্যাযুক্ত command not found। আপনার প্রয়োজন হবে কিনা তা আপনার নিজেরাই সিদ্ধান্ত নিতে হবে।

0

আমার পাইথন প্যাকেজ ইনস্টল স্ক্রিপ্টগুলির জন্য আমার এটির দরকার ছিল। Sh এবং ব্যাট ফাইলের মধ্যে বেশিরভাগ জিনিস একই তবে ত্রুটি পরিচালনার মতো কয়েকটি জিনিস আলাদা। এটি করার একটি উপায় নিম্নরূপ:

common.inc
----------
common statement1
common statement2

তারপরে আপনি এটিকে বাশ স্ক্রিপ্ট থেকে কল করবেন:

linux.sh
--------
# do linux specific stuff
...
# call common code
source common.inc

উইন্ডোজ ব্যাচ ফাইলটি দেখতে এমন দেখাচ্ছে:

windows.bat
-----------
REM do windows specific things
...
# call common code
call common.inc


-6

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


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