আমি ইন্টারেক্টিভ শেল এবং একটি অ-ইন্টারেক্টিভ শেলের মধ্যে প্রাথমিক পার্থক্যটি বুঝতে পারি। লগ-ইন শেল থেকে লগইন শেলটি ঠিক কী পার্থক্য করে?
লগ-ইন না করা ইন্টারেক্টিভ শেল ব্যবহারের জন্য আপনি উদাহরণ দিতে পারেন ?
আমি ইন্টারেক্টিভ শেল এবং একটি অ-ইন্টারেক্টিভ শেলের মধ্যে প্রাথমিক পার্থক্যটি বুঝতে পারি। লগ-ইন শেল থেকে লগইন শেলটি ঠিক কী পার্থক্য করে?
লগ-ইন না করা ইন্টারেক্টিভ শেল ব্যবহারের জন্য আপনি উদাহরণ দিতে পারেন ?
উত্তর:
লগইন শেল হ'ল প্রথম প্রক্রিয়া যা আপনার ব্যবহারকারী আইডির আওতায় কার্যকর হয় যখন আপনি কোনও ইন্টারেক্টিভ সেশনে লগ ইন করেন। লগইন প্রক্রিয়া শেলটিকে একটি কনভেনশন সহ লগইন শেল হিসাবে আচরণ করতে বলে: পাসিং আর্গুমেন্ট 0, যা সাধারণত শেলটির নাম, একটি -
অক্ষর প্রিপেন্ড করা থাকে (যেমন -bash
এটি সাধারণত হবে bash
Login লগইন শেলগুলি সাধারণত একটি ফাইল পড়ে এনভায়রনমেন্ট ভেরিয়েবল সেট করার মতো জিনিস: /etc/profile
এবং ~/.profile
theতিহ্যবাহী বোর্ন শেল, ~/.bash_profile
অতিরিক্তভাবে বাশ † , /etc/zprofile
এবং ~/.zprofile
zsh for , /etc/csh.login
এবং ~/.login
csh ইত্যাদির জন্য etc.
আপনি যখন কোনও পাঠ্য কনসোলে লগ ইন করেন বা এসএসএইচ এর মাধ্যমে বা এর মাধ্যমে su -
, আপনি একটি ইন্টারেক্টিভ লগইন শেল পাবেন। আপনি যখন গ্রাফিকাল মোডে লগ ইন করেন ( এক্স এক্স ম্যানেজারে ) তখন আপনি লগইন শেল পাবেন না, পরিবর্তে আপনি সেশন ম্যানেজার বা উইন্ডো ম্যানেজার পাবেন।
একটি অ-ইন্টারেক্টিভ লগইন শেলটি চালানো বিরল , তবে কিছু এক্স সেটিংস এমনটি করে যা আপনি যখন কোনও ডিসপ্লে ম্যানেজারের সাথে লগ ইন করেন তখন প্রোফাইল ফাইলগুলি পড়ার ব্যবস্থা করতে পারেন। অন্যান্য সেটিংস (এটি ডিস্ট্রিবিউশনের উপর এবং ডিসপ্লে ম্যানেজারের উপর নির্ভর করে) পড়ুন /etc/profile
এবং ~/.profile
স্পষ্টভাবে পড়ুন বা সেগুলি পড়বেন না। আরেকটি উপায় একটি অ-ইন্টারেক্টিভ লগ-ইন শেল পেতে একটি কমান্ড স্ট্যান্ডার্ড ইনপুট মাধ্যমে গৃহীত টার্মিনাল, যেমন নয় সঙ্গে দূরবর্তী অবস্থান থেকে লগ ইন করার নেই ssh example.com <my-script-which-is-stored-locally
(উল্টোদিকে ssh example.com my-script-which-is-on-the-remote-machine
, যা একটি নন-ইন্টারেক্টিভ, অ-লগইন শেল চালায়)।
আপনি যখন একটি বিদ্যমান সেশনে টার্মিনালে একটি শেল শুরু করেন (স্ক্রিন, এক্স টার্মিনাল, ইমাকস টার্মিনাল বাফার, অন্যের মধ্যে একটি শেল ইত্যাদি), আপনি একটি ইন্টারেক্টিভ, লগ-ইন না করে শেল পাবেন get যে শেল শেল কনফিগারেশন ফাইল (পড়তে পারে ~/.bashrc
ব্যাশ যেন বরকত জন্য bash
, /etc/zshrc
এবং ~/.zshrc
zsh জন্য, /etc/csh.cshrc
এবং ~/.cshrc
csh শেল জন্য, ফাইল দ্বারা নির্দেশিত ENV
যেমন ড্যাশ, ksh এবং ব্যাশ যেমন POSIX / XSI-অনুবর্তী শাঁস জন্য পরিবর্তনশীল যখন যেমন প্রার্থনা sh
, $ENV
যদি সেট এবং ~/.mkshrc
ম্যাক্স ইত্যাদির জন্য)।
যখন শেলটি তার কমান্ড লাইনে একটি স্ক্রিপ্ট বা একটি কমান্ডটি চালিত করে, এটি একটি অ-ইন্টারেক্টিভ, লগইনবিহীন শেল। এই ধরনের শাঁস সর্বদা চলতে থাকে: এটি খুব সাধারণ যে কোনও প্রোগ্রাম যখন অন্য প্রোগ্রামকে কল করে তখন এটি অন্য প্রোগ্রামটি চালানোর জন্য শেলের মধ্যে একটি ছোট স্ক্রিপ্ট চালায়। কিছু শেল এই ক্ষেত্রে একটি স্টার্টআপ ফাইল পড়ে (ব্যাশ BASH_ENV
ভেরিয়েবল দ্বারা নির্দেশিত ফাইলটি চালায় , zsh রান করে /etc/zshenv
এবং ~/.zshenv
) তবে এটি ঝুঁকিপূর্ণ: শেলটি সমস্ত প্রসঙ্গে প্রেরণ করা যেতে পারে, এবং এমন কিছু খুব কমই করতে পারে যা আপনি নাও করতে পারেন কিছু ভাঙ্গা
† আমি কিছুটা সরলীকরণ করছি, মজাদার বিশদগুলির জন্য ম্যানুয়ালটি দেখুন।
bash
একটি অ-ইন্টারেক্টিভ লগইন শেল হিসাবে চালাবেন ?
echo $- | bash -lx
FOO
পরিবেশের পরিবর্তনশীল হয় (যেমন .profile
থাকে export FOO=something
) তবে এটি সহ সমস্ত উপ-প্রসেসের জন্য উপলব্ধ foo.sh
। আপনি যদি এতে পরিবর্তন .profile
করেন export FOO=something_else
তবে পরের বার আপনি লগইন না হওয়া পর্যন্ত ./foo.sh
মুদ্রণ করবেনsomething
আপনি লগইন শেলটিতে আছেন কিনা তা জানাতে:
prompt> echo $0
-bash # "-" is the first character. Therefore, this is a login shell.
prompt> echo $0
bash # "-" is NOT the first character. This is NOT a login shell.
বাশ-এ আপনি ব্যবহার করতে পারেন shopt login_shell
:
prompt> shopt login_shell
login_shell off
(বা on
লগইন শেল এ)।
তথ্য পাওয়া যাবে man bash
(অনুরোধ অনুসন্ধান)। এখানে একটি অংশ:
লগইন শেল এমন একটি যার আর্গুমেন্ট শূন্যের প্রথম অক্ষর হ'ল - বা লোগো বিকল্পটি দিয়ে শুরু করা।
আপনি নিজে এটি পরীক্ষা করতে পারেন। যে কোনও সময় আপনি এসএসএইচ করুন, আপনি লগইন শেলটি ব্যবহার করছেন। উদাহরণ স্বরূপ:
prompt> ssh user@localhost
user@localhost's password:
prompt> echo $0
-bash
লগইন শেল ব্যবহারের গুরুত্ব হ'ল এতে যে কোনও সেটিংস /home/user/.bash_profile
কার্যকর হবে। আপনি যদি আগ্রহী হন তবে এখানে আরও কিছু তথ্য দেওয়া হয়েছে (থেকে man bash
)
"যখন বাশকে একটি ইন্টারেক্টিভ লগইন শেল হিসাবে, বা - লোগিন বিকল্পের সাথে একটি অ-ইন্টারেক্টিভ শেল হিসাবে ডাকা হয়, এটি প্রথমে ফাইল / ইত্যাদি / প্রোফাইল থেকে কমান্ডগুলি পড়ে এবং কার্যকর করে, যদি সেই ফাইলটি উপস্থিত থাকে that ফাইলটি পড়ার পরে, এটি জন্য দেখায়
~/.bash_profile
,~/.bash_login
এবং~/.profile
, যাতে, এবং পড়ে এবং প্রথম এক যে বিদ্যমান এবং পাঠযোগ্য। --noprofile বিকল্পটি শেল এই আচরণ দমন করা শুরু হয় ব্যবহার করেছিলেন তার থেকে কমান্ড executes। "
একটি লগইন শেল argv[0][0] == '-'
,। এটি এটি কীভাবে জানে এটি লগইন শেল।
এবং তারপরে কিছু পরিস্থিতিতে এটি এর "লগইন শেল" স্থিতির উপর নির্ভর করে আলাদা আচরণ করে। যেমন একটি শেল, এটি লগইন শেল নয়, "লগআউট" কমান্ড চালায় না।
man bash
, জোর দিয়ে যোগ করা হয়েছে, "একটি লগইন শেল এমন একটি যার আর্গুমেন্টের প্রথম অক্ষরটি হ'ল - বা লগিন বিকল্প দিয়ে শুরু করা হয়েছে। "
আমি লগইন শেল প্রকারটি পরীক্ষা করার জন্য টিমোথির পদ্ধতির সাথে মিলিয়ে গিলসের দুর্দান্ত উত্তরের বিস্তারিত বর্ণনা করব।
আপনি যদি নিজের জন্য জিনিস দেখতে চান তবে স্নিপেটগুলি এবং দৃশ্যের নমুনা চেষ্টা করুন।
শেল (অ-) ইন্টারেক্টিভ কিনা তা পরীক্ষা করা হচ্ছে
if tty -s; then echo 'This is interactive shell.'; else echo 'This is non-interactive shell.'; fi
শেলটি (অ-) লগইন কিনা তা পরীক্ষা করা হচ্ছে
যদি আউটপুটটি echo $0
শুরু হয় তবে -
এটি লগইন শেল ( echo $0
আউটপুট উদাহরণ -bash
:)। অন্যথায় এটি লগ-ইন শেল ( echo $0
আউটপুট উদাহরণ bash
:)।
if echo $0 | grep -e ^\- 2>&1>/dev/null; then echo "This is login shell."; else echo "This is non-login shell."; fi;
উভয় টুকরোগুলি একসাথে পাওয়ার জন্য উপরের দুটি সাথে একত্রিত করা যাক:
THIS_SHELL_INTERACTIVE_TYPE='non-interactive';
THIS_SHELL_LOGIN_TYPE='non-login';
if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi;
if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"
ssh ubuntu@34.247.105.87
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)
ubuntu@ip-172-31-0-70:~$ THIS_SHELL_INTERACTIVE_TYPE='non-interactive';
ubuntu@ip-172-31-0-70:~$ THIS_SHELL_LOGIN_TYPE='non-login';
ubuntu@ip-172-31-0-70:~$ if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi;
ubuntu@ip-172-31-0-70:~$ if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
ubuntu@ip-172-31-0-70:~$ echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"
interactive/login
ubuntu@ip-172-31-0-70:~$ bash -c 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'
interactive/non-login
ssh ubuntu@34.247.105.87 < checkmy.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)
non-interactive/login
ssh ubuntu@34.247.105.87 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'
non-interactive/non-login
-t
স্যুইচ সহ দূরবর্তীভাবে ssh ওপরে একটি কমান্ড চালানোআপনি -t
স্যুইচ ব্যবহার করে দূরবর্তীভাবে কমান্ড চালাতে চাইলে আপনি স্পষ্টতই ইন্টারেক্টিভ শেলটি অনুরোধ করতে পারেন।
ssh ubuntu@34.247.105.87 -t 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'
interactive/non-login
দ্রষ্টব্য: বিষয় উপর কেন কমান্ড দূরবর্তী অবস্থান থেকে চলমান নয় login shell
আরও তথ্য এখানে ।