আমি কত শাঁস গভীর?


73

সমস্যা : আমি কত শাঁস গভীর তা সন্ধান করুন।

বিশদ : আমি অনেকগুলি ভিএম থেকে শেলটি খুলি। বিল্ড এবং রান এবং প্রস্থান করুন। কখনও কখনও আমি ভুলে গিয়ে অন্য ভিমটি ভিতরে open :(

আমি জানতে চাই যে আমি কতগুলি শাঁস গভীর, সম্ভবত আমার শেল স্ক্রিনে সর্বদা এটি থাকতে পারে। (আমি সেই অংশটি পরিচালনা করতে পারি)।

আমার সমাধান : প্রক্রিয়া গাছটি পার্স করুন এবং ভিম এবং বাশ / জেডশির সন্ধান করুন এবং এর মধ্যে বর্তমান প্রক্রিয়ার গভীরতাটি নির্ণয় করুন

এরকম কিছু কি ইতিমধ্যে বিদ্যমান? আমি কিছুই খুঁজে পেলাম না।


27
হয় $SHLVLপরিবর্তনশীল (বেশ কয়েক শাঁস দ্বারা পরিচালিত) আপনি যা খুঁজছেন তা?
স্টাফেন চেজেলাস

1
স্পষ্ট করার জন্য, আপনি SHLVL দ্বারা নির্দেশিত কয়টি (সরাসরি নেস্টেড) শেল সম্পর্কে সত্যই আগ্রহী নন, তবে আপনার বর্তমান শেলটি ভিমের বংশধর কিনা?
জেফ স্ক্যালার হলেন

14
এটি কিছুটা XY সমস্যা বলে মনে হচ্ছে - আমার কর্মপ্রবাহটি ভিএম উদাহরণ থেকে প্যারেন্ট শেলের মধ্যে থেকে পালাতে, এবং fgফিরে পেতে, যা এই সমস্যাটির সাথে নেই।
ডুরকনব

2
@ ডুরকনব, আমিও এটি করি। তবে আমি এটিকে পছন্দ করি, কারণ তখন আমাকে "চাকরিগুলি" চেক করতে হবে। এবং আমার মেশিনে অনেক সময় দৌড়াতে পারে। এখন, সমীকরণের সাথে TMUX যুক্ত করুন add এটি জটিল ও উপচে পড়া become আমি যদি ভিএম এর ভিতরে শেল রাখি তবে এটি কোনও ছড়িয়ে পড়া কম হবে। (তবে আমি জগাখিচুড়ি করি এবং তাই প্রশ্নটি শেষ করি)।
প্রণয়

3
@ ডুরকনব: সমস্ত প্রাপ্য শ্রদ্ধার সাথে, এই প্রশ্নের প্রতিক্রিয়া দেওয়ার মতো মনে হচ্ছে, "আমি কী বিন্দু বি থেকে বিন্দু থেকে গাড়ি চালাব?" এই পরামর্শ সহ, "গাড়ি চালাবেন না; কেবল একটি উবার নিন ”" যদি ব্যবহারকারীর এমন একটি ওয়ার্কফ্লো থাকে যা একসাথে একাধিক ফাইল সম্পাদনা করতে জড়িত থাকে, তবে একাধিক সমান্তরাল বন্ধ হওয়া vimকাজগুলি নেস্টেড প্রক্রিয়াগুলির স্ট্যাক থাকার চেয়ে আরও বিভ্রান্তিকর হতে পারে। যাইহোক, আমি একাধিক উইন্ডোজ থাকা পছন্দ করি , তাই আমি সহজেই পিছনে পিছনে দ্রুত লাফিয়ে উঠতে পারি, তবে আমি আলাদা ওয়ার্কফ্লো পছন্দ করি বলেই এটিকে XY সমস্যা বলব না।
স্কট

উত্তর:


45

আমি যখন আপনার প্রশ্নটি পড়ি তখন আমার প্রথম চিন্তা ছিল $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))


অন্যান্য উত্তরগুলি আপনার শেল প্রম্পটে এনভায়রনমেন্ট ভেরিয়েবল ভ্যালু (গুলি) এম্বেড করার ইস্যুটিকে সম্বোধন করেছে, তাই আমি এটির পুনরাবৃত্তি করব না, বিশেষত আপনি বলেছেন যে এটি ইতিমধ্যে কীভাবে করা যায় তা আপনি জানেন।


1
আমি কিছুটা হতভম্ব করছি যাতে অনেক উত্তর মত একটি বহিস্থিত এক্সিকিউটেবল প্রোগ্রাম নির্বাহ প্রস্তাব দিন psবা pstree, যখন আপনি শেল builtins সঙ্গে এটা করতে পারেন।
স্কট

এই উত্তর নিখুঁত। আমি এটিকে সমাধান হিসাবে চিহ্নিত করেছি (দুর্ভাগ্যক্রমে এটির এত বেশি ভোট এখনও নেই)।
প্রণয়

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

1
নোটের dashগাণিতিক সম্প্রসারণ রয়েছে Note SHELL_LEVEL=$((SHELL_LEVEL + 1))be SHELL_LEVEL পূর্বে সেট না থাকা বা খালি থাকলেও যথেষ্ট হওয়া উচিত। এটি কেবল তখনই যদি আপনি বর্ন শেলটি বহন করতে চান যে আপনি অবলম্বন exprকরতে চান তবে আপনাকে পুনরায় প্রতিস্থাপন $(...)করতে হবে `..`SHELL_LEVEL=`expr "${SHELL_LEVEL:-0}" + 1`
স্টাফেন চেজেলাস

2
@ প্রণয়, সমস্যা হওয়ার সম্ভাবনা নেই। যদি কোনও আক্রমণকারী যেকোন স্বেচ্ছাসেবী এনভির ভার ইনজেকশন করতে পারে , তবে PATH / LD_PRELOAD এর মতো জিনিসগুলি আরও সুস্পষ্ট পছন্দ, তবে যদি অ-সমস্যাযুক্ত ভেরিয়েবলগুলি পুনরায় সেট_েনভ ছাড়াই কনফিগার করা সুডোর মতো হয় (এবং কোনও দ্বারা bashস্ক্রিপ্টকে ~ / .brcrc পড়তে বাধ্য করতে পারে) উদাহরণস্বরূপ স্টিডিনকে একটি সকেট তৈরি করা), তবে এটি কোনও সমস্যা হয়ে উঠতে পারে। এটি অনেকটা "যদি" হয় তবে কারও মনের পিছনে রাখার মতো কিছু (পাটিগণিতের প্রসঙ্গে নিরবচ্ছিন্ন ডেটা বিপজ্জনক)
স্টাফেন চেজেলাস

37

আপনি কোনও সেশন লিডার না পাওয়া পর্যন্ত প্রক্রিয়া ট্রি আপ করার জন্য আপনার যত সময় প্রয়োজন তা গণনা করতে পারেন। zshলিনাক্সের মতো :

lvl() {
  local n=0 pid=$$ buf
  until
    IFS= read -rd '' buf < /proc/$pid/stat
    set -- ${(s: :)buf##*\)}
    ((pid == $4))
  do
    ((n++))
    pid=$2
  done
  echo $n
}

বা পসিক্সলি (তবে কম দক্ষ):

lvl() (
  unset IFS
  pid=$$ n=0
  until
    set -- $(ps -o ppid= -o sid= -p "$pid")
    [ "$pid" -eq "$2" ]
  do
    n=$((n + 1)) pid=$1
  done
  echo "$n"
)

এটি আপনার টার্মিনাল এমুলেটর বা গেটি এবং প্রতিটি বংশধরদের জন্য আরও একটি করে শেলের জন্য 0 দেয়।

আপনাকে কেবল একবার প্রারম্ভকালে এটি করা দরকার। উদাহরণস্বরূপ:

PS1="[$(lvl)]$PS1"

আপনার ~/.zshrcবা সমমানের এটি আপনার প্রম্পটে আছে।

tcshএবং একাধিক অন্যান্য শাঁস ( zsh, ksh93, fishএবং bashঅন্তত) একটি বজায় রাখা $SHLVLপরিবর্তনশীল যা তারা সূচনার সময় বাড়ায় (এবং হ্রাস সাথে অন্য কমান্ড চালানোর আগে exec(যদি না যে execএকটি subshell হয় যদি তারা বগী নও (কিন্তু অনেক)))। এটি কেবল শাঁস নেস্টিংয়ের পরিমাণ ট্র্যাক করে যদিও বাসা বাঁধতে প্রক্রিয়াজাত করে না। এছাড়াও স্তর 0 অধিবেশন নেতা হওয়ার গ্যারান্টিযুক্ত নয়।


হ্যাঁ .. এই বা অনুরূপ। আমি নিজের এটি লেখার ইচ্ছা করিনি, এবং আমার পক্ষে কেউ এটি লেখার ইচ্ছা পোষণ করছিল না। ।। :( আমি যে নিয়মিতভাবে রক্ষা করা হয় আমি সন্ধান করেছি কিন্তু কিছু পাইনি তেজ বা শেল বা কিছু প্লাগইন মধ্যে কিছু বৈশিষ্ট্যের জন্য প্রত্যাশী হয়।
প্রণয়

31

ব্যবহার echo $SHLVLKISS নীতিটি ব্যবহার করুন । আপনার প্রোগ্রামের জটিলতার উপর নির্ভর করে এটি যথেষ্ট হতে পারে।


2
জন্য কাজ করে bash, কিন্তু জন্য না dash
এজিসি

SHLVL আমাকে সাহায্য করে না। আমি এটি সম্পর্কে জানতাম এবং আমি অনুসন্ধান করার সময় এটি অনুসন্ধানেও উঠে আসে। :) প্রশ্নে আরও বিশদ আছে।
প্রণয়

@ প্রণয় আপনি কি নিশ্চিত যে ভিএম নিজেই এই তথ্য সরবরাহ করে না?
ব্যবহারকারী 2497

@ ব্যবহারকারী ২৪৯9, আমি কিছুটা আছি এটিই প্রশ্নের ভিত্তি। আমি সর্বত্র অনুসন্ধান করেছি, আমি SHLVL সম্পর্কেও অবগত ছিলাম aware আমি চেয়েছিলাম -> ক) নিশ্চিত যে এরকম কোনও জিনিস নেই। খ) কমপক্ষে নির্ভরতা / রক্ষণাবেক্ষণ সহ এটি করুন।
প্রণয়

16

এর একটি সম্ভাব্য সমাধান হ'ল আউটপুটটি দেখে pstree। যখন ভিতরে থেকে উদ্ভূত শেলের ভিতরে চালিত viহন, গাছ গাছের যে অংশটি তালিকাভুক্ত করে pstreeতা আপনাকে দেখায় যে আপনি কতটা গভীর। উদাহরণ স্বরূপ:

$ pstree <my-user-ID>
...
       ├─gnome-terminal-─┬─bash───vi───sh───vi───sh───pstree
...

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

11

প্রথম বৈকল্পিক - কেবল শেল গভীরতা।

এর জন্য সহজ সমাধান bash: .bashrcপরবর্তী দুটি লাইন যুক্ত করুন (বা আপনার বর্তমান PS1মান পরিবর্তন করুন ):

PS1="${SHLVL} \w\$ "
export PS1

ফলাফল:

1 ~$ bash
2 ~$ bash
3 ~$ exit
exit
2 ~$ exit
exit
1 ~$

প্রম্পট স্ট্রিংয়ের শুরুতে নম্বরটি শেল স্তরকে বোঝানো হবে।

নেস্টেড ভিআইএম এবং শেল লেভেল উভয় সহ দ্বিতীয় বৈকল্পিক।

এই লাইন যুক্ত করুন .bashrc

branch=$(pstree -ls $$)
vim_lvl=$(grep -o vim <<< "$branch" | wc -l)
sh_lvl=$(grep -o bash <<< "$branch" | wc -l)
PS1="v:${vim_lvl};s:$((sh_lvl - 1)):\w\$ "
export PS1

ফলাফল:

v:0;s:1:/etc$ bash
v:0;s:2:/etc$ bash
v:0;s:3:/etc$ vim
##### do ':sh' command in the vim, shell level is increasing by 1
v:1;s:4:/etc$ vim
##### do ':sh' command in the vim, shell level is increasing by 1
v:2;s:5:/etc$ bash
v:2;s:6:/etc$

v: 1 - ভিম গভীরতার স্তর
s: 3 - শেল গভীরতার স্তর


এটি আমাকে বাশ বাসা দেবে। এটি আমাকে ভিমে বাসা দেবে না। :)
প্রণয়

@ প্রণয় নতুন সমাধান পরীক্ষা করে দেখুন। এটি আপনি যা চান তা করছে।
মিনিম্যাক্স

হ্যাঁ, এটি একটি ভাল সমাধান। আমি আরও শাঁস যোগ করতে পারি এবং এটি কাজ করবে :)।
প্রণয়

8

যে প্রশ্নে আপনি পার্সিংয়ের কথা উল্লেখ করেছেন pstree। এখানে তুলনামূলকভাবে সহজ উপায়:

bash-4.3$ pstree -Aals $$ | grep -E '^ *`-((|ba|da|k|c|tc|z)sh|vim?)( |$)'
                  `-bash
                      `-bash --posix
                          `-vi -y
                              `-dash
                                  `-vim testfile.txt
                                      `-tcsh
                                          `-csh
                                              `-sh -
                                                  `-zsh
                                                      `-bash --norc --verbose

pstreeবিকল্প:

  • -A- সহজ ফিল্টারিংয়ের জন্য ASCII আউটপুট (আমাদের ক্ষেত্রে প্রতিটি কমান্ড এর আগে রয়েছে `-)
  • -a কমান্ড আর্গুমেন্টগুলিও প্রদর্শন করুন, পার্শ্ব-প্রতিক্রিয়া হিসাবে প্রতিটি কমান্ড একটি পৃথক লাইনে প্রদর্শিত হয় এবং আমরা সহজেই ব্যবহার করে আউটপুট ফিল্টার করতে পারি grep
  • -l - দীর্ঘ লাইন কাটা না
  • -s- নির্বাচিত প্রক্রিয়াটির পিতামাতাকে দেখান
    (দুর্ভাগ্যক্রমে পুরানো সংস্করণগুলিতে সমর্থিত নয় pstree)
  • $$ - নির্বাচিত প্রক্রিয়া - বর্তমান শেলের পিআইডি

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

3

এটি কঠোরভাবে প্রশ্নের উত্তর দেয় না তবে অনেক ক্ষেত্রে এটি করা অপ্রয়োজনীয় করে তুলতে পারে:

আপনি যখন প্রথম নিজের শেলটি চালু করবেন তখন চালান set -o ignoreeof। এটি আপনার মধ্যে রাখবেন না~/.bashrc

আপনি যখন শীর্ষ স্তরের শেলটিতে পড়েছেন এবং নিশ্চিত হতে চান তখন সিটিআরএল-ডি টাইপ করার অভ্যাস করুন।

আপনি যদি শীর্ষ স্তরের শেলটিতে না থাকেন তবে Ctrl-D বর্তমান শেলটিতে "ইনপুটটির শেষ" সিগন্যাল করবে এবং আপনি একটি স্তর পিছনে ফিরে যাবেন।

আপনি যদি হয় শীর্ষ স্তরের শেল, আপনি একটি বার্তা পাবেন:

Use "logout" to leave the shell.

আমি এসএসএইচ শৃঙ্খলার একটি নির্দিষ্ট স্তরে ফিরে যেতে সহজ করে তুলতে শৃঙ্খলাবদ্ধ এসএসএইচ সেশনের জন্য এটি সর্বদা ব্যবহার করি । এটি নেস্টেড শেলগুলির জন্যও কাজ করে।


1
এটি অবশ্যই সহায়তা করে এবং হ্যাঁ এটি অনেক জটিলতা দূর করবে :)। আমি কেবল এটি গ্রহণযোগ্য উত্তরের সাথে একত্রিত করতে পারি :))। শর্তসাপেক্ষে সেট করা হয়েছে, তাই আমার সমস্ত সময় আমার প্রম্পটটির দিকে নজর রাখতে হবে না।
প্রণয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.