আপনি যে লাইনটি নির্ধারণ করেছেন সেভাবে কেন ভেরিয়েবলগুলি রফতানি করবেন না?


44

থেকে পূর্ববর্তী কমান্ডের গত যুক্তি কী?

শেলচেক আপনাকে বলছে যে একই লাইনে আপনি ভেরিয়েবলগুলি রফতানি করবেন না।

আমি ভাবছিলাম কেন?

একই পরামর্শ প্রযোজ্য করার alias, declare, export, local, readonly, এবং typeset?




9
প্রশ্নে শেলচেক নিয়মটি এসসি 2155। শেলচেক উইকিতে বেশ ভাল ডকুমেন্টেশন রয়েছে ।
ফোনেহেহে

3
এছাড়াও কিছু পুরানো শেল এক সাথে exportঅ্যাসাইনমেন্ট গ্রহণ করবে না । Heirloom বোর্ন শেল , উদাহরণস্বরূপ, আউটপুট একটি "foo বিন্যাস = 2 একটি আইডেন্টিফায়ার নয়" ত্রুটি।
ডেনিস উইলিয়ামসন 21

উত্তর:


54

সমস্যা যে ব্যাশ প্রতিটি কমান্ডের শুধুমাত্র একটি প্রস্থান কোড আছে। যখন আপনি export foo="$(false)"প্রস্থান করার কোডটি falseকেবল বাতিল করা হয়। আপনি যদি পরিবর্তে না

foo="$(false)"
export foo

ব্যর্থ প্রথম কমান্ডের উপর কাজ করা যেতে পারে, উদাহরণস্বরূপ errexitসেটিংস দ্বারা ।

একটি স্ট্রিং আক্ষরিক যেমন ঘোষনা করা এবং নির্ধারণ করা export foo='bar'অবশ্যই এই সমস্যায় ভুগছেন না। তবে পরিবর্তন সফ্টওয়্যার বিকাশের একমাত্র ধ্রুবক, এবং ভবিষ্যতের প্রমাণের পক্ষে এই জাতীয় বিবৃতিগুলিকে আলাদা করে দেওয়ার পক্ষে এটি কেবল ভাল গৃহকর্মী।

অ্যাসাইনমেন্ট সুনির্দিষ্ট কমান্ডগুলির পাশাপাশি আপনি উল্লেখ করেছেন যে একটি একক অ্যাসাইনমেন্টে একাধিক কমান্ড রয়েছে যেমন foo="$(false)$(true)"। দেখুন pipefailমধ্যে man bashএখনও অন্য ধরনের ফাঁদ জন্য।

আরেকটি বিষয় মনে রাখতে হবে তা হল ঘোষণার ক্রম এবং কার্যভারটি কখনও কখনও প্রাসঙ্গিক। উদাহরণস্বরূপ, আপনি ভেরিয়েবলগুলি অর্পণ করার আগে তাদের ডিক্লেয়ার করতে চাইবেন । (দুর্ভাগ্যক্রমে ভেরিয়েবলগুলি প্রথমবারের আগে বরাদ্দ দেওয়ার আগে তা ঘোষণা করা সম্ভব নয় ))local readonly


সুতরাং যদি কেউ একটি আক্ষরিক থেকে একটি পরিবর্তনশীল সেট করে চলেছে, এবং বাতিল করার জন্য কোনও প্রস্থান কোড নেই, তবে সমস্ত লাইনে এক লাইনে করাতে কোনও দোষ নেই।
মন্টি হার্ডার

1
যতক্ষণ না এই শেলচেক ত্রুটি সম্পর্কিত, না। তবে এখন মুছে ফেলা উত্তরগুলি তাদের অর্ধ-অধিকার পেয়েছে, বোর্ন শেল অ্যাসাইনমেন্ট সিনট্যাক্সকে সমর্থন করে না export, তাই কয়েক বছর ধরে এটি করার বিষয়ে বুদ্ধি পাওয়া গেল যদি কারো দোভাষীর বর্ন শেল হতে পারে।
জেডিবিপি

@ জেডিবিপি, নোট করুন যে বোর্ন শেলটি সমর্থন করেছিল foo=$(cmd) export foo, যদিও একই সতর্কতার সাথে যেটির cmdপ্রস্থান স্থিতি হ্রাস পেয়েছে (তবে ব্যর্থ হলে শেলটি প্রস্থান করতে পারে set -e)।
স্টাফেন চেজেলাস

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