একটি ইন্টারেক্টিভ শেল কি অ-ইন্টারেক্টিভ বা তদ্বিপরীত হয়ে উঠতে পারে?
দ্রষ্টব্য: আমি "ইন্টারেক্টিভ এবং অ-ইন্টারেক্টিভের মধ্যে পার্থক্য কী?" বেসিক প্রশ্নটি সম্পর্কে অনেক গবেষণা করেছি এবং আমার গবেষণার ফলাফলগুলি আমাকে এই প্রশ্ন জিজ্ঞাসা করতে পরিচালিত করেছিল ।
এই প্রশ্নের অংশটির একটি দীর্ঘ প্রস্তাব রয়েছে কারণ এটি "ক্রিয়াশীল" এর উত্তর দেওয়ার জন্য আমরা কোন ধরণের সংজ্ঞা ব্যবহার করি তা অত্যন্ত গুরুত্বপূর্ণ । একটি সংজ্ঞা একটি নির্দিষ্ট সেট জন্য একটি নির্বিচার লেবেল হতে পারে; এটি বিভিন্ন বৈশিষ্ট্যের বর্ণনামূলক হতে পারে; অথবা এটি আপনাকে এমন তথ্য দিতে পারে যা আপনি ব্যবহারের পূর্বাভাস এবং উদ্দেশ্য বোঝার জন্য ব্যবহার করতে পারেন । এই শেষ প্রকারটি আমরা একটি "অ্যাকশন সংজ্ঞা" বা একটি "গতিশীল সংজ্ঞা" বলতে পারি এবং এটি সর্বাধিক দরকারী।
ইন man 1p sh
, একটি ইন্টারেক্টিভ শেলের নিম্নলিখিত সংজ্ঞা দেওয়া হয়:
If the -i option is present, or if there are no operands and the shell’s 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}
একটি আনসেট প্যারামিটার ব্যবহার করে অনুরূপ একটি পরীক্ষা অনুরূপ ফলাফল উত্পন্ন করে, আবার নিশ্চিত করে যে $-
শেল ইন্টারেক্টিভিজির জন্য "সত্যের উত্স" নয়।
সুতরাং, অবশেষে, কোথায় একটি শেলটির চূড়ান্ত 'আন্তঃসংযোগ' বৈশিষ্ট্য সংরক্ষণ করা হয়?
এবং, একটি ইন্টারেক্টিভ শেল অ-ইন্টারেক্টিভ বা তদ্বিপরীত হয়ে উঠতে পারে? (... এই বৈশিষ্ট্য পরিবর্তন করে?)