শেলটি লগইন / ইন্টারেক্টিভ / ব্যাচ কিনা তা কীভাবে পরীক্ষা করবেন


143

আমি মনে করি আমি একটি ইন্টারেক্টিভ, লগইন এবং একটি ব্যাচের শেলের মধ্যে পার্থক্য বুঝতে পারি। আরও সহায়তার জন্য নীচের লিঙ্কগুলি দেখুন:

আমার প্রশ্ন হ'ল আমি যদি কোনও ইন্টারেক্টিভ, লগইন বা ব্যাচের শেলটিতে থাকি তবে আমি কমান্ড / শর্ত দিয়ে কীভাবে পরীক্ষা করব?

আমি একটি আদেশ বা শর্তের সন্ধান করছি (এটি প্রত্যাবর্তন করবে trueবা false) এবং আমি যদি একটি বিবৃতিতেও রাখতে পারি। উদাহরণ স্বরূপ:

if [[ condition ]]
   echo "This is a login shell"
fi

3
আরও একটি প্রশ্ন রয়েছে: এসটিডিএন এবং / বা এসটিডিআউট কোনও টিটি (টার্মিনাল) বা পাইপ (ফাইল বা প্রক্রিয়া) এর সাথে সংযুক্ত রয়েছে? নীচের কয়েকটি মন্তব্যে বর্ণিত হিসাবে এটি একটি সম্পর্কিত তবে স্বতন্ত্র পরীক্ষা।
মার্ক হাডসন

উত্তর:


160

bashট্যাগগুলিতে তালিকাভুক্ত কোনও শেল নেই বলেই আমি একটি শেল বা অনুরূপ ধরে নিচ্ছি ।

আপনি ইন্টারেক্টিভ শেলটিতে আছেন কিনা তা পরীক্ষা করতে:

[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'

আপনি লগইন শেলটিতে আছেন কিনা তা পরীক্ষা করতে:

shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'

"ব্যাচ" দ্বারা, আমি ধরে নিয়েছি আপনার অর্থ "ইন্টারেক্টিভ নয়", সুতরাং ইন্টারেক্টিভ শেলের জন্য পরীক্ষা করা যথেষ্ট should


12
জন্য zshব্যবহারকারী, লগ-ইন শেল পরীক্ষা করার সঙ্গে সম্পন্ন করা যেতে পারে:if [[ -o login ]] ...
chb

1
যদি আপনি জানতে চান যে কোনও "ব্যবহারকারী" আপনার প্রোগ্রাম বনাম "ক্রোন" চালিয়েছিল কিনা। [[TERM == "বোবা"]] && এর প্রতিধ্বনি "ক্রোন চালানো
এরিক অ্যারোনস্টি

10
@ এরিক অ্যারোনস্টি সমস্ত বোবা টার্মিনাল ক্রোন সেশন নয়।
ক্রিস ডাউন

2
“আমি ট্যাগগুলিতে তালিকাভুক্ত শেল না থাকায় আমি বাশ শেল বা অনুরূপ, ধরে নিচ্ছি” "- এই বিবৃতিটির যুক্তিটি সত্যই সুন্দর! :)
মাইকেল লে বার্বিয়ার গ্রেনওয়াল্ড

2
@ অ্যান্টোনিও কারণ আপনার উদ্ধৃতিটি ভুল, $-বর্তমান শেলটিতে প্রসারিত হচ্ছে। আপনি যদি পূর্ণ অভিব্যক্তির চারপাশে একক উদ্ধৃতি ব্যবহার করেন তবে সঠিক ফলাফল পাবেন:bash -c '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"'
ক্রিস ডাউন

33

যে কোনও বোর্ন-স্টাইলের শেলটিতে, iবিকল্পটি শেলটি ইন্টারেক্টিভ কিনা তা নির্দেশ করে:

case $- in
  *i*) echo "This shell is interactive";;
  *) echo "This is a script";;
esac

লগইন শেলের জন্য পরীক্ষার কোনও পোর্টেবল এবং সম্পূর্ণ নির্ভরযোগ্য উপায় নেই। Ksh এবং zsh যোগ lকরুন $-। বাশ login_shellবিকল্প নির্ধারণ করে , যা দিয়ে আপনি জিজ্ঞাসা করতে পারবেন shopt -q login_shell। বহনযোগ্যভাবে, $0একটি দিয়ে শুরু হয় কিনা তা পরীক্ষা করুন -: শেলগুলি সাধারণত জানে যে তারা লগইন শেলগুলি রয়েছে কারণ কলার -আর্গুমেন্ট শূন্যে একটি উপসর্গ যুক্ত করেছে (সাধারণত কার্যকরভাবে মৃত্যুদন্ডের নাম বা পথ)। এটি লগইন শেল (উদাঃ ash -l) ব্যবহারের শেল-নির্দিষ্ট উপায়গুলি সনাক্ত করতে ব্যর্থ ।


(...) কারণ আহ্বানকারী - আমি মনে করি এই খণ্ডে কিছু আছে।
পাইওটার ডব্রোগস্ট

$0সর্বদা -এটি কীভাবে শুরু হয়েছিল তা বিবেচনা না করে শুরু করলে আদর্শ হবে । তবে কমপক্ষে একটি ব্যতিক্রম রয়েছে: ল্যাশ- ইন শেল বলে মনে করা হলেও এটি ব্যাশের সাথে সর্বদা সত্য নয় । এটি আপনার বাক্সে চেষ্টা করুন: অনুরোধ করুন bash --login, $0তারপরেও পড়ুন bash
বীরাওয়ান পূর্বন্তো

@ ভাইরাওয়ানপুরান্তো আমি নিশ্চিত নই যে আমি আপনার মন্তব্যটি বুঝতে পেরেছি। আমি আমার শেষ বাক্যে যা লিখেছিলাম তা কি নয়?
গিলস

@ গিলস: আপনি সঠিক বলেছেন। দুঃখিত আমি আপনার শেষ বাক্যটি মিস করেছি।
বীরাওয়ান পূর্বওয়ানটো

24

ফিশ শেল

fishএই পৃষ্ঠাটিতে অন্য কোনও ব্যবহারকারী যদি হোঁচট খায় তবে তার উত্তর এখানে ।

if status --is-interactive
    # ...
end

if status --is-login
    # ...
end

echo "darn, I really wanted to have to use globs or at least a case statement"

ফিশ ডকুমেন্টেশন: ইনিশিয়ালাইজেশন


1
অপ্রয়োজনীয় সম্পাদকীয়করণের জন্য -1।
নিক বেস্টিন

6
কেউ যদি @ নিকবাস্টিনের মন্তব্যে অবাক হয় তবে তার ন্যায্য বিষয় ছিল তাই আমি একটি সম্পাদনা করেছি। আড়ম্বরপূর্ণতার মূল পরিমাণটি এখন অর্ধেক কেটে গেছে।
অহস্পাইট

18

csh / tcsh

জন্য cshএবং tcshআমি আমার নিম্নলিখিত আছে .cshrcফাইল:

if($?prompt) then               # Only interactive shells set $prompt
    ...
endif

বিশেষত এর জন্য tcsh, ভেরিয়েবলটি loginshলগইন শেলের জন্য সেট করা থাকে:

if($?loginsh) then              # A login shell..
    ...
endif

( tcshএছাড়াও একটি ভেরিয়েবল রয়েছে shlvlযা নেস্টেড শেলগুলির সংখ্যায় সেট করা আছে, যেখানে লগইন শেলটির মান 1 থাকে)


2
PS1একটি ইন্টারেক্টিভ শেল পরীক্ষা করার জন্য কাজ করে না। এটি প্রায়শই একটি ইন্টারেক্টিভতে সেট করা থাকে তবে আপনি এটি আনসেট করতে পারেন। এটা খুবই সঙ্গে প্রায়শই কারণ অনেক সিস্টেম জাহাজ, একটি নন-ইন্টারেক্টিভ শেল মধ্যে সেট এর export PSমধ্যে /etc/profile
গিলস

@ গিলিস সংশোধন এবং সম্পাদনার জন্য আপনাকে ধন্যবাদ
অ্যান্ড্রু স্টেইন

17

অন্য উপায় এর ফলাফল চেক করা হয় tty

if [ "`tty`" != "not a tty" ]; then

10
... বা [ -t 0 ]STDIN টিটিটি হলে পরীক্ষার জন্য ব্যবহার করুন । আপনি আপনার প্রয়োজনের উপর নির্ভর করে 1 (STDOUT) বা 2 (STDERR) ব্যবহার করতে পারেন।
ডার্বোবার্ট

@ আডারোবার্ট - আমাকে নতুন কিছু দেখানোর জন্য ধন্যবাদ
অ্যাড্রিয়ান কর্নিশ

10
এটি একটি ভিন্ন পরীক্ষা is একটি নন-ইন্টারেক্টিভ শেল থাকতে পারে যার ইনপুটটি টার্মিনাল (যে কোনও সময় আপনি টার্মিনালে স্ক্রিপ্টটি চালান!), এবং টার্মিনাল থেকে নয় একটি ইন্টারেক্টিভ শেল ইনপুট নেওয়া সম্ভব (যদিও বিরল)।
গিলস

@ গিলস যদি শেলটি ইন্টারেক্টিভ হয় এবং একটি শিশু disownএবং জীবিতকে বন্ধ ttyকরে দেয় তবে এটি আর ইন্টারেক্টিভ নয়, যদিও $-পরিবর্তিত হয়নি তা জানার জন্য সেরা চেষ্টা করেছিলেন ; আমি এখনও অবাক হয়েছি সর্বোত্তম পদ্ধতির কী।
অ্যাকোরিয়াস পাওয়ার

5
@ অ্যাকোয়ারিয়াসপাওয়ার তারপরে আপনি যা যা পরীক্ষা করতে চান তা কোনও ইন্টারেক্টিভ শেলের জন্য নয়, তবে স্ট্যান্ডার্ড ইনপুটটি টার্মিনাল কিনা। ব্যবহার [ -t 0 ]। পিএস আমার আগের মন্তব্যে, আমি লিখেছিলাম যে "একটি দৃ corre় সম্পর্ক আছে" - আমি ভুলে গিয়েছিলাম "কোনও স্ক্রিপ্টের সাথে শুরু হওয়া #!/bin/shবা এর মতো চূড়ান্ত সাধারণ ঘটনাটি বাদ দিয়ে ", যা অ-ইন্টারেক্টিভ তবে টার্মিনালের সাথে সংযুক্ত হতে পারে।
গিলস

8

আপনি টার্মিনালে আছেন কিনা তা পরীক্ষা করার জন্য ইউনিক্স / লিনাক্সের একটি কমান্ড রয়েছে।

if tty -s
then
echo Terminal
else
echo Not on a terminal
fi

1
dashএটিও কাজ করে ।
কেন শার্প

7

স্টিডিনটি টার্মিনাল কিনা তা পরীক্ষা করে দেখতে পারেন:

if [ -t 0 ]
then
    echo "Hit enter"
    read ans
fi

3

কোনও স্ক্রিপ্টটি ইন্টারেক্টিভ বা অ-ইন্টারেক্টিভ শেলটিতে চলছে কিনা তা পরীক্ষা করতে, আমি আমার স্ক্রিপ্টগুলিতে $PS1ভেরিয়েবলটিতে সঞ্চিত প্রম্পটের উপস্থিতি পরীক্ষা করে দেখি :

if [ -z $PS1 ] # no prompt?
### if [ -v PS1 ]   # On Bash 4.2+ ...
then
  # non-interactive
  ...
else
  # interactive
  ...
fi

এটি আমি এখানে শিখেছি: https://www.tldp.org/LDP/abs/html/intandnonint.html


1

iসন্ধান করার জন্য সঠিক বিকল্প নয়। -iঅন্যথায় অ-ইন্টারেক্টিভ শেলকে ইন্টারেক্টিভ হওয়ার জন্য জোর করা। সঠিক স্বয়ংক্রিয়-সক্ষম বিকল্পটি -s, তবে দুর্ভাগ্যক্রমে বাশ এটিকে সঠিকভাবে পরিচালনা করে না।

আপনি কিনা চেক করতে হবে $-ধারণ করে sঅথবা এটা রয়েছে (এই স্বয়ংক্রিয় সক্রিয় করা মঞ্জুর করা হয়) i(এই স্বয়ংক্রিয় সক্রিয় কিন্তু আনুষ্ঠানিকভাবে কেবল মিলিত হতে মঞ্জুর করা হয় না -iশেলের কমান্ড লাইন বিকল্প)।


1
sশেলটি স্টিডিনের কমান্ডগুলি পড়লে তা হবে, এটি ইন্টারেক্টিভ কিনা। একটি ইন্টারেক্টিভ শেল অগত্যা zsh -i < /dev/nullস্টিডিনের আদেশগুলি পড়তে পারে না (চেষ্টা করুন , যদিও zsh এখানে ব্যতিক্রম বলে মনে হচ্ছে)। এবং একটি শেল স্টিডিনের আদেশগুলি পড়তে পারে এবং ইন্টারেক্টিভ (যেমন sh < fileবা echo 'echo "$1"' | sh -s foo bar) নাও হতে পারে ।
স্টাফেন চেজেলাস

2
আমি যে বিষয়টি উল্লেখ করতে চেয়েছিলাম তা হ'ল আসল বোর্ন শেলের in-তে 'i' থাকে না, এমনকি এটি ইন্টারেক্টিভ হওয়ার উদ্দেশ্যেও হয়।
স্কিলি

ঠিক আছে, তবে ইউ ও এল-তে, "শেল" আধুনিক শেলগুলি বোঝায় । বোর্ন শেলটি সাধারণত একটি বিশ্বাসযোগ্য হিসাবে বিবেচিত হয় এবং আপনার নিজস্ব রূপটি মূল প্রবাহের পক্ষে পর্যাপ্ত নয় যে আপনি কী সম্পর্কে কথা বলছেন তা যদি আপনি এটি স্পষ্ট না করেন তবে লোকেদের কী তা জানতে পারে expect প্রশ্নটি উল্লেখ করেছে [[...]]যা ksh / bash / zsh বোঝায়। আপনি একটি যেমন একটি পয়েন্ট পেয়েছেন ইতিহাস নোট যে জন্য চেক iমধ্যে $-বোর্ন শেল কাজ করবে না। তবে তারপরে চেক করা sসেখানে নির্ভরযোগ্যভাবে কাজ করবে না। আপনি এটি পরীক্ষা করতে চান [ -t 0 ]বা i; তারপরেও এটিকে কোণঠাসা মামলায় বোকা বানানো হবেecho 'exec < /dev/tty; that-check' | sh'
স্টাফেন চেজেলাস

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

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