লিনাক্সে শেল ফাংশন কোথায় সংরক্ষণ করা হয়?


11

প্রথমে আমি কারণটির সন্ধান করছিলাম কারণ whichএটি আর্গুমেন্ট হিসাবে নির্দিষ্ট প্রোগ্রাম দেওয়ার পরে কিছু আউটপুট হয় না cd

আমি এখানে যা খুঁজে পেয়েছি তার থেকে সম্ভবত কারণটি হ'ল cdআমার মেশিনে একটি ফাংশন যা চালানো দ্বারা নিশ্চিত করা হয়েছে type cd

টিএলডিআর: তবে সাধারণ প্রোগ্রামগুলি যেগুলি পরিবর্তনশীলকে whichধন্যবাদ সনাক্ত করতে পারে $PATHসেগুলির মধ্যে একটি $PATHফোল্ডারে রাখা হয় , যেখানে ফাংশন বা স্ক্রিপ্টগুলি cdসঞ্চিত থাকে?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}

আমি পেতে cd is a shell builtin। আপনার শেলটির জন্য ম্যান পৃষ্ঠাটি একবার দেখুন (zsh?)
Xen2050

1
পরীক্ষা করে দেখুন unix.stackexchange.com/questions/85249/... সমস্যা একটি লিগ্যাসি কমান্ড যে ব্যবহার করা উচিত যে যা - বিশেষ করে কারণ এই প্রশ্নের মত জিনিস।
জো

উত্তর:


12

ব্যবহারকারী সংজ্ঞায়িত ফাংশন

সাধারণত ব্যাশ ফাংশনগুলি একটি bashস্টার্ট-আপ স্ক্রিপ্টে স্থায়ীভাবে সংরক্ষণ করা হয় ।

  • সিস্টেম-প্রশস্ত শুরু স্ক্রিপ্টগুলি: /etc/profileলগইন শেল এবং /etc/bashrcইন্টারেক্টিভ শেলগুলির জন্য lls
  • ব্যবহারকারী স্টার্ট-আপ স্ক্রিপ্টগুলি সংজ্ঞায়িত করে: ~/.bash_profileলগইন শেলগুলির ~/.bashrcজন্য এবং ইন্টারেক্টিভ শেলগুলির জন্য।
  • ইন্টারেক্টিভ / লগইন শেলগুলি সম্পর্কিত আরও তথ্য manইনভোকেশন বিভাগে ব্যাশ পৃষ্ঠায় পাওয়া যাবে ।

ব্যাশ শুরু হওয়ার সাথে সাথে ব্যবহারকারী সংজ্ঞায়িত শেল ফাংশনগুলি হ্যাশ (বা লকিং টেবিল) এ গতিশীলভাবে লোড করা হয়। বাশ উত্স ফাইল থেকে variable.cসারণির সংজ্ঞাটি হ'ল:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

ব্যবহারকারীর সংজ্ঞায়িত ফাংশনগুলি ব্যাশ declareকমান্ডের সাথে তালিকাভুক্ত করা যেতে পারে , অন্যান্য শেলগুলি এখনও ব্যবহার করে typeset। ব্যাশে declareসংযোজন করেছে typesetকমান্ড।

declare -f

বাশ শেলের আজীবন স্মরণে ফাংশনগুলি বিদ্যমান।

শেল সংজ্ঞায়িত (বিল্টিন) ফাংশন

এই যেমন সাধারণ ফাংশন হয় echo, printf, cdএবং :। এগুলি একটি লাইব্রেরিতে সংকলিত হয় যা bashএক্সিকিউটেবলের সাথে সংযুক্ত থাকে । এক্সিকিউটেবলের মধ্যে সংজ্ঞাগুলি তৈরি করা বাহ্যিক সংজ্ঞা লোড করার সাথে তুলনা করে সময় সাশ্রয় করে। বাশ উত্সের ডিরেক্টরিতে এই ফাংশনগুলির জন্য সংজ্ঞা ( .defউত্স ফাইলগুলিতে ধারণ করা হয় যা সি উত্সে পার্স করা হয়) রাখা হয় builtins

একটি উপকারী একদিকে: শেল বিল্টিন কমান্ড ব্যবহারের তথ্যের জন্য help <command>। যেমন

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare

এই উত্তরের জন্য আপনাকে ধন্যবাদ। এটি ঠিক আমি যা খুঁজছিলাম। আপনি কি মনে করেন বাশ ফাংশনগুলি তৈরির প্রক্রিয়া তৈরি করার একটি সরঞ্জাম রয়েছে বা এর মতো কিছু দেখায় typesetযে কোনও ফাইল / স্ক্রিপ্ট কোনও ফাংশন তৈরি / পরিবর্তনের কারণ ঘটেছে?
গ্যাব্রিজেল Šimunović

আমি এই জাতীয় কোনও সরঞ্জাম জানি না - এটি কোনও ক্রিয়াকলাপ সংজ্ঞাটির উত্স ফাইল প্রদর্শন করার জন্য কমান্ড declareবা typesetকমান্ডের জন্য একটি দরকারী বিকল্প হবে । আমি মনে করি এটি একটি সফটওয়্যার ইঞ্জিনিয়ারিং সমস্যা। সম্প্রতি একটি .aliasফাইলে সংজ্ঞায়িত শেল ফাংশনটি পেয়েছে - যা আমি প্রত্যাশা করছিলাম তা নয়!
সন্দেহভাজন

8

শেল ফাংশনগুলি শেলের স্মৃতিতে সংরক্ষণ করা হয় (বা, সম্ভবত, অননুমোদিত অস্থায়ী ফাইলগুলিতে)। তারা কোনো ব্যবহারযোগ্য ভাবে শেল শুরু না হওয়া পর্যন্ত কোন অস্তিত্ব নেই (যেমন, যখন আপনি একটি CLI লগইন অথবা এর মত শেল জানালা শুরু xterm) এবং তারা সংজ্ঞায়িত করা হয় (যেমন, পড়ার মাধ্যমে .bashrc, .bash_profileবা অনুরূপ কিছু) এবং তারা ক্ষান্ত শেল সমাপ্ত হলে উপস্থিত।


1
প্রম্পটে আপনি টাইপের যে কোনও কিছুর সাময়িক প্রকৃতি গুরুত্বপূর্ণ। আমার ভোট এই উত্তরে যায়। আপনি যদি cd () { pwd; builtin cd "$@"; }প্রম্পটে টাইপ করেন তবে আপনার বর্তমানে চলমান শেলের স্মৃতিতে কেবল স্থানটি সঞ্চিত রয়েছে। (আমার উদাহরণ বাশ তবে একই নীতিটি কোনও শেলের ক্ষেত্রে প্রযোজ্য))
ট্রিপলি

6

cdএবং অন্যান্য সাধারণ কমান্ডগুলির মতো echo, typeএবং aliasএকে বিল্টইন বলে

বিল্টিন কমান্ডগুলি শেলের মধ্যেই অন্তর্ভুক্ত থাকে এবং বিভিন্ন শেলের কমান্ডে বিভিন্ন বিল্ট থাকতে পারে।


4
আমি জানি না যে বিল্টিন কমান্ডগুলির মতো এক্সিকিউটেবল কোডটি cdশেল প্রোগ্রামের মধ্যেই রয়েছে, যেমন ফাইলের মধ্যে এটি /bin/bashযদি আপনার শেল থাকে তবে এটি জোর দেওয়া উচিত কিনা। (আমি মনে করি যে এখানে আপনার শব্দটি স্পষ্ট, তবে আমি মানুষকে বিভিন্ন ধরণের জিনিসগুলিতে বিভ্রান্ত করতে দেখেছি))
ডেভিড জেড

1

সুপার ব্যবহারকারী প্রশ্ন বাশ ফাংশনটির সংজ্ঞাটি অনুসন্ধান করা এটির সাথে নিবিড়ভাবে সম্পর্কিত। ব্যবহারকারী HairOfTheDog প্রদান এই উত্তর (paraphrased):

নিম্নলিখিত কমান্ডগুলি কোনও ফাংশনের সংজ্ঞাটির অবস্থান (ফাইলের নাম এবং লাইন নম্বর) প্রতিবেদন করবে। নামে একটি ফাংশন ধরে নেওয়া foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

উদাহরণস্বরূপ, এই কমান্ডগুলির আউটপুট হতে পারে:

foo 32 /source/private/main/developer/cue.pub.sh

bashউপরেরগুলি কেবলমাত্র কাজ করতে পারে এবং সাধারণভাবে পসিক্স শেলগুলিতে নয়।

এটি খুঁজে পাওয়ার জন্য ব্লু রাস্পবেরিকে ধন্যবাদ !

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