বাশের এক্সপোর্ট -f এর zsh সমতুল্য কি?


24

সুতরাং আমি ব্যবহার শুরু zsh। আমার সব ঠিক আছে। এটি খুব দুর্দান্ত এবং চটজলদি মনে হচ্ছে, এবং বর্তমান কার্যনির্বাহী ডিরেক্টরি এবং প্রকৃত কমান্ড লাইন বিভিন্ন লাইনে রয়েছে তা খুব সুন্দর তবে একই সাথে আমি লক্ষ্য করছি যে zshএটির চেয়ে কিছুটা ধীর হতে পারে bashবিশেষত পাঠ্যটি প্রিন্ট করার সময় পর্দা।

আমি যে জিনিসটি সবচেয়ে ভাল পছন্দ করেছি তা zshহ'ল আমার পিছনে সংজ্ঞায়িত সমস্ত ফাংশনের সাথে 'পশ্চাদপটে সামঞ্জস্যপূর্ণ' .bashrc

একটি গ্রিপ যদিও। ফাংশনগুলি সমস্ত নিখুঁতভাবে কাজ করে তবে রফতানি ব্যবস্থা কীভাবে কাজ করে তা আমি বুঝতে পারি না।

আমার সেই কয়েকটি .bashrcফাংশন রফতানি হয়েছিল যাতে আমি এগুলি অন্যত্র যেমন স্ক্রিপ্ট এবং বাহ্যিক প্রোগ্রামগুলিতে ব্যবহার করতে পারি export -f

Zsh এ, রফতানির বিষয়ে কথা হয় বলে মনে হয় না। এটা কি অটোলয়েডিং? এই দুটি জিনিস কি এক? আমি এটি বুঝতে খুব মারাত্মক সময় কাটাচ্ছি।


2
এটি খুব পুরানো প্রশ্ন, তবে আমি বলতে চাই যে "বর্তমান ওয়ার্কিং ডিরেক্টরি এবং প্রকৃত কমান্ড লাইন বিভিন্ন লাইনে রয়েছে" zsh এর সাথে মোটেই কিছুই করার নেই। এটি নির্ভর করে আপনি কীভাবে আপনার প্রম্পট সেট আপ করেন তার উপর নির্ভর করে।
4ae1e1

উত্তর:


11

এনভায়রনমেন্ট ভেরিয়েবলগুলি রয়েছে ফাংশনগুলি একটি ব্যাশ হ্যাক hack Zsh এর মতো কিছু নেই। আপনি কয়েকটি লাইনের কোডের সাথে অনুরূপ কিছু করতে পারেন। পরিবেশের ভেরিয়েবলগুলিতে স্ট্রিং থাকে; শ্যাশশকের আবিষ্কারের আগে বাশনের পুরানো সংস্করণগুলি ফাংশনের কোডটি একটি ভেরিয়েবলে সঞ্চিত করে যার নামটি ফাংশনটির এবং যার মান () {অনুসরণ করে ফাংশনের কোড অনুসরণ করে }। আপনি এই এনকোডিং সহ ভেরিয়েবলগুলি আমদানি করতে নীচের কোডটি ব্যবহার করতে পারেন, এবং এগুলিকে ব্যাশের মতো সেটিংস দিয়ে চালানোর চেষ্টা করতে পারেন। নোট করুন যে zsh সমস্ত বাশ বৈশিষ্ট্যগুলি অনুকরণ করতে পারে না, আপনি যা কিছু করতে পারেন তা কিছুটা কাছাকাছি যেতে হবে (উদাহরণস্বরূপ $fooমানটিকে বিভক্ত করা এবং ওয়াইল্ডকার্ডগুলি প্রসারিত করা এবং অ্যারে 0-ভিত্তিক করা)।

bash_function_preamble='
    emulate -LR ksh
'
for name in ${(k)parameters}; do
  [[ "-$parameters[name]-" = *-export-* ]] || continue
  [[ ${(P)name} = '() {'*'}' ]] || continue
  ((! $+builtins[$name])) || continue
  functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"}
done

(যেমন শেলশকের মূল আবিষ্কারক স্টাফেন চেজেলাস উল্লেখ করেছেন যে, এই উত্তরের পূর্ববর্তী সংস্করণটি ফাংশন সংজ্ঞাটি ত্রুটিযুক্ত থাকলে এই সময়ে স্বেচ্ছাচারিত কোড কার্যকর করতে পারে This এটি পরিবেশ থেকে আমদানি করা কোনও ফাংশন হতে পারে))

অবৈধ ভেরিয়েবলের নাম ব্যবহার করে পরিবেশে বাশ এনকোড ফাংশনগুলির শেলশক সংস্করণ BASH_FUNC_myfunc%%। এটি তাদের নির্ভরযোগ্যভাবে পার্স করা শক্ত করে তোলে কারণ zsh পরিবেশ থেকে এই ধরনের পরিবর্তনশীল নামগুলি বের করতে কোনও ইন্টারফেস সরবরাহ করে না।

আমি এটি করার পরামর্শ দিচ্ছি না। স্ক্রিপ্টগুলিতে রফতানি ফাংশনগুলির উপর নির্ভর করা একটি খারাপ ধারণা: এটি আপনার স্ক্রিপ্টে একটি অদৃশ্য নির্ভরতা তৈরি করে। আপনি যদি কখনও এমন স্ক্রিপ্টটি এমন পরিবেশে চালিত করেন যা আপনার ফাংশন না করে (অন্য মেশিনে, ক্রোন জবটিতে, শেল ইনিশিয়ালাইজেশন ফাইলগুলি পরিবর্তন করার পরে ...), আপনার স্ক্রিপ্টটি আর কাজ করবে না। পরিবর্তে, আপনার সমস্ত ফাংশন এক বা একাধিক পৃথক ফাইলে সংরক্ষণ করুন (এর মতো কিছু ~/lib/shell/foo.sh) এবং এতে ব্যবহৃত ফাংশনগুলি আমদানি করে আপনার স্ক্রিপ্টগুলি শুরু করুন . ~/lib/shell/foo.sh। এইভাবে আপনি যদি সংশোধন করেন তবে foo.shসহজেই অনুসন্ধান করতে পারবেন কোন স্ক্রিপ্টগুলি এর উপর নির্ভর করছে। আপনি যদি কোনও স্ক্রিপ্ট অনুলিপি করেন তবে সহজেই এটি খুঁজে পেতে পারেন যে কোন সহায়ক ফাইলগুলির প্রয়োজন।

Zsh (এবং এর আগে ksh) যেখানে স্ক্রিপ্টগুলিতে ব্যবহৃত হয় তা স্বয়ংক্রিয়ভাবে ফাংশন লোড করার একটি উপায় সরবরাহ করে এটিকে আরও সুবিধাজনক করে তোলে। সীমাবদ্ধতা হ'ল আপনি প্রতি ফাইল প্রতি একটি ফাংশন রাখতে পারেন। ফাংশনটি অটোলয়েড হিসাবে ঘোষণা করুন এবং একটি ফাইলের মধ্যে ফাংশন সংজ্ঞা রাখুন যার নাম ফাংশনের নাম। এই ফাইলটিকে তালিকাভুক্ত ডিরেক্টরিতে রেখে দিন $fpath(যা আপনি FPATHপরিবেশের পরিবর্তনশীলের মাধ্যমে কনফিগার করতে পারেন )। আপনার স্ক্রিপ্টে, এর সাথে অটোলোজেড ফাংশনগুলি ঘোষণা করুন autoload -U foo

তদাতিরিক্ত পার্সিং সময় সাশ্রয়ের জন্য zsh স্ক্রিপ্টগুলি সংকলন করতে পারে। zcompileএকটি স্ক্রিপ্ট সংকলন করতে কল করুন । এটি .zwcএক্সটেনশন সহ একটি ফাইল তৈরি করে । যদি এই ফাইলটি উপস্থিত থাকে তবে autoloadউত্স কোডের পরিবর্তে সংকলিত ফাইলটি লোড করবে। আপনি কোনও ডিরেক্টরিতে সমস্ত ফাংশন সংজ্ঞা সংকলন করতে পুনরায় zrecompileফাংশনটি ব্যবহার করতে পারেন ।


1
মজার কিভাবে আপনার কোড একই ShellShock দুর্বলতার হয়েছে bashছিল (যাচাই নয় যে ভেরিয়েবলের বিষয়বস্তু শুধুমাত্র একটি ফাংশন সংজ্ঞা এবং মত কোন পরিবর্তনশীল নাম প্রক্রিয়াকরণ HTTP_HOSTবা LC_X)। অন্যথায় ভাল উত্তর।
স্টাফেন চেজেলাস

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

আপনি এখন CVE-2014-6271 এর সমতুল্য ঠিক করে ফেলেছেন, তবে এখনও সম্ভবত CVE-2014-6277 / 6278 ধরণের অনেকগুলি দুর্বলতার মুখোমুখি হয়ে গেছেন ... আপনি এখনও কোনও ভেরিয়েবলের কোডে zsh পার্সার প্রকাশ করছেন বলে! কিছু যে কিছু প্রেক্ষিতে হামলাকারীদের নিয়ন্ত্রণে সম্ভাব্য নেই (কোড হিসেবে সহ zsh -c 'functions[f]=$VAR' হয় পার্স এমনকি যদি fফাংশন কখনো বলা হয়)। সমাধানটি কেবল সেই ভেরিয়েবলগুলি বিবেচনা করা উচিত যার নামগুলি সেইগুলির মতো সংরক্ষিত টেম্পলেট অনুসরণ করে $BASH_FUNC_x%%, তবে আপনি যেমন বলেছিলেন zshসেগুলির তালিকা বা পুনরুদ্ধারের জন্য কোনও এপিআই নেই। আপনি perlউদাহরণস্বরূপ কল প্রয়োজন ।
স্টাফেন চেজেলাস

7

যদি আপনি নিজের ফাংশন ঘোষণাটি .zhenv-রাখেন তবে আপনার ফাংশন কোনও প্রচেষ্টা ছাড়াই কোনও স্ক্রিপ্ট থেকে ব্যবহারযোগ্য হবে।


কেন আপনি আমার উত্তরকে নিম্নচাপ করলেন? দয়া করে ব্যাখ্যা করুন.
রোলগুলি

এখনও একটি উত্তরের জন্য অপেক্ষা এবং এখনও কাজ!
রোলগুলি

আমি সবেমাত্র এই উত্তরটি আবিষ্কার করেছি এবং এটি একটি আদর্শ সমাধান।
এএফএইচ

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

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