স্ক্রিপ্ট থেকে টার্মিনালটি কীভাবে চিহ্নিত করব?


8

এবং " $TERM" বলবেন না - এটি সর্বদা xterm

কোনও bashস্ক্রিপ্ট কীভাবে বলতে পারে যে এটি কোন টার্মিনালটিতে চলছে, বিশেষত এটি আইটার্ম, টার্মিনাল.এপ, বা আসলে একটি এক্সটার্ম কিনা?

আমি জিজ্ঞাসা করি কারণ resetটার্মিনাল.এপ এবং আইটির্ম 2 এর বাক্সটি বাইরে চলে না। iTerm2, তবে একটি টার্মিনাল রিসেট ( \x1b]50;ClearScrollback\x07) করার জন্য একটি পালানোর ক্রমটি সনাক্ত করে এবং আমি এটি সনাক্ত করতে পারলে, আমি resetএকটি উপকরণ দিয়ে সঠিক কাজটি করে ওভাররাইড করতে পারি । এএএএএএসিকিটি, টার্মিনাল.এ্যাপে পুনরায় সেট করার অনুক্রম নেই এবং লোকেরা হ্যাক করার জন্য হাস্যকর টম-হ্যাকারি অবলম্বন করে

এখানে আমার শেষ লক্ষ্যটি হ'ল resetআমি ওএস এক্স বা লিনাক্সে কাজ করছি কিনা, এসএসএইচ এর মাধ্যমে স্থানীয়ভাবে বা দূরবর্তীভাবে কাজ করছি কিনা work (আমি কোনটি মনে করার চেষ্টা করতে চাই না, এবং এটি reset && command-that-outputs-a-bunchকাজ করা এবং আপ-এন্ট্রি করা কাজটি কার্যকর।) টার্মিনাল.এপ এবং আইটির্ম resetসঠিকভাবে প্রয়োগ না করে এই পরিকল্পনায় একটি রেঞ্চ ফেলছে ।

এর অর্থ হ'ল সহজভাবে ওভাররাইড resetকরা মোটেও তা নয়: যদি আমি লিনাক্স মেশিনে থাকি gnome-terminalতবে সঠিক পালানোর ক্রমটি প্রেরণ করতে আমি আইটার্ম ব্যবহার করছি কিনা তা জানতে হবে ।

ioctlটার্মিনালটি আসলে কী তা জিজ্ঞাসা করার কোনও উপায় আছে (আমার যদি একটি প্রয়োজনও হয় ) ?

এই প্রশ্নের উদ্দেশ্যগুলির জন্য, রিসেটের স্ক্রিনটি সাফ করা উচিত, কার্সারটি পুনরায় সেট করা উচিত এবং স্ক্রোলব্যাক বাফারটি মোছা উচিত।


ঠিক আছে, এটি একটি বৈশিষ্ট্য, কোনও বাগ নয়, বা তাই তারা বলে। আপনি যদি Terminal.appসেটিংস, টার্মিনাল ট্যাব এবং 0 এ স্ক্রলব্যাক লাইন সেট করেন তবে কী হবে ? এটি কি বর্তমান লাইনের উপরে যে কোনও এবং সমস্ত পাঠ্যকে পর্দার উপরের অংশে উপরে অক্ষম করে? আমি জানি, এটি শট হিসাবে আপনি ঠিক যা চেয়েছিলেন তা নয়।
nitro2k01

@ নাইট্রো ২ কে ০১: আমি নিশ্চিত না যে এটি কী সম্পাদন করবে? আমি স্ক্রোলব্যাক চাই resetআমার আঙ্গুলগুলি যা জানে তাই আমি কেবলমাত্র এটিই এখন এবং তারপরে পরিষ্কার করতে সক্ষম হতে চাই fe
থানাটোস

আপনার "রিসেট" ইস্যু সম্পর্কিত: স্পষ্ট করে বলতে, আপনি resetকমান্ডটি টার্মিনাল এমুলেটরের স্ক্রোল-ব্যাক বিষয়বস্তু সাফ করার প্রত্যাশা করছেন , তবে এটি করার নিশ্চয়তা নেই, কারণ স্ক্রোল-ব্যাক একটি টার্মিনাল এমুলেটর-নির্দিষ্ট বৈশিষ্ট্য, আসলেই নয় একটি টার্মিনাল অংশ। যাইহোক, টার্মিনালটি স্ক্রোল-ব্যাকটি মুছতে ইডি (ডিসপ্লেতে মুছে ফেলুন) এস্কেপ ক্রমের একটি বর্ধনকে সমর্থন করে ESC [ 3 J। আপনি স্ক্রিনটি সাফ করতে পারেন, তারপরে এটি ব্যবহার করুনreset && printf '\e[3J’
ক্রিস পেজ

প্রদর্শন এক্সটেনশনে ইরেজ সম্পর্কিত আরও তথ্যের জন্য আমার উত্তরটি এখানে Apple.stackexchange.com/a/113168/6883 দেখুন।
ক্রিস পৃষ্ঠা

@ ক্রিসপেজ: আমি বুঝতে পারি যে টার্মিনালগুলি উদ্ভট জিনিস, তবে আপনি যদি নিজেকে xterm(এর মাধ্যমে TERM=xterm) হিসাবে ঘোষণা করেন তবে আমি আশা করব যে আপনি এক্সটার্মের একটি সুপারসেটকে অনুকরণ করবেন যা পুনরায় সেট করার ক্ষেত্রে তার স্ক্রোলব্যাক সাফ করবে। (ঠিক যেমন আপনি "নীল" এর জন্য পালানোর অনুক্রম পাঠিয়েছেন, আপনি নীল আশা করতে পারেন।) মঞ্জুর, আমার এক্সটার্ম আমাকে তা বলে Erase is backspace., যা আমি আর কৃতজ্ঞ না; এটা ঠিক বিরক্তিকর।
থানাটোস

উত্তর:


10

ব্যবহার $TERM_PROGRAM

আইটার্ম এটি সেট করে iTerm.app, এবং টার্মিনাল.এপ এ Apple_Terminal


হেই, ঠিক আছে, এটি আমার হ্যাকের চেয়ে স্পষ্টতই ভাল, +1 :)। হ্যাকটি কোনও টার্মিনাল এমুলেটারের জন্য কাজ করা উচিত, কেবল এই দুটি নয়।
টেরডন

প্রতিটি টার্মিনাল এমুলেটর শনাক্ত করার কোনও একক উপায় নেই। এক্সটার্মের জন্য, আপনি উদাহরণস্বরূপ $ XTERM_VERSION ভেরিয়েবলটি পরীক্ষা করতে পারেন। কি সম্ভবত হয় OS X এর তিনটি সবচেয়ে জনপ্রিয় emulators যে যত্ন নিতে হবে
ক্রিস পৃষ্ঠা

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

1
@Thanatos sshd_config's AcceptEnvসম্ভবত। যেহেতু এটি (আপনার টার্মিনাল চালিতের চেয়ে আপনার শেলটি পৃথক হোস্টে চলে) খুব গুরুত্বপূর্ণ তথ্য, তাই এটি সত্যই প্রশ্নের অংশ হওয়া উচিত।
ড্যানিয়েল বেক

@ ড্যানিয়েলবেক: এটি কঠোরভাবে নয়; আমি একইভাবে স্থানীয় এবং দূরবর্তীভাবে করতে চাই। আমি যা যাচ্ছি তা হ'ল টার্মিনালে "রিসেট" টাইপ করার ফলে টার্মিনালের রিসেট হয়ে যায়, আমি OS X বা লিনাক্সে থাকি না কেন, স্থানীয়ভাবে বা দূরবর্তী স্থানে কাজ করছি। আমি এই প্রশ্নের সম্পাদনা করেছি।
থানাটোস

1

$TERMবর্তমানে চলমান টার্মিনাল এমুলেটরটির কিছুই করার নেই, এটি কেবল আপনার ডিফল্ট টার্মিনাল এবং এটিকে কিছুতেই সেট করা যায়। আপনি যে টার্মিনাল এমুলেটরটি চালাচ্ছেন তার নাম পেতে, আপনি psআপনার বর্তমান শেলের প্যারেন্ট প্রসেসের পিআইডি পেতে ব্যবহার করতে পারেন ।

দ্রষ্টব্য: নিম্নলিখিতটি ওএসএক্সে ব্যর্থ হবে তবে লিনাক্সে ঠিক কাজ করা উচিত

আপনার বর্তমান শেল প্রক্রিয়াটির পিআইডি হ'ল $$। সেখান থেকে, আপনি psএকটি প্রক্রিয়া গাছ দেখানোর জন্য এবং আপনার বর্তমান শেল সেশনের পিতামাতার পিআইডি মুদ্রণ করতে পারেন :

ps -axjf | awk -v pid=$$ '($2==pid){print $1}'

তারপরে আপনি সেই পিআইডি পাস psকরে কমান্ডের নাম মুদ্রণ করতে বলতে পারেন:

ps -o comm=  $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}')

এটি নামটি কেটে ফেলবে, এটি বের করার জন্য আপনার পক্ষে যথেষ্ট হওয়া উচিত তবে স্ক্রিপ্টিংয়ের পক্ষে এটি ভাল নাও হতে পারে। পুরো নামটি পেতে, আপনি চেষ্টা করতে পারেন

ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | awk '{print $NF}'

এটি আমি কয়েকটি ভিন্ন টার্মিনাল ব্যবহার করে আমার সিস্টেমে পেয়েছি:

  1. terminator

    $ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | 
       awk '{print $NF}'
    /usr/bin/x-terminal-emulator
    
  2. gnome-terminal

    $ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | 
       awk '{print $NF}'
    /usr/lib/gnome-terminal/gnome-terminal-server
    
  3. xterm

    $ ps --no-headers $(ps axjf | awk -v pid=$$ '($2==pid){print $1}') | 
       awk '{print $NF}'
    xterm
    

ওএস এক্সে কাজ করে না:ps: illegal option -- f
ড্যানিয়েল বেক

@ ড্যানিয়েলবেক বিএসডি স্টাইলকে ধন্যবাদ জানায়। আপনি আপডেট সংস্করণ দিয়ে আবার চেষ্টা করতে পারেন? -বিকল্পগুলি ওএসএক্স অনুযায়ী কাজ করা উচিত তার আগে একটি যুক্ত করা man ps
টেরডন

ভাল, কিন্তু এখনও কাজ করে না। আউটপুট ফর্ম্যাটটি পৃথক (পিআইডি হ'ল $2, পিপিআইডি হয় $3), এবং শেলটির প্যারেন্ট প্রসেসটি loginবিভিন্ন প্যারাম সহ (টার্মিনাল কনফিগারেশনের উপর নির্ভর করে) হতে পারে । তবে এর মূল প্রক্রিয়াটি হ'ল Terminal--no-headersঅস্তিত্ব নেই, আপনার মতো কিছু লাগবে tail -n1। এবং যেহেতু ইউআই সহ সমস্ত প্রক্রিয়াগুলির মধ্যে একটি যুক্তি রয়েছে-psn_0_... , awk '{print $NF}'তা কোনওভাবেই কাজ করে না।
ড্যানিয়েল বেক

@ ড্যানিয়েলব্যাক তখন খুব ভাল ঠিক আছে, ধন্যবাদ আমি এটি পরিষ্কার করে দেব যে এটি OSX এ ব্যর্থ।
টেরডন

মনে রাখবেন এটি কেবল স্থানীয়ভাবে কাজ করে। দূরবর্তী ক্লায়েন্টে টার্মিনাল এমুলেটরটি কী ব্যবহৃত হচ্ছে তা নির্ধারণ করতে আপনি এই পদ্ধতির ব্যবহার করতে পারবেন না। এমুলেটর অ্যাপ্লিকেশনটি কেটে নেওয়ার জন্য সেরা উত্তরটি হ'ল $ TERM_PROGRAM (@ ড্যানিয়েলব্যাকের উত্তরে উল্লিখিত) এবং $ এক্সটারএম_ভিয়ারসন ables
ক্রিস পৃষ্ঠা

0

পিতামাতার প্রক্রিয়াটির নাম বা পথ পাওয়ার জন্য এখানে একটি বহনযোগ্য উপায়:

আইটার্ম 2:

$ ps -p $(ps -p $$ -o ppid=) -o comm=
/Applications/iTerm.app/Contents/MacOS/iTerm

উবুন্টুতে জিনোম-টার্মিনাল:

$ ps -p $(ps -p $$ -o ppid=) -o comm=
gnome-terminal

Terminal.app:

$ ps -p $(ps -p $$ -o ppid=) -o comm=
login

মনে রাখবেন যে যদি টার্মিনাল.এপ ডিফল্ট লগইন শেলটি দিয়ে নতুন শেলগুলি খুলতে সেট করা থাকে তবে শেলের মূল প্রক্রিয়াটি loginটার্মিনাল নয়।

commকলাম OS X এর মধ্যে কমান্ড কমান্ড নাম Linux এ procps বাস্তবায়ন 15 অক্ষরের মধ্যে ছেঁটে ফেলা পূর্ণ পথ।


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