উত্তর:
এই ফাংশনটি কাজটি করা উচিত:
container() {
pid=$$
while true; do
pid=$(ps -h -o ppid -p $pid 2>/dev/null)
case $(ps -h -o comm -p $pid 2>/dev/null) in
(gnome-terminal) echo "Running in gnome terminal";return;;
(xterm) echo "Running in xterm";return;;
(rxvt) echo "Running in rxvt";return;;
(python) if [ ! -z "$(ps -h -o args -p $pid 2>/dev/null | grep guake)" ]; then echo "Running in Guake"; return; fi ;;
esac
[[ $(echo $pid) == 1 ]] && break
done
}
container
bash: [: too many arguments
। যদি সহায়তা করে তবে বাশ v4.2.24, পাইথন ভি 2.7.3 পেয়েছি।
এটা চেষ্টা কর:
echo $TERM
এটি আরও প্রামাণিক, তবে আপনার প্রোগ্রামগুলি দ্বারা বিভ্রান্ত হতে পারে। তবে আমার ক্ষেত্রে, এটি বলে xterm
এবং টিটিস-এ এটি বলে linux
, যা আমার মনে হয় লিনাক্স কনসোলকে বোঝায়।
$TERM
একটি পরিবর্তনশীল যা আপনার ব্যবহার করা টার্মিনাল এমুলেটর দ্বারা স্ব-প্রতিবেদন হিসাবে স্পেসিফিকেশনকে বোঝায়, প্রকৃত এমুলেটর নিজেই নয়। উদাহরণস্বরূপ, আমার সিস্টেমে, আমি আসলে অ্যাক্সটারমিনাল চলমান থাকলেও echo $TERM
ফিরে আসে xterm
। যা ঘটছে তা হ'ল এক্সটার্মিনাল স্ব-প্রতিবেদনের এক্সটার্ম সম্মতি। lxterminal আসলে সম্পূর্ণরূপে xterm অনুগত নয়, তাই আপনাকে নজরদারি করতে হবে। স্পেক ফাইলগুলি সাধারণত অবস্থিত /usr/share/terminfo
।
আপনি পিতামাতার প্রক্রিয়া নামটি গ্রেপ করে টার্মিনাল এমুলেটারের নাম পেতে পারেন। সুতরাং এটি প্রতিটি টার্মিনাল এমুলেটারের সাথে কাজ করে।
ব্যাশ, জেডএস, ইত্যাদিতে:
basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //')
ফিশ-শেল সহ:
basename "/"(ps -f -p (cat /proc/(echo %self)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //')
অনেকগুলি লিনাক্স সিস্টেমে echo $TERM
রিটার্ন xterm
উপরের stazher পোস্ট দেখুন।
প্রকৃত টার্মিনাল ব্যবহারে পেতে এটি করুন:
1: বর্তমানে চলমান প্রতিটি টার্মিনাল বন্ধ করুন।
2: আপনার স্বাভাবিক পদ্ধতিটি ব্যবহার করে নতুন টার্মিনালটি খুলুন।
3: নিম্নলিখিত কমান্ড লিখুন:
ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
4: রিটার্ন এমন কিছু হওয়া উচিত:
lxterminal --geometry=135x20
এখানে ভাঙ্গন:
সুতরাং: ps
"প্রক্রিয়া স্থিতি"
পিএস বিকল্পটি -o
হ'ল স্পেসের সাথে সম্পর্কিত তথ্য বা নির্দিষ্ট কীওয়ার্ডগুলির কমা দ্বারা পৃথক করা তালিকা প্রদর্শন করুন। জটিল মনে হচ্ছে, তবে আসলে তা নয়। (স্পেস বা কমা) পৃথক (কীওয়ার্ডের তালিকা) নির্দিষ্ট করা আছে।
সুতরাং, (কীওয়ার্ডগুলির তালিকা) তালিকার 'cmd='
একমাত্র কীওয়ার্ড । সুতরাং, কেবল টার্মিনাল খোলার জন্য কমান্ড প্রদর্শন করতে বলছি।
পিএস অপশনটি -p
হ'ল "প্রক্রিয়া আইডি দ্বারা" বাহ এই পিএস এর জন্য খুব সুন্দর বিকল্প। সমস্যাটি হ'ল, আপনাকে অবশ্যই এই প্রক্রিয়া আইডিটি পিএস করতে হবে। তাহলে, প্রক্রিয়া আইডি কিভাবে পাবেন? আমরা এক্সপ্রেশন প্রকাশ করি না $(ps -o 'ppid=' -p $$)
এখানে আমাদের আরও গভীর থেকে চিন্তা করতে হবে। আমি আশা করি আমি এই ব্যাশ ওয়ান-লাইনার আবিষ্কার করেছিলাম, তবে আমি তা করি নি। আমি মনে করি যে আমি এটি কোথাও https://wiki.archlinux.org/ থেকে চুরি করেছি , আমি আর খুঁজে পেলাম না। এই ছেলেরা অসাধারণ, তবে অনেক সময় তারা বুঝতে পারে না যে তারা কী বলবে অনেক গবেষণা করার পরে after আমরা যা করতে পারি তা হ'ল এটি এখন বুঝতে হবে, কারণ আমি ব্যাখ্যা করব।
সুতরাং আমরা জানি $
ব্যাশে এক্সপেনশন অপারেটর। আমি "আন-মোড়ানো" ভাবতে পছন্দ করি। সুতরাং, $(foo -opt bar)
"foo -opt বার" মোড়ক, বা প্রসারিত হবে। তবে ব্যাশে, একক রাউন্ড ব্রেস (...)
সাবশেল খোলে।
সুতরাং, কন্যার শেল হিসাবে রান হিসাবে$(foo -opt bar)
"foo -opt বার" প্রসারিত করে । খুব অদ্ভুত এবং বোঝা মুশকিল।
ঠিক আছে, সুতরাং এখন আমরা প্রায় একই ধরণের কমান্ডটি আবার চালাচ্ছি, ps -o 'ppid=' -p $$
কিন্তু এবার পিএস, প্রক্রিয়া স্থিতি আমাদের দেখায় যে তিনি কন্যার শেল উদাহরণের মধ্যে থেকে কী দেখতে পাচ্ছেন ।
-o
কীওয়ার্ডগুলির তালিকা, আগের মতো কেবল একটি কীওয়ার্ড তবে ppid=
এটি প্যারেন্ট শেলের প্রসেস আইডির জন্য সরাসরি জিজ্ঞাসা করছে !! ডাক্তার শেল ছাড়া! খুব চালাক, হ্যাঁ? আমি যখন বুঝতে পারি তখন আমি খুব উত্তেজিত!
-p
আবার, "প্রক্রিয়া আইডি দ্বারা" এবং ব্যাশে $$
প্রক্রিয়া আইডি।
যদি আপনি কল করেন ps -o 'ppid=' -p $$
বা অন্য কোনও কমান্ড $$
সরাসরি প্রথম শেল থেকে সরাসরি জিজ্ঞাসা করেন , তিনি পিড = 1, বা পিড এক্স উইন্ডো, বা আপনার ডেস্কটপ প্রোগ্রাম থেকে বলতে পারেন, বা আপনি সম্ভবত শেলটির প্রকৃত পিড পাবেন। আপনি যদি অনেকবার জিজ্ঞাসা করেন তবে আপনি প্রতিবারই আলাদা উত্তর পেতে পারেন!
তবে, আপনি যদি কোনও মেয়েকে ডাকেন এবং তাকে "কে আপনার বাবা" জিজ্ঞাসা করেন তিনি আপনাকে বলবেন! খুব চালাক. আমি আশা করি আমি এই পদ্ধতিটি উদ্ভাবনের মতো এমন প্রতিভা হতে পারতাম।
সহজ উপায় pstree
এবং ব্যবহার awk
:
pstree -sA $$ | awk -F "---" '{ print $2 }'
pstree
এর $$
(atual প্রক্রিয়ার মধ্যে)।pstree
আর্গুমেন্ট:
-s
: একটি প্রক্রিয়া এর পিতামাতার প্রদর্শন-A
: খাঁটি ASCII এ আউটপুট প্রদর্শন করুন।awk
টুল একটি প্যাটার্ন স্ক্যান এবং -F
যুক্তি প্রসেস বিভক্ত করতে ব্যবহৃত হয়।
'{ print $2 }'
পর্যন্ত awk
কেবল দ্বিতীয় ম্যাচের প্যাটার্ন আউটপুট করতে বলে (এই ক্ষেত্রে, টার্মিনাল এমুলেটারের নাম)।$2
? আমার ক্ষেত্রে যা পাইপ করা হয়েছে awk
তা আসলে systemd---lightdm---lightdm---upstart---gnome-terminal----bash---pstree
...
xfsettingsd
যে টার্মিনালটি ব্যবহার করছি তার পরিবর্তে পাই।
pstree -sA $$ | head -n1 | awk -F "---" '{ print $(NF-1) }'
আপনি সঠিক, আমি কেবল শিরোনাম প্রশ্নের জন্য উত্তর তৈরি করেছি, শরীরে প্রশ্ন নয়। সুতরাং আপনি এখানে যান, এবং বব এর ইয়ার আঙ্কেল।
উপরের একটি উত্তরে কেস স্যুইচটি কী ছিল সে সম্পর্কে আমি নিশ্চিত নই। যেমন কেস সুইচ প্রয়োজন হয় না। আমার ~ / .bashrc স্ক্রিপ্টটি আসলে একটি সাধারণ লাইন, সমস্ত প্রতিধ্বনি কমান্ড কেবল মজাদার জন্য। কিভাবে ব্যাখ্যা...
যে কোনও শব্দ b / .bashrc পড়ার সময় শুরু হয় এবং সে .bashrc এ যা দেখতে পাবে ততক্ষণ আদেশ প্রয়োগ করে। সুতরাং, কোন শব্দটি বলা হোক না কেন, সে .bashrc পড়বে এবং কমান্ডগুলি সম্পাদন করবে, সুতরাং কেবলমাত্র বাশার্কের কাঠামোর প্রয়োজন একটি পদ বা অন্য পদটির আচরণ পরিবর্তন করতে বা বাদ দেওয়া। পছন্দসই আচরণ হ'ল প্রতিটি কমান্ড একই কমান্ড চালানোর জন্য, সুতরাং কেস স্যুইচ প্রয়োজন হয় না। টার্মিনাল নিজেই আপনাকে বলবে যে তাকে কীভাবে ডাকা হয়েছিল, সুতরাং আলাদা করার দরকার নেই।
দ্রষ্টব্য (1) আমি গুয়াকের জন্য পরীক্ষা করিনি, তবে জেলিয়াগ্র্রে প্রথম উত্তরে উল্লিখিত অন্য সকলের জন্য কাজ করে।
দ্রষ্টব্য (২) উইকির জন্য মার্কডাউনে ফর্ম্যাট করার কারণে আপনি প্রদর্শিত হিসাবে কাটা এবং পেস্ট করতে পারবেন না। আন্ডারলাইন চরিত্রগুলি মুছে ফেলা সহ আপনাকে অবশ্যই প্রতিটি ব্যাকটিকটি মুছতে হবে এবং এর আগে ps
বা পরে কোনও স্থান ছাড়াই প্রকৃত ব্যাকটিক যুক্ত করতে হবে -p $$)
।
script / .bashrc এর জন্য স্ক্রিপ্ট
# show welcome message for actual terminal in use
echo "Welcome. You are attempting to use"
echo ""
echo _backtick_ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)_backtick_
echo ""
echo "Good Luck and God Speed."
এটা অনেক মজা ছিল। আমি এটি আমার নিজের ~ / .bashrc এ যুক্ত করেছি।
আপনি যদি ব্যাশ ব্যবহার করছেন তবে আমার কাছে এই আদেশটি আপনাকে সহায়তা করবে:
which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))
আপনি যদি জেডএসএইচ ব্যবহার করে থাকেন তবে আরও ভাল (দ্রুত) সমাধান রয়েছে যা কেবল জেডএসএইচ বিল্টিন ব্যবহার করে এবং /proc/$pid/{stat,cmdline}
সরাসরি ম্যানিপুলেট করে।
get-terminal-emulator() {
if [[ $TTY = "/dev/tty"* ]]; then
echo "linux-console"
return
fi
local pid=$$ name=''
while true; do
proc_stat=(${(@f)$(</proc/${pid}/stat)})
name=${proc_stat[2]//[()]/}
case "${name}" in
gnome-terminal|konsole|rxvt|xterm)
echo "${name}"; return ;;
python*)
local cmdline=(${(@f)$(</proc/${pid}/cmdline)})
if [[ "$cmdline" =~ "\\bguake.main\\b" ]]; then
echo "guake"; return
fi
;;
esac
if test "$pid" = "1" -o "$pid" = ""; then
echo "unknown"
return
fi
pid=${proc_stat[4]}
done
}
container
সংজ্ঞা পরে ফাংশন কল করতে ভুলবেন না ।