আমি যখন আপনার প্রশ্নটি পড়ি তখন আমার প্রথম চিন্তা ছিল $SHLVL। তারপরে আমি দেখেছি যে আপনি শেল স্তরগুলি ছাড়াওvim স্তরগুলিও
গণনা করতে চেয়েছিলেন । এটি করার একটি সহজ উপায় শেল ফাংশনটি সংজ্ঞায়িত করা:
vim() { ( ((SHLVL++)); command vim "$@");}
এটি SHLVL
প্রতিবার আপনি কোনও vimআদেশ লিখলে স্বয়ংক্রিয়ভাবে এবং নিঃশব্দে বৃদ্ধি পাবে ment তোমরা প্রত্যেকে বৈকল্পিক জন্য এটা করতে প্রয়োজন হবে vi/ vimযে আপনি কি কখনো ব্যবহার; যেমন,
vi() { ( ((SHLVL++)); command vi "$@");}
view() { ( ((SHLVL++)); command view "$@");}
প্রথম বন্ধনীগুলির সেটটি একটি সাব- SHLVL
শেল তৈরি করে, সুতরাং এর মানটিতে ম্যানুয়াল পরিবর্তন বর্তমান (প্যারেন্ট) শেল পরিবেশকে দূষিত করে না। অবশ্যই commandকীওয়ার্ডটি রয়েছে ফাংশনগুলিকে তাদের কল করতে বাধা দেওয়ার জন্য (যার ফলে একটি অসীম পুনরাবৃত্তি লুপ হবে) in এবং অবশ্যই আপনার এই সংজ্ঞাগুলি আপনার .bashrcবা অন্যান্য শেল ইনিশিয়ালাইজেশন ফাইলে রাখা উচিত।
উপরেরটিতে কিছুটা অদক্ষতা রয়েছে। কিছু শেল (বাশ এক হচ্ছে), যদি আপনি বলেন
( সেমিডি 1 ; সেমিডি 2 ; … ; সেমিডি এন )
যেখানে একটি বহিরাগত, এক্সিকিউটেবল প্রোগ্রাম (যেমন বিল্ট-ইন কমান্ড নয়) রয়েছে, শেলটি একটি সমাপ্তির অপেক্ষার জন্য কেবল অতিরিক্ত প্রক্রিয়া রাখে । এটি (তর্কযোগ্যভাবে) প্রয়োজনীয় নয়; সুবিধা এবং অসুবিধাগুলি বিতর্কযোগ্য deb আপনি যদি কিছুটা মেমোরি এবং একটি প্রক্রিয়া স্লট বেঁধে নিতে আপত্তি করেন না (এবং যখন আপনি একটি করার সময় আপনার প্রয়োজনের তুলনায় আরও একটি শেল প্রক্রিয়া দেখতে চান ), তবে উপরের কাজটি করুন এবং পরবর্তী বিভাগে যান। ডিট্টো আপনি যদি এমন শেল ব্যবহার করছেন যা অতিরিক্ত প্রক্রিয়াটি চারপাশে রাখে না। তবে, আপনি যদি অতিরিক্ত প্রক্রিয়াটি এড়াতে চান তবে প্রথমে চেষ্টা করার চেষ্টা করুনcmdncmdnps
vim() { ( ((SHLVL++)); exec vim "$@");}
execকমান্ড দীর্ঘস্থায়ী কাছ থেকে অতিরিক্ত শেল প্রক্রিয়া রোধ করার জন্য নেই।
তবে, একটা গ্যাচা আছে। শেলের হ্যান্ডলিংটি SHLVLকিছুটা স্বজ্ঞাত: শেলটি শুরু হলে SHLVLএটি সেট করা আছে কিনা তা পরীক্ষা করে । যদি এটি সেট না করা হয় (বা সংখ্যা ব্যতীত অন্য কোনও কিছুতে সেট করা থাকে) তবে শেলটি এটি 1 এ সেট করে If
তবে, এই যুক্তি অনুসারে, যদি আপনি বলেন exec sh, আপনার SHLVLউচিত উর্ধ্বে। তবে এটি অনাকাঙ্ক্ষিত, কারণ আপনার আসল শেল স্তরটি বাড়েনি। শেলটি
যখন আপনি এটি করেন তখন থেকে একটিকে বিয়োগ করে এটি পরিচালনা করে : SHLVLexec
$ echo "$SHLVL"
1
$ set | grep SHLVL
SHLVL=1
$ env | grep SHLVL
SHLVL=1
$ (env | grep SHLVL)
SHLVL=1
$ (env) | grep SHLVL
SHLVL=1
$ (exec env) | grep SHLVL
SHLVL=0
সুতরাং
vim() { ( ((SHLVL++)); exec vim "$@");}
একটি ধোয়া; এটা বৃদ্ধি SHLVLশুধু এটা আবার হ্রাস। আপনি পাশাপাশি কেবল vimকোনও ফাংশনের সুবিধা ছাড়াই বলতে পারেন ।
দ্রষ্টব্য:
Stéphane Chazelas (যিনি সবকিছু জানেন) অনুযায়ী , কিছু শাঁস যথেষ্ট স্মার্ট না এই কাজ করতে যদি execএকটি subshell হয়।
এটি ঠিক করার জন্য, আপনি করবেন
vim() { ( ((SHLVL+=2)); exec vim "$@");}
তারপরে আমি দেখেছি যে আপনি শেল স্তরগুলির থেকে স্বাধীনভাবেvim স্তরগুলি
গণনা করতে চেয়েছিলেন । ঠিক আছে, একই একই কৌশল কাজ করে (ভাল, একটি ছোটখাটো পরিবর্তন সহ):
vim() { ( ((SHLVL++, VILVL++)); export VILVL; exec vim "$@");}
(এবং এর জন্য vi, viewইত্যাদি।) exportপ্রয়োজনীয় কারণ VILVLডিফল্টরূপে পরিবেশের পরিবর্তনশীল হিসাবে সংজ্ঞায়িত হয়নি। তবে এটি ফাংশনের অংশ হওয়ার দরকার নেই; আপনি কেবল export VILVLএকটি পৃথক কমান্ড (আপনার .bashrc) হিসাবে বলতে পারেন । এবং উপরে যেমন আলোচনা করা হয়েছে, অতিরিক্ত শেল প্রক্রিয়া যদি আপনার সমস্যা না হয় তবে আপনি command vimতার পরিবর্তে এটি করতে পারেন exec vimএবং SHLVLএকা ছেড়ে যেতে পারেন :
vim() { ( ((VILVL++)); command vim "$@");}
ব্যক্তিগত পছন্দ:
আপনি হয়ত এর VILVLমতো কিছুতে নাম পরিবর্তন করতে পারেন VIM_LEVEL। আমি যখন " VILVL" তাকাই , আমার চোখ ব্যথা করে; তারা এটি বলতে পারবেন না এটি "ভিনাইল" বা কোনও ত্রুটিযুক্ত রোমান অঙ্কের ভুল বানান।
আপনি যদি এমন শেল ব্যবহার করছেন যা সমর্থন করে না SHLVL(যেমন, ড্যাশ), আপনি যতক্ষণ শেল একটি স্টার্টআপ ফাইল প্রয়োগ করেন ততক্ষণ আপনি নিজে এটি প্রয়োগ করতে পারেন। ঠিক তেমন কিছু করুন
if [ "$SHELL_LEVEL" = "" ]
then
SHELL_LEVEL=1
else
SHELL_LEVEL=$(expr "$SHELL_LEVEL" + 1)
fi
export SHELL_LEVEL
আপনার .profileবা প্রযোজ্য ফাইলটিতে। (আপনার নামটি সম্ভবত ব্যবহার করা উচিত নয় SHLVL, কারণ যদি আপনি কখনও সমর্থন করে এমন শেল ব্যবহার শুরু করেন তবে বিশৃঙ্খলা সৃষ্টি হবে SHLVL))
অন্যান্য উত্তরগুলি আপনার শেল প্রম্পটে এনভায়রনমেন্ট ভেরিয়েবল ভ্যালু (গুলি) এম্বেড করার ইস্যুটিকে সম্বোধন করেছে, তাই আমি এটির পুনরাবৃত্তি করব না, বিশেষত আপনি বলেছেন যে এটি ইতিমধ্যে কীভাবে করা যায় তা আপনি জানেন।
$SHLVLপরিবর্তনশীল (বেশ কয়েক শাঁস দ্বারা পরিচালিত) আপনি যা খুঁজছেন তা?