একটি ইন্টারেক্টিভ শেল কি অ-ইন্টারেক্টিভ বা তদ্বিপরীত হয়ে উঠতে পারে?


16

একটি ইন্টারেক্টিভ শেল কি অ-ইন্টারেক্টিভ বা তদ্বিপরীত হয়ে উঠতে পারে?

দ্রষ্টব্য: আমি "ইন্টারেক্টিভ এবং অ-ইন্টারেক্টিভের মধ্যে পার্থক্য কী?" বেসিক প্রশ্নটি সম্পর্কে অনেক গবেষণা করেছি এবং আমার গবেষণার ফলাফলগুলি আমাকে এই প্রশ্ন জিজ্ঞাসা করতে পরিচালিত করেছিল ।

এই প্রশ্নের অংশটির একটি দীর্ঘ প্রস্তাব রয়েছে কারণ এটি "ক্রিয়াশীল" এর উত্তর দেওয়ার জন্য আমরা কোন ধরণের সংজ্ঞা ব্যবহার করি তা অত্যন্ত গুরুত্বপূর্ণ । একটি সংজ্ঞা একটি নির্দিষ্ট সেট জন্য একটি নির্বিচার লেবেল হতে পারে; এটি বিভিন্ন বৈশিষ্ট্যের বর্ণনামূলক হতে পারে; অথবা এটি আপনাকে এমন তথ্য দিতে পারে যা আপনি ব্যবহারের পূর্বাভাস এবং উদ্দেশ্য বোঝার জন্য ব্যবহার করতে পারেন এই শেষ প্রকারটি আমরা একটি "অ্যাকশন সংজ্ঞা" বা একটি "গতিশীল সংজ্ঞা" বলতে পারি এবং এটি সর্বাধিক দরকারী।


ইন man 1p sh, একটি ইন্টারেক্টিভ শেলের নিম্নলিখিত সংজ্ঞা দেওয়া হয়:

   If the -i option is present, or  if  there  are  no  operands  and  the
   shells  standard  input and standard error are attached to a terminal,
   the shell is considered to be interactive.

"-I বিকল্প" এবং শব্দ ব্যবহারের "operands," স্মরণ থেকে এই একটি শেল এর উল্লেখ করা হয় আবাহন, না চারিত্রিক বৈশিষ্ট্য আছে যেগুলো একটি চলমান শেল মধ্যে পরীক্ষা করা যেতে পারে।

বাশ ম্যান পেজটি এটিকে কিছুটা আলাদাভাবে বলে:

   An interactive shell is one started without  non-option  arguments  and
   without the -c option whose standard input and error are both connected
   to terminals (as determined by isatty(3)), or one started with  the  -i
   option.   PS1 is set and $- includes i if bash is interactive, allowing
   a shell script or a startup file to test this state.

প্রথম বাক্যে সংজ্ঞা আবার শুধুমাত্র বোঝায় শুরুর একটি শেলের।

দ্বিতীয় বাক্যটি (আমার পড়াতে) শর্তগুলি নির্দিষ্ট করে যে শেলটি নির্দিষ্ট উপায়ে যে এটি "ইন্টারেক্টিভ" হিসাবে সংজ্ঞায়িত করা হয়েছিল তা শুরু হয়েছিল কিনা তা প্রমাণের জন্য প্রক্সি হিসাবে ব্যবহৃত হয় ।

নোট করুন যে আমি এই বাক্যটির ব্যাখ্যা করি না : "ব্যাশ শেল ইন্টারেক্টিভ হয় যদি এবং কেবল $-'i' অন্তর্ভুক্ত থাকে তবে "। $-মনে হচ্ছে এটি কেবল একটি কার্যকর সূচক, ইন্টারেক্টিভের সংজ্ঞা নয় । এটি আমার প্রশ্নের সাথে অত্যন্ত প্রাসঙ্গিক।


এই দুটি (পসিএক্স shসংজ্ঞা এবং বাশের) হ'ল যান্ত্রিক সংজ্ঞা যা আপনার পরিস্থিতিতে শুরু করা শেলটির জন্য লেবেল "ইন্টারেক্টিভ" প্রযোজ্য তা কোন পরিস্থিতিতে বলে। তারা অ্যাকশন সংজ্ঞা নয় কারণ তারা এই লেবেলের কোনও প্রভাব দেয় না ।

তবে, আমি দেখতে পাচ্ছি যে বাশ ম্যান পৃষ্ঠাটির বাকী অংশটি শেল সম্পর্কে নির্দিষ্টভাবে "এটি যদি একটি ইন্টারেক্টিভ শেল না হয়" বা "কেবলমাত্র ইন্টারেক্টিভ শেলগুলিতে, বা _____ বিকল্প সেট করা থাকে তবে সেগুলি ব্যবহার করে to" (অসংখ্য উদাহরণ রয়েছে এবং এটি এই প্রশ্নের মূল বিষয় নয়))

সুতরাং আমি মেনে নেব যে "ইন্টারেক্টিভ" হ'ল ম্যান পৃষ্ঠার বাকী অংশে বর্ণিত ডিফল্ট "ইন্টারেক্টিভ" আচরণ (বিকল্প সেটিংস) সংগ্রহের জন্য একটি সুবিধাজনক লেবেল। এটি নিজের মধ্যে কোনও মৌলিক শব্দ বা বস্তু নয়; শেলের উত্স কোডের বাইরে এর কোনও অনুমোদনমূলক সংজ্ঞা নেই। (উদাহরণস্বরূপ, "ওপেন ফাইল ডেস্ক্রিপ্টর" বা "থামানো প্রক্রিয়া" শর্তাবলী পৃথক নয় যা কার্নেলের নিজেই ডিজাইনের অন্তর্নির্মিত বিমূর্ততাগুলিকে বোঝায়))

(যদিও এটি পসিক্স সংজ্ঞায়ও সংজ্ঞায়িত হয়েছে sh, সেই ম্যান পেজ [ man 1p sh] "শেলটি ইন্টারেক্টিভ না হলে" এবং এর চেয়ে অনুরূপ বক্তব্যগুলির খুব কম ব্যবহার man bashরয়েছে, এবং প্রায় স্বতন্ত্রভাবে প্রার্থনার সময় পার্থক্যগুলিতে মনোনিবেশ করে, তাই আমি বাশকে ফোকাস করব) এই মুহুর্ত থেকে।)


শেলটির "ইন্টারেক্টিভ" হওয়ার কিছু বিষয়গুলি কেবলমাত্র অনুরোধের সময় প্রাসঙ্গিকভাবেই হয় , যেমন শেল দ্বারা অন্যান্য কমান্ডগুলি পড়ার আগে কোন ফাইলগুলি সোর্স করা হয়। যাইহোক, হয় প্রভাব (অন্তত ব্যাশ মধ্যে) যে কোনো সময়ে প্রাসঙ্গিক। এভাবে বলতে একটি উপায়, কোনো দেওয়া হতে হবে চলমান শেল কিনা এটা ইন্টারঅ্যাকটিভ বা না।

চলমান set +iএকটি ইন্টারেক্টিভ ব্যাশ শেল মধ্যে ঘটায় 'আমি' বিষয়বস্তু থেকে অপসারণ করা হবে $-

প্রশ্নটি হল: এর অর্থ কি শেলটি আর ইন্টারেক্টিভ নয়?

বাশের সঠিক সংজ্ঞা অনুসারে, এটি হওয়া উচিত নয়, কারণ সংজ্ঞার কোথাও এটির প্রয়োজন নেই যে 'আমি' উপস্থিত থাকতে হবে $-:

   An interactive shell is one started without  non-option  arguments  and
   without the -c option whose standard input and error are both connected
   to terminals (as determined by isatty(3)), or one started with  the  -i
   option.

সঠিক সংজ্ঞাটির একটি কঠোর পাঠ্যও প্রশ্ন উত্থাপন করে: যদি ইন্টারেক্টিভ টার্মিনালের স্টিডিন বা স্ট্ডার পুনঃনির্দেশিত হয় তবে তারা আর টার্মিনালের সাথে সংযুক্ত থাকে না, শেলটি কি অ-ইন্টারেক্টিভ হয়ে যায়?

( মনে হচ্ছে এটির উত্তরটি "না" এবং ম্যান পেজে এই সংশোধকটিকে অন্তর্ভুক্ত করা যেতে পারে: "যার স্ট্যান্ডার্ড ইনপুট এবং ত্রুটি উভয়ই টার্মিনালের সাথে সংযুক্ত ... অনুরোধের সময়, " তবে আমি জানি না নিশ্চিতভাবেই।)


উত্তর করেন তাহলে, "না, একটি শেল না নন-ইন্টারেক্টিভ হতে পারে, কিংবা তদ্বিপরীত," তাহলে কি নির্ধারক যদি শেল ইন্টারঅ্যাকটিভ নির্ধারণ উপায়?

আরও একটি উপায় রাখুন: যদি "ইন্টারেক্টিভ শেল" এর আচরণগুলি পরে অব্যাহত থাকে set +i, তবে এই আচরণগুলি প্রয়োগ করা অব্যাহত রাখা উচিত তা নির্ধারণ করার জন্য কী ব্যবহার করা হয়?


পাছে কেউ এটা সন্দেহ আছে: হয় একটি শেলের আচরণে যার পরে জিদ প্রার্থনা ইন্টারেক্টিভ set +iএবং শেলের আচরণে অ ইন্টারেক্টিভ যার পরে জিদ প্রার্থনা set -i। উদাহরণস্বরূপ, নীচের অংশগুলি বিবেচনা করুন man bash:

COMMENTS
   In a non-interactive shell, or an interactive shell in which the inter-
   active_comments  option  to  the  shopt  builtin  is enabled (see SHELL
   BUILTIN COMMANDS below), a word beginning with # causes that  word  and
   all  remaining  characters  on that line to be ignored.  An interactive
   shell without the interactive_comments option enabled  does  not  allow
   comments.  The interactive_comments option is on by default in interac-
   tive shells.

সুতরাং interactive_commentsবিকল্পটি আনসেট করে আমরা ইন্টারেক্টিভ এবং অ-ইন্টারেক্টিভ শেলের মধ্যে একটি পার্থক্য দেখতে পাচ্ছি। এই পার্থক্যের অধ্যবসায় নিম্নলিখিত স্ক্রিপ্ট দ্বারা প্রদর্শিত হয়:

#!/bin/bash

# When the testfile is run interactively,
# all three comments will produce an error
# (even the third where 'i' is not in '$-').
# When run noninteractively, NO comment will
# produce an error, though the second comment
# is run while 'i' IS in '$-'.

cat >testfile <<'EOF'
shopt interactive_comments
shopt -u interactive_comments
shopt interactive_comments
echo $-
#first test comment
set -i
echo $-
#second test comment
set +i
echo $-
#third test comment
EOF

echo 'running bash -i <testfile'
bash -i <testfile
echo 'running bash <testfile'
bash <testfile

এটি নিশ্চিত করে যে "ইন্টারেক্টিভ" এবং "এর iমান $-" এর সমতুল্য নয়

${parameter:?word}একটি আনসেট প্যারামিটার ব্যবহার করে অনুরূপ একটি পরীক্ষা অনুরূপ ফলাফল উত্পন্ন করে, আবার নিশ্চিত করে যে $-শেল ইন্টারেক্টিভিজির জন্য "সত্যের উত্স" নয়।


সুতরাং, অবশেষে, কোথায় একটি শেলটির চূড়ান্ত 'আন্তঃসংযোগ' বৈশিষ্ট্য সংরক্ষণ করা হয়?

এবং, একটি ইন্টারেক্টিভ শেল অ-ইন্টারেক্টিভ বা তদ্বিপরীত হয়ে উঠতে পারে? (... এই বৈশিষ্ট্য পরিবর্তন করে?)


উত্তর:


9

আমি যে প্রশ্নটি করব তা হ'ল কেউ কেন এটি করতে চাইবে?

ইন্টারেক্টিভ শেলগুলির কিছু দিক আপনি যেমন অক্ষম করতে পারেন:

  • PS1= PS2= প্রম্পটগুলি অক্ষম করতে
  • set +m কাজের নিয়ন্ত্রণ অক্ষম করতে
  • কিছু শাঁসে ইতিহাস অক্ষম করুন
  • আপনি এতে zleএবং সমস্ত সমাপ্তির মডিউলগুলি আনলোড করতে সক্ষম হতে পারেন zsh

তবে আপনি যদি শেলটি ইন্টারেক্টিভ হওয়া বন্ধ করতে চান তবে আপনি এর পরিবর্তে এটি করতে পারেন:

. /some/file; exit

এটি থেকে বাকি কমান্ডগুলি পেতে বলার জন্য /some/file( /dev/ttyটিটি ডিভাইস থেকে এখনও কমান্ডগুলি পড়তে চাইলে প্রতিস্থাপন করুন ), যদিও অ-ইন্টারেক্টিভ শেল থেকে কিছু পার্থক্য থাকতে পারে যেমন আচরণের returnবা বাস্তবতার জন্য এটি এখনও কাজের নিয়ন্ত্রণ করতে পারে বা:

exec myshell /dev/tty

আপনার বর্তমান ইন্টারেক্টিভ শেলটিকে একটি অ-ইন্টারেক্টিভ একের সাথে প্রতিস্থাপন করতে যা এখনও টিটিআই ডিভাইস থেকে আদেশগুলি পড়ে।

নোট করুন যে ব্যাশ ৪.৪ set +iসহ bash: set: +i: invalid optionঅন্যান্য বেশিরভাগ শাঁসের মতো ফিরে আসে ।


একেবারে সম্মত হয়ে গেলে এটি করা একটি হাস্যকর জিনিস হবে। আমি যেমন উল্লেখ করেছি, "ইন্টারেক্টিভ" সম্পর্কে আমার ধারণাটি হ'ল এটি কেবলমাত্র পূর্বনির্ধারিত আচরণগুলির একটি সংগ্রহ যা আপনি যখন নিজের শেলটির সাথে ইন্টারঅ্যাক্ট করার সময় দরকারী । আপনি যদি সেই আচরণগুলির প্রতিটি পৃথকভাবে পরিবর্তন করতে পারেন এবং আপনি প্রতিটি পরিবর্তন করেন তবে প্রশ্ন "এটি কি এখনও একটি ইন্টারেক্টিভ শেল?" এটি কেবল হাস্যকর শব্দার্থক; এটি এমনকি একটি গুরুত্বপূর্ণ প্রশ্ন নয়। যাইহোক ....
ওয়াইল্ডকার্ড

1
@ উইল্ডকার্ড, আপনি exec < <(sleep infinity)যদি একটি ইন্টারেক্টিভ শেলটি করেন, আপনি একটি ইন্টারেক্টিভ শেল পেয়েছেন যা খুব ইন্টারেক্টিভ নয়। শেলটি এখনও এটিকে নিজের মধ্যে ইন্টারেক্টিভ বিবেচনা করবে যা $-এতে এখনও থাকবে iতবে আপনি তা নাও পারেন। আমি নিশ্চিত নই যে এ সম্পর্কে আরও অনেক আলোচনা করার আছে।
স্টাফেন চেজেলাস

2
@ উইল্ডকার্ড, শেলটি যদি এমনভাবে শুরু করা হত তবে interactiveএটি এখনও অবধি আছে। set +iআপনি পুরানো বাশ সংস্করণগুলিতে করতে পারার বিষয়টি একটি বাগ ছিল।
স্টাফেন চেজেলাস 23'17

1
@ উইল্ডকার্ড, যদি আপনি এর উত্স কোডটি দেখুন bash, আপনি সম্ভবত খুঁজে পাবেন যে একটি interactiveবৈশ্বিক বুলিয়ান পরিবর্তনশীল আছে যা iপতাকাটিতে মানচিত্র করে $-। সেই বুলিয়ান পরিবর্তন করলে ইন্টারেক্টিভ শেলগুলির সমস্ত আচরণ স্বয়ংক্রিয়ভাবে পরিবর্তন হবে না। ইন্টারেক্টিভ থেকে অ-ইন্টারেক্টিভ থেকে পরিবর্তন সমর্থিত নয়।
স্টাফেন চেজেলাস

4
@ উইল্ডকার্ড ড্যাশ প্রম্পটটি গ্রহণ করে set +iএবং থামায়। এটি এমন কিছু যা ব্যবহারকারীর করার কথা ছিল না, তাই অবাক হওয়ার কিছু নেই যে আচরণটি শেলের উপর নির্ভর করে এবং প্রায়শই শেল প্রয়োগকারী দ্বারা ইচ্ছাকৃত সিদ্ধান্তের পরিবর্তে দুর্ঘটনাক্রমে ঘটে।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.