বাশার্কে উপন্যাস ব্যবহার করার সময় কীভাবে সম্ভাব্য দ্বন্দ্বের জন্য পরীক্ষা করা যায়?


12

বাশারসিডি আপডেটের কারণে ওরফে কমান্ড জড়িত থাকার কারণে সিস্টেমে ঘটে যাওয়া সমস্ত কমান্ড বিবাদগুলি তালিকাভুক্ত করার কি সহজ উপায় আছে?

উদাহরণস্বরূপ, কেউ alias ls=/path/to/user-generated/executableবাশার্কে লিখেছেন । কেউ কীভাবে জানতে পারে যে এটি একটি আসল কমান্ডটি মাস্কিং করছে ( ls)। একটি উপায় বলে মনে হচ্ছে বাশার্কের স্যোসোরিংয়ের আগে এবং পরে সমস্ত এলিয়াস চালানো এবং আউটপুটকে আলাদা করা। এর চেয়ে ভাল উপায় আছে কি?

আমি উবুন্টু 12.04 চালাচ্ছি।

বাশ - রূপান্তর

জিএনইউ বাশ, সংস্করণ ৪.২.২৪ (1) -রেলিজ (i686-pc-linux-gnu)


পার্শ্ব নোট হিসাবে, বাশ সম্পর্কিত কোনও প্রশ্ন জিজ্ঞাসা করার সময় ওএস সংস্করণ না করে আপনি আপনার ভার্সনের বাশার সংস্করণ সরবরাহ করেন কিনা তা উত্তর দেওয়ার ক্ষেত্রে এটি সাধারণত আরও সহায়ক।
জর্ডানম

@ জোর্ডানম আপডেট হয়েছে।
ব্যবহারকারী 13107

উত্তর:


8

অন্যান্য আদেশ দ্বারা কমান্ডগুলি কীভাবে মাস্ক করা হয়েছে তা জানতে, এই জাতীয় কিছু করুন:

alias | sed 's/^[^ ]* *\|=.*$//g' | while read a; do
  printf "%20.20s : %s\n" $a "$(type -ta $a | tr '\n' ' ')"
done | awk -F: '$2 ~ /file/'

ব্যাখ্যা

aliasএকাই সংজ্ঞায়িত উপাধিকার তালিকা করে এবং sedতাদের নাম বের করে। কিছুক্ষণ লুপটি type -taতাদের প্রত্যেকের উপর চলতে থাকে এবং awkলাইনগুলি মুদ্রণ করে যা উভয়রই নাম এবং ফাইল থাকে।


15

typeবাশ দ্বারা একটি আদেশ কীভাবে ব্যাখ্যা করা হবে তা জানতে আপনি ব্যবহার করতে পারেন ।


উদাহরণস্বরূপ, এখানে type lsপ্রিন্ট ls is aliased to `ls --color=auto'করুন।
l0b0

একই সাথে কাজ করে which, তবে আমি এখন না করি যদি উভয় (টাইপ, যা) শেল বিল্টইন একই থাকে।
গণিত

@ ম্যাথ: type whichআপনাকে বলে which is /usr/bin/which, সুতরাং এটি কোনও বিল্টিন নয়। অতএব, এটি কোনও বিল্টিন বা না (উদাহরণস্বরূপ which echoবনাম type echo) কিনা তা আপনাকে বলতে পারে না ।
চোরোবা

আমার ধারণা এটি আপনার ব্যবহৃত শেলের উপর নির্ভর করে: type which which is a shell builtinআমি zsh ব্যবহার করছি।
গণিত

@ ম্যাথ: আসল প্রশ্নটি ট্যাগ / বাশ।
চোরোবা

7

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

কমান্ডটি একটি উপনাম কিনা তা অনুসন্ধান করতে alias lsআপনার ক্ষেত্রে ব্যবহার করুন, যদি এটি আপনাকে "খুঁজে পাওয়া যায় না" এর মতো কিছু বলে দেয় তবে এটি একটি নাম নয়, অন্যথায় এটি।

উপনামটিকে উপেক্ষা করে মূল ফাংশন চালু করতে, স্ল্যাশের উপসর্গ স্থাপন করুন, উদাহরণস্বরূপ, \lsআসল হ্যাশ এলএস চালু হবে, উপনামটিকে উপেক্ষা করুন।

সম্পাদনা

আপনি যদি কমান্ডটি একটি উপনাম কিনা তা দ্রুত জানতে চান, আপনি set -xযদি চালনা করেন তবে এখন আপনি ডিবাগিং মোড সক্ষম করতে পারবেন ls:

এখানে চিত্র বর্ণনা লিখুন

আপনি বাস্তব কমান্ডের একটি ডিবাগ আউটপুট কার্যকর করতে দেখবেন

ডিবাগ মোডটি আনসেট করতে, ব্যবহার করুন set -


ধন্যবাদ। কিন্তু aliasঅংশটি পেল না । যদি কোনও ব্যবহারকারী জানেন না যে একটি কমান্ড রয়েছে (উদাহরণস্বরূপ ls)? দৌড়ানোর পরে তিনি কেবল যে জিনিসটি জানতে পেরেছেন alias lsতা হ'ল এটি ম্যাপ কী এবং এটির সাথে ম্যাপ কী ছিল তা নয়। আমার ধারণা দ্বন্দ্ব সন্ধান করার জন্য একটির সাথে এবং ছাড়াও সমস্ত কমান্ড চালাতে হবে।
ব্যবহারকারী 13107

@ ব্যবহারকারী 13107 উত্তর আপডেট করেছেন
ডেইজি

ধন্যবাদ। আমি কীভাবে ট্রেসিং আনসেট করব?
ব্যবহারকারী 13107

@ ব্যবহারকারী 13107 আবার আপডেট হয়েছে ;
ডেইজি

1
"দ্বন্দ্বগুলি তালিকাভুক্ত করার কোনও উপায় নেই" - আপনি যথেষ্ট কল্পনাপ্রসূত নন।
ক্যামহ

6

আপনি compgenসমস্ত কমান্ড এবং সমস্ত এলিয়াস ব্যবহার করে একটি তালিকা পেতে ব্যাশ বিল্টিন ব্যবহার করতে পারেন compgen -ac। যে কোনও কমান্ড যা একটি উপাধিও রয়েছে সেটিকে এই তালিকায় নকল করা হবে, সুতরাং সহজ সরল সমাধান হ'ল আউটপুটে ডুপ্লিকেটগুলি সন্ধান করা compgen -ac

যাইহোক, কোনও কমান্ড দু'বার পথে থাকলে সদৃশগুলিও উপস্থিত হতে পারে। উদাহরণস্বরূপ, আমার কাছে /bin/whichএবং /usr/bin/whichতাই এটি একটি উপনাম না হলেও দু'বার compgen -acতালিকা প্রদর্শন করবে which

সুতরাং যা দরকার তা হ'ল সমস্ত অনুলিপিগুলি থেকে পাওয়া compgen -acএবং এটিকে উপস্বের তালিকার সাথে তুলনা করা। কেবলমাত্র অনুলিপিগুলি যা উপাধিও হ'ল হ'ল আদেশগুলি হ'ল আদেশগুলি hide আমরা comm(1)কমান্ড এবং ব্যাশ প্রক্রিয়া বিকল্পের সাথে এটি করতে পারি ।

comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d) 

compgen -a | sortসমস্ত এলিয়াসের তালিকা (এর জন্য বাছাই করা comm)। compgen -ac | sort | uniq -dকমান্ড এবং উপস্বের তালিকা থেকে সমস্ত নকলের তালিকা। comm -12উভয় ক্ষেত্রেই কেবল একই লাইনগুলি আউটপুট দেয়।


5

বাশ যখন ইন্টারেক্টিভ শেলটি ডাকে তখন ঠিক কী ঘটছে তা দেখতে আপনি শেল ডিবাগিং বৈশিষ্ট্যটি ব্যবহার করতে পারেন। নিম্নলিখিতটি আপনাকে লগইন শেল থেকে ইন্টারেক্টিভ শেল তৈরি করার সময় নির্ধারিত সমস্ত উপনামগুলি দেখায়:

bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
  • -x -> ডিবাগিং সক্ষম করুন
  • -l -> লগইন শেল
  • -i -> ইন্টারেক্টিভ শেল
  • -c -> আদেশ

কমান্ড প্রস্থানটি চালানো প্রয়োজন যাতে শেলটি ফিরে আসে। -iএই ক্ষেত্রে প্রয়োজন বোধ করা হয় কারণ ব্যাশ কমান্ড অন্যথায় চালানোর জন্য একটি ইন্টারেক্টিভ পরিবেশ সেট আপ না।

আমার সিস্টেমের উদাহরণ এখানে:

$ bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
++ alias 'ls=ls --color=auto'
$ alias -p
alias ls='ls --color=auto'

উলেসটি যখন ফাইলটি ঘটেছিল তা নির্ধারণের জন্য যখন নির্ধারিত হয়েছিল তখন শেষবার কোন ফাইলটি উত্সাহিত হয়েছিল তা দেখার জন্য, আপনি গ্রেপটি প্রসারিত করতে পারেন:

bash -x -l -i -c 'exit' 2>&1 | grep -E ' (alias|[.]|source) '

এটি মিথ্যা ইতিবাচক প্রত্যাবর্তন করতে পারে, তবে আপনি যদি ম্যানুয়ালি ফিরে আসা ডেটাগুলি পরীক্ষা করে থাকেন তবে তা ঠিক হওয়া উচিত। এক্সিকিউটেড কমান্ডের সামনে '+' চিহ্নের সংখ্যা গভীরতা নির্দেশ করে।

+ . /home/jordan/.bashrc
++ alias 'ls=ls --color=auto'
++ . /home/jordan/.foo
+++ alias t=test
++ alias t=test2

এই নমুনা আউটপুটে এটি দেখায় যে .bashrc ls, .foo এলিয়াসগুলির জন্য একটি উপসর্গ সেট করে tএবং তারপরে .Bashrc এর পূর্ববর্তী উপন্যাসটিকে ওভাররাইড করে t


ধন্যবাদ। এটি অবশ্যই কার্যকর, তবে এটি সংঘাত কীভাবে উপকরণ তৈরি করে তা কীভাবে তা দেখতে সক্ষম হয় না।
ব্যবহারকারী 13107

@ ব্যবহারকারী 13107 আমি আরও কিছু বিশদ যুক্ত করেছি যা সহায়ক হওয়া উচিত। একটি নতুন মান একটি উপাধি সেট একটি "বিরোধী" উপন্যাস নয়। এটি স্বাভাবিক নথিভুক্ত আচরণ, এ কারণেই একটি চক্রাকার পথ প্রয়োজন way
জর্ডানম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.