[-T 1] চেক করে?


13

আমি zshযখনই bashউইন্ডোজটি চালু করেছিলাম তখনই শুরু করার উপায় খুঁজে পেয়েছি

https://www.howtogeek.com/258518/how-to-use-zsh-or-another-shell-in-windows-10/

এটি এর শেষে নিম্নলিখিত কোড যুক্ত করার পরামর্শ দেয় .bashrc

# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi

কী [ -t 1 ]মানে?

এটা কি সত্যি?

তাহলে, আমি কি কেবল এটি করতে পারি?

exec zsh

উত্তর:


14

[]testকমান্ডের শর্টকাট ।

মতে man test:

-t FD
সত্য যদি এফডি কোনও ফাইল বর্ণনাকারী হয় যা টার্মিনালের সাথে সম্পর্কিত।

সুতরাং যদি আপনি ব্যাশটিকে ইন্টারেক্টিভ শেল হিসাবে চালাচ্ছেন (টার্মিনাল - টার্মিনোলজির ব্যাখ্যার জন্য এই থ্রেডটি দেখুন ), বাশ zsh দ্বারা প্রতিস্থাপন করা হবে।

.বাশ * ফাইল সম্পর্কে আরও:

যখন বাশকে একটি ইন্টারেক্টিভ লগইন শেল হিসাবে, বা - লগিন বিকল্পের সাথে একটি অ-ইন্টারেক্টিভ শেল হিসাবে ডাকা হয় , এটি প্রথমে ফাইল / ইত্যাদি / প্রোফাইল থেকে কমান্ডগুলি পড়ে এবং কার্যকর করে, যদি সেই ফাইলটি বিদ্যমান থাকে। এই ফাইলটি পড়ার পরে, এটি সেই ক্রমে ash / .bash_profile, ash / .bash_login, এবং ~ /। প্রোফাইলে অনুসন্ধান করে এবং উপস্থিত এবং পঠনযোগ্য যা প্রথমটি থেকে আদেশগুলি পড়ে এবং কার্যকর করে। শেলটি এই আচরণটি আটকাতে শুরু করা হলে --noprofile বিকল্পটি ব্যবহার করা যেতে পারে।

লগইন শেলটি যখন প্রস্থান করে , তখন ফাইলগুলি উপস্থিত থাকলে ফাইলগুলি ~ / .bash_logout এবং /etc/bash.bash_logout থেকে কমান্ডগুলি পড়ে এবং কার্যকর করে।

লগইন শেল নয় এমন একটি ইন্টারেক্টিভ শেলটি যখন শুরু হয়, তখন ফাইলটি উপস্থিত থাকলে ash / .bashrc থেকে আদেশগুলি পড়ে এবং কার্যকর করে । এটি --norc বিকল্প ব্যবহার করে বাধা দেওয়া হতে পারে। --Rcfile ফাইল অপশনটি বাশকে from / .bashrc এর পরিবর্তে ফাইল থেকে আদেশগুলি পড়তে এবং সম্পাদন করতে বাধ্য করবে।

স্টাফেন চেজেলাস মন্তব্য করেছেন:
নোট করুন যে শেল স্টডআউট টার্মিনাল না হয়ে ইন্টারেক্টিভ হতে পারে, এবং শেল স্টাডআউটে টার্মিনালের সাথে অ ইন্টারেক্টিভ হতে পারে (যেমন আপনি যে কোনও সময় টার্মিনালে কোনও আউটপুট পুনর্নির্দেশ / পাইপ ছাড়াই স্ক্রিপ্ট চালাবেন), এবং bashএটি পড়া .bashrcএমনকি যখন ইন্টারেক্টিভ না (মত ssh host cmdযেখানে bashহোস্ট ব্যবহারকারীর লগ-ইন শেল, অথবা bash --login -c 'some code')। case $- in *i*)...শেল ইন্টারেক্টিভ হয় কিনা তা পরীক্ষা করার সঠিক উপায়।


4
নোট করুন যে শেল স্টডআউটটি টার্মিনাল না হয়ে ইন্টারেক্টিভ হতে পারে, এবং শেল স্টাডাউটে টার্মিনালের সাথে অ ইন্টারেক্টিভ হতে পারে (যেমন আপনি যে কোনও সময় টার্মিনালে পুনর্নির্দেশ / পাইপিং ছাড়াই কোনও স্ক্রিপ্ট চালাবেন) এবং bashপড়তে পারেন .bashrcএমনকি যখন না ইন্টারেক্টিভ (মত ssh host cmdযেখানে bashহোস্ট ব্যবহারকারীর লগ-ইন শেল, অথবা bash --login -c 'some code'যেখানে .bash_profileসূত্র .bashrc)। case $- in *i*)...শেল ইন্টারেক্টিভ হয় কিনা তা পরীক্ষা করার সঠিক উপায়।
স্টাফেন চেজেলাস

@ স্টাফেনচেজেলাস ভাল পয়েন্ট। আমি উত্তর হিসাবে আপনার মন্তব্য থাকবে
mrc02_kr

"ইন্টারেক্টিভ" এর বিভিন্ন সংজ্ঞা রয়েছে। শেলটি যদি এটি ইন্টারেক্টিভ মনে করে, তবে iসেট করা হবে (এবং আধুনিক শেলগুলিতে যা ifব্যবহারের পরিবর্তে পরীক্ষা করা যেতে পারে case)। তবে অনেকগুলি ব্যবহারের কেস রয়েছে যেখানে স্ট্যান্ডআউট (বা স্টিডিন, বা স্ট্ডার ...) টার্মিনালের সাথে সংযুক্ত থাকলে কেবল একজনই যত্নশীল হন।
মার্ক রিড

9

পরীক্ষা কমান্ড [ -t 1 ] কিনা তা পরীক্ষা ব্যাশ এর আউটপুট টার্মিনাল চালু আছে। এই লাইনের উদ্দেশ্যটি পরিষ্কারভাবে zsh চালানো যখন টার্মিনালটি খোলার সময় ব্যাশের অন্যান্য ব্যবহার ব্যাহত না করে run তবে এটি খুব খারাপভাবে করা হয়েছে।

ফাইলটি .bashrcতিন পরিস্থিতিতে পড়েছে:

  • যখন ব্যাশটি একটি ইন্টারেক্টিভ শেল হিসাবে কার্যকর করা হয়, অর্থাত ব্যাচ কমান্ডগুলি প্রয়োগ করার পরিবর্তে ব্যবহারকারী দ্বারা টাইপ করা কমান্ডগুলি চালানো।
  • যখন ব্যাশ একটি অ-ইন্টারেক্টিভ শেল যা কোনও আরএসএইচ বা এসএসএইচ ডেমন দ্বারা চালিত হয় (সাধারণত আপনি চালিত হন ssh host.example.com somecommandএবং বাশ আপনার লগইন শেল চালু থাকে host.example.com)।
  • যখন এটি স্পষ্টভাবে আহ্বান করা হয়, যেমন কোনও ব্যবহারকারীর .bash_profile( স্টার্টআপ ফাইলগুলির বাশের পছন্দটি কিছুটা অদ্ভুত )।

[ -t 1 ]ইন্টারেক্টিভ শেলগুলি সনাক্ত করার একটি দরিদ্র উপায়। স্ট্যান্ডার্ড আউটপুট টার্মিনালে না যাওয়ার সাথে আন্তঃক্রিয়াশীলভাবে বাশ চালানো এটি সম্ভব তবে বিরল। অ-ইন্টারেক্টিভ শেলটিতে স্ট্যান্ডার্ড আউটপুটটি টার্মিনালে যাওয়া আরও সাধারণ বিষয়; একটি অ-ইন্টারেক্টিভ শেলের কোনও ব্যবসা চলছে না .bashrcতবে দুর্ভাগ্যক্রমে এসএসএইচ দ্বারা চালিত বাশ শেল। আরও অনেক ভাল উপায় আছে: বাশ (এবং অন্য কোনও শ-শৈলীর শেল) এটি করার জন্য একটি অন্তর্নিহিত, নির্ভরযোগ্য পদ্ধতি সরবরাহ করে।

case $- in
  *i*) echo this shell is interactive;;
  *) echo this shell is not interactive;;
esac

সুতরাং "লঞ্চ zsh যদি এটি একটি ইন্টারেক্টিভ শেল হয়" লিখতে হবে

case $- in
  *i*) exec zsh;;
esac

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


জন্য rsh/ sshএবং ইন্টারেক্টিভ শেল জন্য, যদি এটা এর না একটি লগইন শেল। লগইন শেলগুলির জন্য (পরিবর্তে sshdএকটি ইন্টারঅ্যাক্টিভ লগইন শেল শুরু করবে না, তবে আপনি এটিটি দিয়েও করতে পারেন ssh host exec bash -l), .bash_profileপরিবর্তে পড়া হয়। এছাড়াও নোট করুন rsh/ এর জন্য ssh$SHLVL
আপনারও

5

মানুষ 1 পরীক্ষা :

-t এফডি

ফাইল বর্ণনাকারী এফডি টার্মিনালে খোলা হয়

আপনাদের উদাহরণ, executes (দৌড়ানো প্রতিস্থাপন প্রক্রিয়া, এই ক্ষেত্রে bash) সঙ্গে zshযদি উপর stdout- এ একটি টার্মিনাল (একটি ফাইল / পাইপ / ইত্যাদি) উপর খোলা আছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.