টার্মিনাল এমুলেটরটি ডেস্কটপ সেশনে চলছে কিনা তা স্ক্রিপ্ট কীভাবে সনাক্ত করবেন?


10

আমার কাছে এমন স্ক্রিপ্ট রয়েছে যা আমি একটি পাঠ্য ফাইল লিখি, তারপরে এডিটরটিতে এটি খুলি। আমি যদি আমার ডেস্কটপ সেশনে একটি টার্মিনাল এমুলেটর উইন্ডোটি খুলি এবং স্ক্রিপ্টটি চালিত করি তবে আমি সম্পাদককে গ্রাফিকাল হতে চাই gedit। কিন্তু, যদি আমি আমার ফোন বা অনুরূপ (কোন ডেস্কটপ অধিবেশন) এ ConnectBot মাধ্যমে লগ ইন করতে করছি, আমি চাই সম্পাদক হতে চাই nano

বর্তমানে আমাকে 2 টি আলাদা স্ক্রিপ্টগুলি বজায় রাখতে হবে, শেষ ধাপ ব্যতীত অভিন্ন (বা গ্রাফিকালটি চালাতে দিন, ত্রুটি বন্ধ করতে হবে, তারপরে ম্যানুয়ালি ফাইলটি খুলতে হবে nano)। বেশিরভাগ দুটি অভিন্ন স্ক্রিপ্ট থাকা রক্ষণাবেক্ষণের দিক থেকে অদক্ষ।

কোনও লিপিটি সনাক্ত করতে পারে যে আমি এর মধ্যে কোন পরিস্থিতিতে আছি এবং সঠিক সম্পাদকটি খুলতে পারি?

(টার্মিনাল এমুলেটর উইন্ডোতে চলছে কিনা বা ডাবল-ক্লিক করে এটি সনাক্ত করার জন্য আমি কোনও স্ক্রিপ্টের জন্য উপায় খুঁজে পেয়েছি, তবে উইন্ডোটি কোনও ডেস্কটপে চলছে কিনা তা সনাক্ত করার কোনও উপায় এখনও খুঁজে পাইনি ... আমি মনে করি না আমি গুগলে সঠিক পরিভাষা জানুন)


6
যদি আপনার স্ক্রিপ্টটি অন্য লোকেদের ব্যবহারের জন্য হয় তবে আপনার $EDITORপরিবর্তে ডিফল্ট দ্বারা নির্দিষ্ট করা প্রোগ্রামটি ব্যবহার করা উচিত nano, এবং nanoসেট না থাকলে ফ্যালব্যাক ।
বাকুরিউ

ধন্যবাদ, দুর্দান্ত পরামর্শ, এবং ভাল অনুশীলন কী তা শুনে খুব ভাল লাগছে। শুধু আমি যদিও।
জৈব মার্বেল

উত্তর:


13

আপনি $DISPLAYএকটি ifঅবস্থার মধ্যে ট্রিগার হিসাবে পরিবেশের পরিবর্তনশীল ব্যবহার করতে পারেন । সাধারণত যখন এই ভেরিয়েবলটির একটি মান থাকে আপনি গ্রাফিকাল অ্যাপ্লিকেশন চালাতে সক্ষম হন।

এখানে একটি উদাহরণ:

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

অপারেটর -zসত্য ফিরে আসবে যখন envvar $DISPLAYখালি এবং আপনার স্ক্রিপ্টটি চালানো হবে nano, অন্যান্য সব ক্ষেত্রে এটি চালানোর হবে gedit


@ Vurp0 এর এই মন্তব্য অনুসারে :

বেশিরভাগ আধুনিক ওয়েল্যান্ড ডেস্কটপগুলিতে (ফেডোরা এবং উবুন্টুতে ডিফল্ট ডেস্কটপের মতো) $DISPLAYপিছনের দিকের সামঞ্জস্যতার কারণে এখনও সেট করা হয়েছে (এক্সওয়াইল্যান্ডের মাধ্যমে), তবে আরও শক্তিশালী স্ক্রিপ্টের জন্য উভয়ের জন্য পরীক্ষা করা $DISPLAYএবং $WAYLAND_DISPLAYনিশ্চিত হওয়া ভাল।

আমি নিম্নলিখিত পদ্ধতিতে পরীক্ষার এক্সপ্রেশনটি সংশোধন করার পরামর্শ দেব:

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

সুতরাং, দুটি ভেরিয়েবলের মানগুলি একটি সাধারণ স্ট্রিংয়ে সংমিশ্রিত হবে, যা অপারেটর দ্বারা প্রক্রিয়া করা হবে -z


তথ্যসূত্র:


1
বা সুস্পষ্ট যুক্তির জন্য:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

7

সাধারণত ভার্চুয়াল টার্মিনালগুলি /dev/ptsসিউডো-টার্মিনাল ব্যবহার করে । সুতরাং, ttyকমান্ডের ফলাফলের উপর ভিত্তি করে , আমরা caseবিশেষ সম্পাদককে খোলার জন্য একটি সাধারণ বিবৃতি তৈরি করতে পারি :

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

বা আরও সুন্দরভাবে ফর্ম্যাট করা:

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

এনভায়রনমেন্ট ভেরিয়েবল ব্যবহারের তুলনায়, এটি কিছুটা বেশি নির্ভরযোগ্য এবং বিবেচনা করে এটি কম্যান্ডের caseসাহায্যে স্টেটমেন্টটি ttyকিছুটা বেশি বহনযোগ্য। যা সম্ভবত সবচেয়ে ভাল হবে তা হল অতিরিক্ত পরীক্ষার সাথে উভয়কে একত্রিত করা"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;


এটি কি ভুল উপায়ে নয়? আমার Ctrl + Alt + F1 কনসোলটিতে ttyদেয় /dev/tty1, যেখানে gnome-terminal(প্রথম ট্যাব) দেয় /dev/pts/0
ধানের ল্যান্ডউ

@ প্যাডিলান্ডা হ্যাঁ, ক্ষেত্রে geditহওয়া উচিত /dev/pts*। টিটিটিতে পরীক্ষার সময় ত্রুটি করার সময় আমি সেগুলি ঘুরিয়ে দিয়েছিলাম এবং এখানে আবার অনুলিপি না করেই অনুলিপি করেছিলাম। ধন্যবাদ, ইতিমধ্যে সম্পাদিত।
সের্গেই কোলোডিয়াজনি

3

এটি আমি ব্যবহার করছি:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

এই কোডটির কারণ ছিল এই প্রশ্ন: বাশ স্ক্রিপ্টের ডেস্কটপ শর্টকাট ক্র্যাশ হয়ে গেছে এবং জ্বলছে

আপনি এটি দেখতে এটি পরিবর্তন করতে পারেন:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.