বাশ স্ক্রিপ্টে এক্স সেশন সনাক্ত করা হচ্ছে (.bashrc ইত্যাদি)


16

সম্প্রতি আমি xset b offআমার .Bashrc এ রেখেছি। আমি যখন tty বা ssh এর মাধ্যমে লগ ইন করি অর্থাৎ এক্স সেশনের বাইরে লগ ইন করি তখন ত্রুটিটি পপ আপ হওয়ার কারণে আমি বিরক্ত হয়েছি।

আমার মনে যে প্রথম জিনিসটি এসেছিল তা হ'ল [[ -z "$SOME_VAR" ]] && xset b off(ভালভাবে, দেখা যাচ্ছে যে পরীক্ষার ভেরিয়েবল সেট করা বনাম খালি থাকা আলাদা প্রশ্ন)। তবে কোন SOME_VAR সঠিক?

setএক্সটিতে setকোন ভেরিয়েবল সেট করা আছে এবং টিটিটিতে অনুপস্থিত রয়েছে তা দেখতে আমি টিটিটির আউটপুট এবং urxvt এর আউটপুটকে পৃথক করেছিলাম । যেমনটি প্রত্যাশা করা হয়েছিল, সেখানে অনেকগুলি পার্থক্য রয়েছে (কেবলমাত্র আমার সাথে প্রাসঙ্গিক বলে মনে হচ্ছে কেবল তাদের তালিকাভুক্ত করা):

  • DESKTOP_SESSION
  • DISPLAY
  • GDMSESSION
  • SESSION_MANAGER
  • WINDOWID
  • WINDOWPATH
  • XAUTHORITY
  • XDG_SESSION_COOKIE
  • XDG_CONFIG_DIRS
  • XDG_DATA_DIRS
  • XDG_MENU_PREFIX

আমি এক্স সেশনে আছি কি না তা সনাক্ত করার জন্য কোনটি সবচেয়ে সঠিক এবং সর্বজনীন পরীক্ষা করার জন্য? এমন কিছু যা সম্ভব হিসাবে অনেক ডিস্ট্রো এবং প্ল্যাটফর্ম এবং ডেস্কটপ পরিবেশে কাজ করবে?

বা পরিবেশের ভেরিয়েবল পরীক্ষা করার চেয়ে আরও ভাল উপায় আছে কি?

উত্তর:


8

একটি সহজ এবং পরীক্ষা কার্যকর উপায় যে আপনার প্রদর্শন সার্ভার উপলব্ধ এবং বৈধ সঙ্গে এটি পরীক্ষা করা হয় xhost। আপনি সর্বদা DISPLAYভেরিয়েবলের কোনও মান পরীক্ষা করার উপর নির্ভর করতে পারবেন না কারণ এটি কোনও অবৈধ মান দিয়ে সেট করা যেতে পারে।

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi

আমি এটি করার কারণটি হ'ল কারণ আমি আমার ব্যবহারকারীর বেশ কয়েকটি স্ক্রিপ্টগুলি চালিত করি crontabযা উপস্থিত থাকাকালীন ডিসপ্লেতে পরিচালনা করে, তবে যখন না হয় তখন ভিন্নভাবে কাজ করি। আমার শীর্ষে crontab, আমি DISPLAYভেরিয়েবলটি সেট করেছিলাম :0যদিও এটি এখনও বিদ্যমান নেই। এর crontabসাথে শুরু হওয়া স্ক্রিপ্টগুলি @rebootআপনার প্রদর্শন আছে কিনা তা বিবেচনা ছাড়াই শুরু হবে। আপনার প্রদর্শনটি একই স্ক্রিপ্টের মধ্যে চলে আসে এবং এটি আপনাকে গতিশীলভাবে সনাক্ত করতে দেয়।

দ্রষ্টব্য: >&একমাত্র bash> = 4 এ কাজ করে Otherwise অন্যথায় ব্যবহার করুন> /dev/null 2>&1


ভাল, সঙ্গে পরীক্ষাও ssh -X; ঠিকভাবে কাজ করে!
আলয়েস মাহদল

13

আমি মনে করি চেকিং DISPLAYসেরা পদ্ধতির হবে।

  • এটি দূরবর্তী লগইনগুলি পরিচালনা করে (উদাঃ ssh -X)।
  • এটি বেশিরভাগ ক্ষেত্রে - সমস্ত না থাকলে - প্ল্যাটফর্মগুলিতে উপলব্ধ।
  • এটি উইন্ডো ম্যানেজার / ডিইই থেকে স্বতন্ত্র।

2
আমি DISPLAYসাধারণভাবে ত্রুটি বার্তাটিও দমন করতে পারি বা কেবল দমন করতাম । /dev/nullসময়ে সময়ে কিছু ভালবাসা দিন ।
frostschutz

3
@ ফ্রস্টসচুটজ না, আমি স্ক্রিপ্টের কেবলমাত্র প্রাসঙ্গিক অংশ চালানোর চেষ্টা করছি। ত্রুটি বার্তাগুলিকে দমন করা সেই দিক থেকে কোনও পদক্ষেপ নেয় না। প্রকৃতপক্ষে, এটি সম্ভাব্যভাবে ভেঙে যেতে পারে এমন অন্যান্য জিনিসগুলির সমস্যা সমাধানের ক্ষেত্রে মারাত্মক বিভ্রান্তির সৃষ্টি করতে পারে।
আলয়েস মাহডাল

1
আমি উত্তরের খুব শীঘ্রই এই পদ্ধতির ব্যবহার শুরু করেছি, এবং এটি sshএখন পর্যন্ত সহজ সরল সাথে পুরোপুরি কাজ করেছে , যখন আমি করতে শুরু করেছি ssh -X--- যখন ভিএম ওভার এসএসএস ব্যবহার করতে সক্ষম হব যাতে ভিজ্যুয়াল মোড দ্বারা নির্বাচিত সামগ্রীটি স্থানীয় এক্স ক্লিপবোর্ডে যায়, যার জন্য আপনার সার্ভার সাইডে এক্সসার্ভার লাগবে না । তাই এক্সপ্লোরার এবং এক্সসেট উপস্থিত না থাকলেও DISPLAY কেবল ফরওয়ার্ডিং সক্ষম করার কার্যকরভাবে সেট হয়ে যায়।
অ্যালোস মাহডাল


1
আপনার DISPLAYভেরিয়েবল এমন একটি ডিসপ্লেতে ইঙ্গিত করতে পারে যা আসলে কোনও এক্স সার্ভার চালু না করে (উদাহরণস্বরূপ যখন এটি কোনও স্ক্রিপ্টে হার্ডকোড করা হয়, বা এক্স সার্ভারটি ভেরিয়েবল সেট করার পরে বন্ধ হয়ে যায়)।
n.st

6

আমি সাধারণত TERMআমার স্ক্রিপ্টগুলিতে এক্স এর জন্য পরীক্ষা করতে ভেরিয়েবলটি ব্যবহার করি।

TERMসাধারণত linuxটিটিওয়াই এবং xtermএক্স- তে সেট করা হয় G
আমি এখানে "সাধারণত" শব্দটি ব্যবহার করি, যেহেতু জিএনইউ স্ক্রিন এবং টিএমউক্সের মতো অ্যাপ্লিকেশনগুলি TERMভেরিয়েবলের সাথে আবদ্ধ হয় ।


চেষ্টা echo $TERMবিভিন্ন কনসোল আপনার mashine উপর richt সেটিং খুঁজে বের করতে। আমি [ $TERM == "linux" ] && echo do some stuffউবুন্টু
রুবু 77

3

এটি পুরোপুরি ভাল কাজ করা উচিত:

[ ! -t 0 ] && xset b off                                  

http://tldp.org/LDP/abs/html/fto.html

-t

    file (descriptor) is associated with a terminal device

    This test option may be used to check whether the stdin [ -t 0 ] 
    or stdout [ -t 1 ] in a given script is a terminal.

সুতরাং, যখন এটি মিথ্যা ( [ ! -t 0 ]) এর মূল্যায়ন করে আমরা একটি জিইউআই পরিবেশে থাকি।


এটির সাহায্যে আমি এক্স এবং কনসোল উভয় ক্ষেত্রে একই ফলাফল পেয়েছি [ -t 0 ]এবং [ -t 1 ]উভয়ই সত্য।
ইমানুয়েল বার্গ

আশ্চর্যের বিষয়, কোনও রিমোট হোস্টে প্রবেশের সময় এটি আমার পক্ষে কাজ করে।
টেরডন


0

আপনি এটি করতে পারেন এমন অনেকগুলি উপায় রয়েছে।

ব্যাশে, চেষ্টা করুন

function xruns {
    if [[ `pstree -As $$ | grep xinit | wc -l` == 1 ]]; then
        echo "You are in X."
    else
        echo "You are not in X."
    fi
}

বা, zsh এ, চেষ্টা করুন

#!/usr/bin/zsh

CURRENT_VT=`tty`

if [[ ${CURRENT_VT[6]} == "p" ]];        # or `${CURRENT_VT:5:1}` in bash
then
   # X stuff
else 
   # non-X stuff      
fi

পয়েন্ট নেওয়া হয়েছে, তবে আপনি কি পোস্ট দেওয়ার আগে আপনার কোডটি পরীক্ষা করছেন? প্রথমটির সিনট্যাক্স ত্রুটি রয়েছে এবং আমরা এক্স সেশনে আছি কিনা তা সনাক্ত করতে পারে না তাই echo 1এক্স চলমান থাকে এবং আপনি tty1-6 বা ssh এর মাধ্যমে লগ ইন করেন। অন্যটি সর্বদা "নন-এক্স স্টাফ" করে - আমার মনে হয় এর ${CURRENT_VT[6]}অর্থ 6th ষ্ঠ চরের চেয়ে 6th ষ্ঠ লাইন।
আলাইস মাহডাল

@ অলিসমহদল: আহা, আমার জিনিসগুলি ব্যাশে কাজ করে না (আমি zsh ব্যবহার করি)। ভেবে দেখিনি। ঠিক আছে, আপনি এটি zsh (টাইপ zsh) এ চেষ্টা করতে পারেন এবং সম্ভবত এটি পছন্দ করে যদি কিছু পরিবর্তন করতে পারেন, যাতে এটি ব্যাশে কাজ করতে পারে।
ইমানুয়েল বার্গ

@ অলিসমহদল: ঠিক আছে, আমি এটি পরিবর্তন করেছি। "Tty1-6 মাধ্যমে লগ ইন করুন" হিসাবে, এটি হ'ল আমি যা করি, এবং তারপরে আমি দ্বিতীয় সমাধানটি (উপরে) ব্যবহার করি এবং একটি ভেরিয়েবল সেট করি। পরীক্ষা করে দেখুন এই .zshrc এবং অনুসন্ধান export VT। আমি লিনাক্স ভিটি / কনসোল / টিটি আইটি (zsh প্রম্পটের জন্য) রাখার জন্য ভেরিয়েবলটি ব্যবহার করি তবে এক্স-তে আমি কেবল এটি "এক্স" (যদিও ভিটি নয়) তে সেট করেছি। তবে সেগুলি বিশদ, আপনি একই নীতিটি ব্যবহার করে ব্যাশে যে কোনও উপায়ে এটি কাজ করতে পারেন work
ইমানুয়েল বার্গ

আমি দ্বিতীয় উদাহরণে শর্তটির বাশ সংস্করণ যুক্ত করেছি। তবে আমি মনে করি যে প্রথমটি এখনও ভুল। সম্ভবত পিএস প্রিন্ট করা কেবল পূর্বপুরুষদের সাহায্য করবে। যদিও সম্ভব, আমি নিশ্চিত নই।
আলয়েস মাহডাল

@ অলিসমহদল: সম্পাদনাটি দেখুন। এটি আমার জন্য টিটি স্টাফ সহ করে।
ইমানুয়েল বার্গ

0

if [[ $DISPLAY ]]

একই কম্পিউটারে, $DISPLAYউদাহরণস্বরূপ 0:0একটি টার্মিনাল এমুলেটরটিতে ফিরে আসবে , তবে প্রকৃত টার্মিনালের কিছুই নয়। এই সহজে সঙ্গে পরীক্ষা করা সম্ভব CtrlAltF1বনাম CtrlAltF7

bashউপর ভিত্তি করে একটি শর্ত $DISPLAYনিম্নরূপ দেখাবে:

if [[ $DISPLAY ]]; then 
  
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.