কোনও বাশ শব্দের একটি উপনাম, ফাংশন, ফাইল ইত্যাদি উল্লেখ করার জন্য কীভাবে বাধ্য করবেন?


13

কোনও সম্পর্কিত প্রশ্নের সাথে আরও কিছু বিশদ যুক্ত করার চেষ্টা করার সময় , আমি বুঝতে পেরেছিলাম যে উপলব্ধ বাশ শব্দের মধ্যে কোনটি কার্যকর করতে হবে তা নির্দিষ্ট করে জানাতে হবে না। মতে help typeপাঁচটি শব্দ ধরনের হয়:

  • উপনাম
  • শব্দ
  • ক্রিয়া
  • builtin
  • ফাইল

শব্দের পক্ষে বিভিন্ন ধরণের ( trueএটি একটি উদাহরণ মাত্র; আরও সাধারণভাবে ওভাররাইড হওয়া শব্দটি হতে পারে cd) পক্ষে এটি সম্ভব :

$ type -a true
true is a shell builtin
true is /bin/true

আপনি কীভাবে একটি নির্দিষ্ট প্রতিশব্দটি কার্যকর করতে বাধ্য করেন? এখনও পর্যন্ত, অগ্রাধিকারের ক্রম অনুসারে:

  • অন্যান্য নাম: এটি অন্যান্য বিশেষ প্রতিশব্দগুলির চেয়ে প্রাধান্য পাওয়ায় এটি একটি বিশেষ কেস। এটি বাধ্যতামূলককরণ কেবল তখনই কার্যকর হবে যখন কমান্ডটি ব্যর্থ হওয়া উচিত যদি উপনামটি সংজ্ঞায়িত না করা হয়।

    $ 
  • মূল শব্দ:

    $ 
  • ফাংশন:

    $ 
  • builtin:

    $ builtin true
  • ফাইল:

    $ command true
    $ $(which true)
    $ /bin/true

আংশিক সমাধান :

  • একটি শব্দের উদ্ধৃতিতে উপকরণ এবং কীওয়ার্ডগুলি বাদ দেওয়া হয়। এটাই,

    $ 'true'

    শুধুমাত্র ফাংশন, বিল্টিন বা ফাইল চালাবে।

উত্তর:


10

আপনি যা জিজ্ঞাসা করছেন তা সত্যিকার অর্থে কোনও অর্থবোধ করে না।

কীওয়ার্ডের অর্থ এটি একটি শব্দ যা শেলের সিনট্যাক্সের অংশ। এগুলি টোকেনাইজিংয়ের মাধ্যমে স্বীকৃত। শেল সনাক্ত করা বন্ধ করার জন্য এগুলির উদ্ধৃতি যথেষ্ট।

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

এলিয়াস (zsh এলিয়াস ব্যতীত সংজ্ঞায়িত alias -gকেবল কমান্ড পজিশনে প্রসারিত হয়), তাই সাধারণত হয় না builtin the-alias

ফাংশনগুলির বিল্টিনগুলির চেয়ে প্রাধান্য রয়েছে এবং বাহ্যিক আদেশগুলি (এবং তারপরে $PATHকোনটি ব্যবহার করবেন তা স্থির করে) to

আপনি বিল্টিনকে এর সাথে জোর করতে পারেন:

builtin the-cmd and its args

(যদিও এটি লক্ষ করা উচিত এটি কোনও স্ট্যান্ডার্ড কমান্ড নয়)।

আপনি উপনামগুলি উদ্ধৃত করে অক্ষম করতে পারেন (যদিও উদ্ধৃত সংস্করণটি কিছু শেলের মধ্যেও এলিয়াস করা যেতে পারে)।

সুতরাং, উদাহরণস্বরূপ (এখানে zsh বাক্য গঠন), এতে:

'while'() echo function while
alias 'while=echo alias while'

লেখালেখি while trueআসলে আউটপুট হবে alias while true, এবং whileকীওয়ার্ডটি ব্যবহার করার কোনও উপায় নেই যেহেতু এটি উদ্ধৃত করার সাথে সাথে ওরফে এবং কীওয়ার্ড উভয়ই অক্ষম হয়ে যাবে।

whileউদাহরণস্বরূপ আপনি এই ফাংশনটি কল করবেন :

'whi'le whatever

যদি কোনও whileবিল্টিন থাকে (তবে অবশ্যই তাদের সেই শব্দগুলিতে whileকীওয়ার্ড নেই তবে), আপনি এটি লিখতে পারেন:

builtin while whatever

এবং whileআদেশটি কল করতে , আপনি লিখতে চাই:

env while whatever

বা ইন zsh(যখন shঅনুকরণে নয়):

command while whatever 

(অন্যান্য শেলগুলিতে, commandকেবল বিল্টিনগুলি নয়, ফাংশনগুলি প্রতিরোধ করে)

অথবা

/full/path/to/while whatever

অবশ্যই, কিছুই এমনকি এমনকি চটজলদি কাজগুলি থেকে বিরত রাখছে না:

alias 'while=while "w"hile; do'
"while"() { while "whi"le; done; }

যা কমপক্ষে zsh এ বৈধ (তবে বোকা) is


উপনামের অনুসন্ধানকে command দমন করে , এবং ফাংশন লুক্কিটকে দমন করে তবে এগুলির মধ্যে কোনওটিই নির্দিষ্ট করে না যে বাকী কোন প্রতিশব্দ ব্যবহার হবে। আমি কেবল একটি নির্দিষ্ট প্রতিশব্দ ব্যবহার করতে নির্দিষ্ট করার জন্য একটি উপায় খুঁজছি ।
l0b0

@ l0b0 "কমান্ড" সমস্ত উপন্যাস, কীওয়ার্ড এবং বিল্টিনকে দমন করে।
স্টাফেন চেজেলাস

বোধগম্য হিসাবে, builtinউদাহরণস্বরূপ আরভিএমকেcd একটি দুর্দান্ত প্রভাবের জন্য ওভাররাইড করতে ব্যবহৃত হয় ।
l0b0

তুমি ঠিক বলছো; এবং আমি কেবল যাচাই করেছি যে এটি ফাংশনগুলিও দমন করে। +1 টি।
l0b0

0

আমার জন্য একটি অত্যন্ত দরকারী প্রতিমা হ'ল:

FALSE=1; TRUE=0
DEVEL_FLAG=$FALSE
...
in_development() { return $DEVEL_FLAG ; }
cd()
{
 if in_development ; then # -D argument to script toggles development flag
   echo "Would run cd $*"
  else
   builtin cd "$@"
 fi
}

এখন যদি আমি স্ক্রিপ্ট -D নির্দিষ্ট করে চালিত করি তবে বিকাশ মোড সক্রিয় হয় এবং সিডি (বা অন্য কোনও মোড়ানো কমান্ড) ডিবাগ তথ্য প্রতিধ্বনিত করে

এটি বিশেষত স্ক্রিপ্টগুলির সাথে দরকারী যা ssh চালায়। অবশ্যই আমি সেট-এক্স টগল করতে পারি, তবে এটি আমার জন্য আরও দরকারী এবং পাঠযোগ্য।


1
কিভাবে এই প্রশ্নের উত্তর দেয়?
l0b0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.