বাশ: তৃতীয় পক্ষের অ্যাপ্লিকেশন দ্বারা টার্মিনালটি খোলার আছে কীভাবে তা নির্ধারণ করবেন


9

আমি চাই আমার বাশ স্ক্রিপ্টটি (বিশেষত আমার ~/.bashrc) কেবলমাত্র টার্মিনালটি সরাসরি আমার দ্বারা খোলা থাকলে, এবং এটি কোনও অ্যাপ্লিকেশন, যেমন ভিএস কোডের মাধ্যমে খোলা থাকলে অন্য কিছু করা উচিত। কেস কী তা আমি কীভাবে নির্ধারণ করতে পারি? তার জন্য কি কোনও পরিবর্তনশীল আছে? আগাম ধন্যবাদ.


1
এখানে এক ধরণের উপায় রয়েছে, আমার প্রথম প্রতিক্রিয়া হ'ল Askubuntu.com/a/1042727/295286 এ দ্বিতীয় উদাহরণ সহ । ভিএস ও রান envকমান্ড খোলার চেষ্টা করুন । আমরা ব্যবহার করতে পারি এমন কোনও ভিএস-নির্দিষ্ট ভেরিয়েবল আছে কিনা তা দেখুন।
সের্গেই কোলোডিয়াজনি

1
যদি কিছু না থাকে তবে এটিকে অন্য উপায়ে চেষ্টা করুন: দেখুন আপনার টার্মিনাল এমুলেটরটি একটি পরিবর্তনশীল সেট করে কিনা। আমি আমার মেশিনে yakuakeএকটি পরিবর্তনশীল PULSE_PROP_OVERRIDE_application.name=Yakuakeসেট এবং xtermসেট ব্যবহার XTERM_VERSION=XTerm(322)করি।
ডেজার্ট

@ সেরগি কলোডিএজনি আপনি কি পরিবেশের পরিবর্তনশীল পদ্ধতির জন্য একটি উত্তর লিখবেন?
মিষ্টান্ন

@ ডেজারেট আমি করব, তবে আমার কাছে ভিএস ইনস্টল নেই, ওপিতে কোনও প্রতিক্রিয়া জানানো হয়নি যদি আমরা কোনও নির্দিষ্ট পরিবেশের পরিবর্তনশীল থাকি যার উপরে আমরা ল্যাচ করতে পারি।
সের্গেই কোলোডিয়াজনি

@ সের্গি কলোডিএজনি আমার কাছে নেই, তবে প্রশ্নের শিরোনামটি তৃতীয় পক্ষের অ্যাপ্লিকেশনটি বলেছে এবং আমি মনে করি এটি কোনও টার্মিনাল এমুলেটরের মতোই কাজ করে - আমি মনে করি একটি উত্তর env >env_term1একটি এমুলেটরের মতো, env >env_term2দ্বিতীয়টিতে এবং কীভাবে যা ব্যবহার করা যায় তা diff env_term{1,2}খুব কার্যকর। সর্বোপরি, ওপি বলছে যেমন ভিএস কোড
ডেজার্ট

উত্তর:


10

আপনি সম্ভবত শেলের বংশধর ব্যাক আপ এবং এটি "আপনার" বা অন্য কোনও প্রোগ্রামের সাথে সমান কিছু দ্বারা শুরু হয়েছিল কিনা তা নিয়ে কাজ করে এটি করতে পারেন।

শেলের পিআইডি (প্রসেস আইডি) এবং তার পিপিআইডি (প্যারেন্ট প্রসেস আইডি) পান। আপনি এমন কোনও জায়গায় না পৌঁছা পর্যন্ত অবিরত থাকুন যা আপনাকে বলে যে এটি কোথা থেকে এসেছে। আপনার সিস্টেমে আপনাকে পরীক্ষা করার দরকার হতে পারে - কমপক্ষে, এটি সর্বজনীন হবে কিনা তা আমি জানি না।

উদাহরণস্বরূপ, আমার সিস্টেমে শেলের পিআইডি পান এবং psএটি দেখানোর জন্য ব্যবহার করুন bash:

$ echo $$
18852
$ ps --pid 18852
  PID TTY          TIME CMD
18852 pts/1    00:00:00 bash

18852 এর পিপিআইডি পান:

$ ps -o ppid= -p 18852
18842

পিপিআইডি (18842) কী তা সন্ধান করুন:

$ ps --pid 18842
  PID TTY          TIME CMD
18842 ?        00:00:02 gnome-terminal

আমরা এটি জিনোম-টার্মিনাল দেখতে পাচ্ছি, অর্থাৎ টার্মিনাল এমুলেটর / টার্মিনাল উইন্ডো। অন্য প্রোগ্রাম দ্বারা চালু যদি আপনার শেল একটি টার্মিনাল এমুলেটর উইন্ডোতে না চলে থাকে তবে এটি আপনার পক্ষে যথেষ্ট good

যদি এটি যথেষ্ট ভাল না হয় তবে অন্য একটি স্তরটিতে যান:

$ ps -o ppid= -p 18842
 2313
$ ps --pid 2313
  PID TTY          TIME CMD
 2313 ?        00:00:00 init

এটি আমাদের বলে যে gnome-terminalএটি শুরু হয়েছিল init। আমি সন্দেহ করি যে আপনার শেলটি অন্য প্রোগ্রাম দ্বারা শুরু করা হয়েছে সেখানে কিছু আলাদা থাকবে।


... অথবা সম্ভবতpstree -s $$
স্টিলড্রাইভার

9
"এটি আমাদের জানায় যে জিনোম-টার্মিনালটি ডিআই দ্বারা শুরু হয়েছিল" আমি এটি অসম্ভব বলে পাই যে থিম টার্মিনাল উইন্ডোগুলি শুরু করবে। পরিবর্তে, যাই হোক না কেন জিনোম-টার্মিনালটি মারা গিয়েছিল, এবং জিনোম-টার্মিনালটি পুনরায় প্যারেন্টেড হয়েছিল ইনডিকে। জিনোম-টার্মিনাল চেক করা, এটি দ্বিগুণ কাঁটাচামচ মনে হচ্ছে। সুতরাং যখন এটি কার্যকর হয়, এটি প্রথমে নিজেকে কাঁটাচামচ করে এবং নতুন প্রক্রিয়া চালিয়ে, মূল প্রক্রিয়াটিকে হত্যা করে।
জোল

@ জোল ফেয়ার পয়েন্ট এই initপ্রক্রিয়াটি যদিও 1 পিড ​​নয়, নিশ্চিত নয় যে এটি কিছু পরিবর্তন করবে কিনা।
ক্যাস্পার্ড

অনেক ধন্যবাদ! আমি সনাক্ত করতে সক্ষম হয়েছি যে ভিএস কোড বা একটিলিপস দুটিই সন্তানের হিসাবে টার্মিনালটি চালায় না gnome-terminal। আমি আমার কমান্ডের আওতায় কার্যকর করেছি if [ $(pstree -s $$ | grep "gnome-terminal" -c) -gt 0 ]; then ...এবং এটি কার্যকর হয়েছে ।
পেপারব্যাগ

9

ভিজ্যুয়াল স্টুডিও কোড যতদূর যায়, সুস্পষ্টভাবে একীভূত টার্মিনালের জন্য অতিরিক্ত পরিবেশের ভেরিয়েবল সেট করার একটি উপায় রয়েছে । সুতরাং, এই কনফিগারটি ব্যবহার করতে ভিজ্যুয়াল স্টুডিও সেট আপ করুন:

"terminal.integrated.env.linux": {
  "visual_studio": "true"
}

এবং এর মধ্যে ~/.bashrc:

if [ -n "$visual_studio" ]; then
    # do something for Visual Studio
else
    # do something else for other types of terminal
fi

সাধারণভাবে, আপনি bashপ্রক্রিয়াটিতে প্রদত্ত পরিবেশের উপর নির্ভর করতে পারেন । উদাহরণের জন্য, পরিবর্তনশীল , এবং একটি অনুরূপ চালানোর জন্য শাখা বা অন্য কিছু। উপর কেস-টু-কেস ভিত্তিতে, আপনি চলমান মাধ্যমে পরিবেশে পার্থক্য তদন্ত করতে পারি প্রতিটি কনসোলে হিসেবে ফাইলে যে সংরক্ষণ, এবং যেমন দ্বারা প্রস্তাবিত মন্তব্য ডেজার্ট$TERMif..then...else...fi[ "$TERM" = "xterm" ]envenv > output_console1.txtdiff output_console1.txt output_console2.txt


$Env:varবাশে পরিবেশের পরিবর্তনশীলগুলির জন্য সিনট্যাক্স নয়। এটি আমার কাছে পাওয়ারশেল জিনিস বলে মনে হচ্ছে।
ডায়েটারিচ এপ্প

@ ডায়েটরিচএপ হ্যাঁ, আমি মূলত ভিজ্যুয়াল স্টুডিওতে অতিরিক্ত পরিবেশের ভেরিয়েবল সেট করার উপায়গুলি নিয়ে গবেষণা করেছিলাম, কিন্তু উপেক্ষা করেছি যে উত্তরগুলি পাওয়ারশেল ব্যবহার করছে। তাই $fooযথেষ্ট। কফি সম্ভবত যথেষ্ট নয়।
সের্গেই কোলোডিয়াজনি

তৃতীয় পক্ষের প্রোগ্রামগুলির সাধারণ ক্ষেত্রে যেগুলি এনভ-সেটিং নেই, আপনি প্রোগ্রামটি চালানোর আগে একটি র‌্যাপারে একটি কাস্টম এনভ ভার্ভ সেট করতে পারেন । আমার উত্তর দেখুন ।
পিটার কর্ডেস

2

আপনি যদি একটি নির্দিষ্ট তৃতীয় পক্ষের অ্যাপের কথা বলছেন তবে পরিবেশের পরিবর্তনশীল ব্যবহার করুন। যখন তারা নতুন প্রক্রিয়াগুলি চালিত করেন তখন বেশিরভাগ প্রোগ্রামগুলি অপরিবর্তিত পুরো পরিবেশ জুড়ে চলে যাবে।

সুতরাং, আপনি যাচাই করতে পারেন এমন একটি কাস্টম এনভির সাথে এই অ্যাপ্লিকেশনটি শুরু করুন । উদাহরণস্বরূপ এর মতো alias vs=RUNNING_FROM_VSCODE=1 VSCodeএকটি উপকরণ তৈরি করুন, বা এটির মতো একটি র‌্যাপার স্ক্রিপ্ট তৈরি করুন:

#!/bin/sh
export RUNNING_FROM_VSCODE=1
exec VSCode "$@"

তারপরে আপনার .bashrc, আপনি করতে পারেন

if (($RUNNING_FROM_VSCODE)); then
   echo "started from inside VSCode"
   # RUNNING_FROM_VSCODE=0  # optional if you only want the immediate child
fi

বাশ পাটিগণিত বিবৃতিটি (( ))সত্য যদি অভিব্যক্তিটি একটি শূন্য-না-ও পূর্ণসংখ্যার (যে কারণে আমি 1উপরে ব্যবহার করেছি ) মূল্যায়ন করে । খালি স্ট্রিং (একটি আনসেট এনভির ভারের জন্য) মিথ্যা। এটি বাশ বুলিয়ান ভেরিয়েবলের জন্য দুর্দান্ত তবে আপনি এটি খুব সহজেই ব্যবহার করতে পারেন trueএবং এটি একটি traditionalতিহ্যবাহী পসিক্স দিয়ে পরীক্ষা করতে পারেন

if [ "x$RUNNING_FROM_VSCODE" = "xtrue" ]; then
   echo "started from inside VSCode"
fi

যদি আপনার অ্যাপ্লিকেশনটি বেশিরভাগ ক্ষেত্রে তার বাচ্চাদের জন্য পরিবেশ সাফ করে , তবে এখনও $PATHঅপরিবর্তিত থাকে তবে আপনি এটি নিজের মোড়কে ব্যবহার করতে পারেন:

#!/bin/sh
export PATH="$PATH:/dev/null/RUNNING_FROM_VSCODE"
exec VSCode "$@"

এবং এটি পাথের মতো [[ "${PATH%RUNNING_FROM_VSCODE}" != "$PATH" ]]প্রত্যয়টি প্যাথ থেকে প্রত্যয় ছোঁড়ে কিনা এটি পরিবর্তন করে কিনা তা পরীক্ষা করার জন্য বাশের মতো প্যাটার্ন-ম্যাচের সাথে এটি পরীক্ষা করুন।

প্রোগ্রামটি খুঁজে পাওয়া যায় না এমন বাহ্যিক কমান্ডগুলির সন্ধান করার সময় এটি নির্দোষভাবে একটি অতিরিক্ত ডিরেক্টরি অনুসন্ধান করতে হবে। /dev/nullঅবশ্যই কোনও সিস্টেমে ডিরেক্টরি নয়, সুতরাং এটি একটি বোগাস ডিরেক্টরি হিসাবে ব্যবহার করা নিরাপদ যা ENOTDIRপাথ অনুসন্ধানগুলি পূর্বের পাথের এন্ট্রিগুলিতে তারা যা সন্ধান করছে তা যদি খুঁজে না পায় তবে দ্রুত ফল পাওয়া যাবে।


মোড়ক স্ক্রিপ্টগুলি সাধারণত একটি বুদ্ধিমান পন্থা হয়, সুতরাং +1। একমাত্র ক্ষুদ্র অসুবিধা হ'ল যদি আপনার কাছে 3 টি প্রোগ্রাম থাকে তবে আপনার কাছে 3 টি র্যাপার স্ক্রিপ্ট বা একটি র‌্যাপার স্ক্রিপ্ট থাকতে পারে 3 টি বিভিন্ন আর্গ, যা এটি ক্লান্তিকর করে তুলতে পারে। তবুও এটি একটি দৃ approach় পদ্ধতির।
সের্গেই কোলোডিয়াজনি

1

এখানে আমার 2 সেন্ট। শুধু এটি আপনার যুক্ত করুন .bashrcterminalsআপনার প্রিয় টার্মিনালগুলি প্রতিস্থাপন করুন এবং আপনার সাথে exportআদেশ দিন।

run_in_terminal(){
  local parent_command="$(ps --no-headers --pid $PPID -o command | awk '{print $1;}')"
  local parent="$(basename $parent_command)"
  local terminals=( gnome-terminal st xterm ) # list your favorite terminal here
  if [[ ${terminals[*]} =~ ${parent} ]]; then
    # Your commands to run if in terminal
    export MY_VAR_IN_TERMINAL="test"
  fi
}
run_in_terminal

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