উত্তর:
যদি আপনার স্ক্রিপ্টগুলি লাইন দিয়ে শুরু হয় তবে #!/bin/bash
সেগুলি এখনও ব্যাশ ব্যবহার করে চালানো হবে, এমনকি যদি আপনার ডিফল্ট শেলটি zsh হয়।
আমি zsh এর বাক্য গঠনটি সত্যই বাশের একটির খুব কাছে পেয়েছি এবং সত্যিই কিছু অসুবিধাগুলি থাকলে আমি মনোযোগ দেব না। আমি 6 বছর আগে বাঁশ থেকে একচেটিয়াভাবে zsh এ চলেছি।
.zshrc
:)
#!/bin/bash
স্ক্রিপ্ট ফাইলটি চললে লাইনে কি উপেক্ষা করা হবে source ./script.sh
?
#!/usr/bin/env bash
পরিবর্তে আপনার ব্যবহার করা উচিত , বিশেষত ম্যাকোএসে, যেখানে ডিফল্ট ব্যাশ মারাত্মকভাবে পুরানো এবং নতুন সংস্করণ কার্যত সর্বদা আলাদা পথে ইনস্টল থাকে।
আপনি যদি ডান এমুলেশন মোডে ( emulate sh
বা emulate ksh
) রাখেন তবে Zsh সর্বাধিক বোর্ন, পসিক্স বা ksh88 স্ক্রিপ্ট চালাতে পারে । এটি ব্যাশ বা ksh93 এর সমস্ত বৈশিষ্ট্য সমর্থন করে না। Zsh এর ব্যাশের বেশিরভাগ বৈশিষ্ট্য রয়েছে তবে বেশিরভাগ ক্ষেত্রে আলাদা সিনট্যাক্স রয়েছে।
আপনি যে শেলটি ইন্টারেক্টিভভাবে ব্যবহার করেন তা আপনার যে কোনও স্ক্রিপ্টের জন্য অপ্রাসঙ্গিক। স্ক্রিপ্টগুলি চালিত শেলটি প্রথম লাইনে শেবাং লাইনটিতে নির্দেশিত একটি indicated উদাহরণস্বরূপ, যদি স্ক্রিপ্টটি শুরু হয় #!/bin/bash
, তবে এটি ব্যাশ দ্বারা কার্যকর করা হবে।
আপনি ব্যাশ কাস্টমাইজড করে থাকেন, তবে আপনি শুধু আপনার নামান্তর পারবে না .bashrc
করতে .zshrc
। কিছু জিনিস ভাগ করা যেতে পারে, উদাহরণস্বরূপ উপকরণ এবং ফাংশন, যতক্ষণ না আপনি দুটি শেলের মধ্যে ছেদটি আটকে থাকবেন (ছেদটি ksh88 এবং pdksh এর কাছাকাছি )। অন্যান্য জিনিস, যেমন প্রম্পট সেটিংস, সমাপ্তির ফাংশন এবং সর্বাধিক বিকল্পগুলির সম্পূর্ণরূপে নতুন করে লেখা দরকার।
মানুষ তাদের থেকে সোর্স করার জন্য আপনাকে একটি স্নিপেট লেখার তাহলে .bashrc
বা .zshrc
এবং আপনি দুটি সংস্করণ বজায় রাখার জন্য ব্যাশ এবং zsh বৈশিষ্ট্য একটি সাধারণ উপসেট, যা ব্যাশ প্রোগ্রামিং বৈশিষ্ট্য অন্তর্ভুক্ত করা হয়েছে বিদ্ধ করতে চাই না। আপনার পুরো কোডটি ফাংশনে রাখুন এবং প্রতিটি ফাংশনের শীর্ষে নীচের লাইনটি দিন:
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
আপনি প্লেইন এস সি সিনট্যাক্সের কাছাকাছি হওয়ার emulate sh
পরিবর্তে ব্যবহার করতে পারেন emulate ksh
যা আপনার প্রয়োজন .profile
।
যদি কোনও ফাংশন অন্য ফাংশনটিকে কল করে, অন্য ফাংশনটি অনুকরণকারী সেটিংটি উত্তরাধিকার সূত্রে প্রাপ্ত হয়, সুতরাং আপনাকে কেবল শেষ ব্যবহারকারী দ্বারা ডাকা ফাংশনগুলিতে অভ্যন্তরীণ ফাংশনে এই লাইনটি লাগানোর দরকার নেই।
./my_script.sh
। source my_script.sh
এবং . my_script.sh
এটি চালাবে এটি কোনও শ্যাবাং উপেক্ষা করে বর্তমান শেল হিসাবে রয়েছে।
যদি শেবাং হয় #!/bin/bash
এবং আপনি স্ক্রিপ্টটি শুরু করেন ./script
তবে স্ক্রিপ্টটি বাশ দ্বারা কার্যকর করা হবে। একেবারে এখানে কোন সমস্যা নেই।
যাইহোক, আপনি যদি চালানো zsh উদাহরণটিতে এটি চালিত করেন zsh ./script
বা উত্স করেন তবে . ./script
এটি খুব সাধারণ যে বাশ এবং zsh এর বাক্য গঠনটি মেলে না।
উদাহরণস্বরূপ, zsh ডিফল্টরূপে প্যারামিটারের বিস্তৃতি বিভক্ত করে না, বাশের একটি সহায়তা অন্তর্নির্মিত থাকে, read -p prompt
zsh তে কোনও কিছুই নেই (সিনট্যাক্সটি খুব আলাদা পড়তে হবে cmd \? প্রম্পট , arrays start on 1 (not 0) in zsh,
কমান্ড only search for external commands in zsh, or there is no (simple) equivalent to
{oo foo ^} `(বড় আকারের প্রথম অক্ষর) zsh তে এটি অন্যদের মধ্যে রয়েছে This এটি (বেশিরভাগ ক্ষেত্রে) মিল এবং কিছু পার্থক্যের দীর্ঘ তালিকা ।
কিছু ক্ষেত্রে, zsh অন্যান্য শাঁস অনুকরণ করতে বলা যেতে পারে। কিছু ক্ষেত্রে, উভয় শেলের পক্ষে পোর্টেবল কোনও সাধারণ সিনট্যাক্স নেই (পোর্টেবল সলিউশন অনুকরণের জন্য এলিয়াস বা ফাংশন ব্যবহার না করে)।
তবে zsh এর অনেকগুলি (প্রচুর) এক্সটেনশন রয়েছে যা ইন্টারেক্টিভভাবে কাজ করা সহজ করে। এটি একই সময়ে স্যুইচ করার একটি দুর্দান্ত কারণ এবং একটি সমস্যা:
ls *(.)
(যা অন্যান্য শাঁসের সাথে জটিল)। এমনকি গভীরভাবে তাকানোর পরেও উত্তর zsh ( print -rl -- *(/)
) এ জটিল হয়ে যায় ।কন zsh:
শেষ পর্যন্ত, এটি আপনার পছন্দ এবং আমি সবসময় আরও পছন্দ পছন্দ করি।