ইন্টারেক্টিভ মোডে কোনও শেল চালু থাকলে আমি কীভাবে ব্যাশ পরীক্ষা করতে পারি?


45

আমি কীভাবে বলতে পারি (ইন ~/.bashrc) যদি আমি ইন্টারেক্টিভ মোডে চলছি, বা বলি, ssh উপর একটি কমান্ড চালাচ্ছি। আমি .bashrcযদি এএনএসআই অব্যাহতি সিকোয়েন্সগুলি পরে থাকে তবে মুদ্রণ এড়াতে চাই ।


এস্কেপ সিকোয়েন্সগুলি প্রিন্ট করতে হবে বা না তা চয়ন করা $ TERM মানের উপর ভিত্তি করে শেলের ইন্টারেক্টিভিটিভুক্ত না হওয়া ভাল। ভেরিয়েবল ক্লায়েন্ট টার্মিনালের ক্ষমতাগুলি চিহ্নিত করে যা সেই অংশ যা পালানোর ক্রমের ব্যাখ্যা করে।
ইয়ার্ক

উত্তর:


52

মতে man bash:

পিএস 1 সেট করা হয়েছে এবং i - এতে বাশ ইন্টারেক্টিভ থাকলে আমি শেল স্ক্রিপ্ট বা একটি স্টার্টআপ ফাইলকে এই অবস্থার পরীক্ষা করার অনুমতি দেয় includes

সুতরাং আপনি ব্যবহার করতে পারেন:

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

এছাড়াও:

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

সুতরাং ~/.bashrcশুধুমাত্র ইন্টারেক্টিভ শেল জন্য উত্সাহিত হয়। কখনও কখনও লোকেরা এটিকে উত্স থেকে থাকে ~/.bash_profileবা ~/.profileযা ভুল তা প্রত্যাশিত আচরণে হস্তক্ষেপ করে। আপনি যদি প্রচলিত কোডটির রক্ষণাবেক্ষণকে সহজ করতে চান তবে সাধারণ কোডটি ধারণ করতে আপনার একটি পৃথক ফাইল ব্যবহার করা উচিত এবং উভয় আরসি ফাইল থেকে এটি স্বাধীনভাবে উত্স করা উচিত।

লগইন rcফাইলগুলি যেমন স্ট্যান্ডআউট করার মতো কোনও আউটপুট না পাওয়া ~/.bash_profileবা উদাহরণস্বরূপ ~/.profileএটির যথাযথ ক্রিয়ায় হস্তক্ষেপ করতে পারে তবে সেরা rsync

যে কোনও ক্ষেত্রে, ভুল কনফিগারেশন উপস্থিত থাকতে পারে বলে ইন্টারঅ্যাক্টিভিটির জন্য পরীক্ষা করা এখনও ভাল ধারণা।


7
নোট করুন যে $ - এ একটি আই থাকতে পারে , অগত্যা এটির সমান হবে না। আমি ব্যবহার করি[[ $- =~ i ]] && echo interactive
অ্যালেক্স হাওয়ানস্কি

1
@ অ্যালেক্সহাউয়ানস্কি: সমতা পরীক্ষার নক্ষত্রগুলি এটি ধারণের জন্য একটি পরীক্ষা করে তোলেi
ডেনিস উইলিয়ামসন

ওহ ওয়াও সেগুলি লক্ষ্য করেনি, তারা আমার মনিটরে ডাবল উক্তিগুলির মতো দেখাচ্ছে। ফন্টের আকার আপ করার সময় হতে পারে। <বুড়ো হওয়া>
অ্যালেক্স হাওয়ানস্কি

কখনও কখনও লোকেরা এটিকে উত্স থেকে থাকে ~/.bash_profileবা ~/.profileযা ভুল তা প্রত্যাশিত আচরণের সাথে হস্তক্ষেপ করে । আপনি কি ~/.bashrcথেকে সোর্সিং মনে করেন ~/.bash_login? লগইন শেলটি ইন্টারেক্টিভ হওয়ার দরকার নেই বলে আমার ধারণা এটিও ভুল rect
পাইওটর ডব্রোগোস্ট

1
@ পাইওটারডব্রোগস্ট: এটি শেল স্টার্টআপ ফাইলগুলির একটি দুর্দান্ত আলোচনা
ডেনিস উইলিয়ামসন

12

ব্যবহার করুন:

if tty -s; then echo interactive; fi

কাজ করছে বলে মনে হচ্ছে না
স্টিভেন শ

এটি আমার পক্ষে কাজ করবে বলে মনে হয় না, আমি মনে করি এটিই সঠিক উত্তর: stackoverflow.com/a/49064632/1223975
আলেকজান্ডার মিলস

এটি স্ট্যান্ডার্ড ইনপুটটিতে টিটিওয়াইয়ের উপস্থিতির জন্য পরীক্ষা করে; যদিও এটি সম্পর্কিত হতে পারে তবে এটি শেলের ইন্টারেক্টিভ মোডের মতো নয়, যা শেলের "-i" পতাকা দ্বারা নির্দেশিত।
ইয়ার্ক

কাজ করে না। কেন মানুষ উপবিষ্ট?

11

testসরঞ্জাম (মানুষ পাতা থেকে) এই জন্য চেক করতে পারেন:

 -t FD          True if FD is opened on a terminal.

সুতরাং আপনি উদাহরণস্বরূপ ব্যবহার করতে পারেন:

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi

অথবা

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi

খোলসের মধ্যে দুর্দান্ত এবং মনে হচ্ছে বহনযোগ্য। টেস্ট এটি bash <<< 'test -t 0 && echo Y || echo X'লিখেছেন Y, bash -c 'test -t 0 && echo Y || echo X'লিখেছেনX
kyb

1
এটিও যাচাই করে যে স্ট্যান্ডার্ড ইনপুটটি একটি টিটিওয়াই; যদিও এটি সম্পর্কিত হতে পারে তবে এটি শেলের ইন্টারেক্টিভ মোডের মতো নয়, যা শেলের "-i" পতাকা দ্বারা অনুরোধ করা এবং নির্দেশিত।
ইয়ার্ক

6

আমি সাধারণত প্রোগ্রাম tty আউটপুট তাকান।

আপনি যদি টিটিটিতে থাকেন তবে এটি আপনাকে বলবে যে আপনি কোন টিটিতে আছেন। আপনি যদি ইন্টারেক্টিভ মোডে না থাকেন তবে এটি সাধারণত আপনাকে "টিটিটি নয়" বলে কিছু বলবে।


3
টিটিএস-এস 0 এর একটি রিটার্ন মান সেট করে যদি আপনি কোনও টার্মিনালে থাকেন বা অন্যথায় আপনাকে আউটপুট না দিয়ে দেয়। আপনি এটি 'যদি tty -s হিসাবে ব্যবহার করতে পারেন; তারপরে _অনেকটিভ; ফাই '
বিল টোর

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