আমি কি কোনও স্থানীয় কার্যভারের ডানদিকে নিরাপদে উদ্ধৃতিগুলি বাদ দিতে পারি?
function foo {
local myvar=${bar}
stuff()
}
আমি প্রধানত আগ্রহী bash
, তবে অন্যান্য শেলগুলির কোণার ক্ষেত্রে কোনও তথ্য স্বাগত।
আমি কি কোনও স্থানীয় কার্যভারের ডানদিকে নিরাপদে উদ্ধৃতিগুলি বাদ দিতে পারি?
function foo {
local myvar=${bar}
stuff()
}
আমি প্রধানত আগ্রহী bash
, তবে অন্যান্য শেলগুলির কোণার ক্ষেত্রে কোনও তথ্য স্বাগত।
উত্তর:
উদ্ধৃতির মধ্যে প্রয়োজন হয় export foo="$var"
বা local foo="$var"
(অথবা readonly
, typeset
, declare
এবং অন্যান্য পরিবর্তনশীল প্রকাশক কমান্ড ) এ:
dash
sh
NetBSD বা এর (এছাড়াও Almquist শেল উপর ভিত্তি করে)।sh
FreeBSD 'র 9.2 বা তার থেকে বড় (দেখুন 9.3 পরিবর্তন )yash
zsh
5.1 এর পূর্বে সংস্করণ ksh
বা sh
অনুকরণ সহ (বা export var="$(cmd)"
যেখানে zsh
অন্যথায় শব্দ বিভাজন করবে (গ্লোব্বিং নয়))।অন্যথায় পরিবর্তনশীল প্রসারণটি শব্দ বিভাজন এবং / অথবা ফাইলনাম উত্পন্ন হতে পারে অন্য কোনও কমান্ডের সাথে যুক্তি হিসাবে।
এবং এর প্রয়োজন নেই:
bash
ksh
(সমস্ত বাস্তবায়ন)sh
FreeBSD 'র 9.3 অথবা ঊর্ধ্বতন সংস্করণ এরsh
(২০০৫ সাল থেকে)zsh
ইন zsh
, অনুকরণ sh
বা ksh
অনুকরণ ব্যতীত , স্প্লিট + গ্লোব কখনই প্যারামিটার বিস্তারের উপর করা হয় না, তবে কমান্ড প্রতিস্থাপনের ভিত্তিতে বিভাজন (গ্লোব নয়) সম্পন্ন হয়। সংস্করণ 5.1, export
/ local
এবং অন্যান্য ঘোষণাপত্র কমান্ডগুলি উপরের অন্যান্য শেলগুলির মতো দ্বৈত কীওয়ার্ড / বিল্টিন কমান্ডে পরিণত হয়েছে , যার অর্থ উদ্ধৃতিটি প্রয়োজনীয় নয়, এমনকি sh
/ ksh
অনুকরণ এবং এমনকি কমান্ড প্রতিস্থাপনের জন্যও।
এমন বিশেষ কেস রয়েছে যেখানে এই শেলগুলিতে এমনকি উদ্ধৃতি প্রয়োজন যেমন:
a="b=some value"
export "$a"
বা আরও সাধারণভাবে, যদি এর কিছু বাকী =
(সমেত =
) উদ্ধৃত হয় বা কিছু সম্প্রসারণের ফলাফল হয় (যেমন export 'foo'="$var"
, export foo\="$var"
বা export foo$((n+=1))="$var"
( $((...))
এটিও আসলে উদ্ধৃত করা উচিত) ...)। অথবা অন্য কথায় যখন যুক্তিটি export
বৈধ ভেরিয়েবল অ্যাসাইনমেন্ট না হয় যদি এটি ছাড়া লেখা থাকে export
।
তাহলে export
/ local
কমান্ডের নাম নিজেই উদ্ধৃত করা হয় (এমনকি মত অংশে "export" a="$b"
, 'ex'port a="$b"
, \export a="$b"
, অথবা এমনকি ""export a="$b"
), প্রায় কোট $b
যেমন AT & T ছাড়া প্রয়োজন হয় ksh
এবং mksh
।
যদি export
/ local
বা এর কিছু অংশ কিছু বিস্তারের ফলাফল হয় (যেমন cmd=export; "$cmd" a="$b"
বা তেমনও export$(:) a="$b"
) বা এর মতো জিনিসগুলিতে dryrun=; $dryrun export a="$b"
) তবে প্রতিটি শেলের মধ্যে উদ্ধৃতিগুলি প্রয়োজন।
এর ক্ষেত্রে > /dev/null export a="$b"
, উদ্ধৃতিগুলি দরকার pdksh
এবং এর কিছু ডেরাইভেটিভ রয়েছে।
কারণ command export a="$b"
, প্রতিটি শেলের মধ্যে উদ্ধৃতিগুলি প্রয়োজন তবে mksh
এবং ksh93
(একই বিস্তৃতি সম্পর্কে command
এবং export
কিছু বিস্তারের ফলাফল হিসাবে নয়)।
এগুলি লেখার সময় কোনও শেলের প্রয়োজন নেই:
foo=$var export foo
(সেই বাক্য গঠন বর্ন শেলের সাথেও সামঞ্জস্যপূর্ণ তবে সাম্প্রতিক সংস্করণগুলিতে zsh
, কেবল যখন sh
/ ksh
অনুকরণে কাজ করা হয়)।
(মনে রাখবেন যে var=value local var
শাঁসগুলির মধ্যে আচরণের পরিবর্তিত হওয়ার কারণে ব্যবহার করা উচিত নয়)।
আরও মনে রাখবেন যে export
কোনও অ্যাসাইনমেন্ট সহ ব্যবহার করার অর্থ হ'ল cmd
ইন-এর প্রস্থান স্থিতি export var="$(cmd)"
হ'ল। export var; var=$(cmd)
সমস্যাটি না হওয়ায় এটি করা ।
এছাড়াও এই বিশেষ ক্ষেত্রে থেকে সাবধান bash
:
$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b
আমার পরামর্শ সর্বদা উদ্ধৃত করা হবে।
zsh
উদ্ধৃতি হয় জন্য প্রয়োজনীয় local foo="$(cmd)"
কারণ wordsplitting (কিন্তু ফাইলের নাম প্রজন্মের) হয় (কিন্তু unquoted প্যারামিটার প্রসারণও জন্য নয়) unquoted কমান্ড বদল জন্য সঞ্চালিত, যদি না KSH_TYPESET
সক্ষম হলে, যা কেস কোট করা হয় না প্রয়োজন। ধারণা তৈরী কর? কোন? আপনি যখন যা করছেন ঠিক কী না তা আপনি যদি না জানেন তবে সর্বদা সব কিছু উদ্ধৃত করুন।
আমি সাধারণত ভেরিয়েবলগুলির যে কোনও ব্যবহারের কথা উদ্ধৃত করি যেখানে সাদা স্পেসের মতো অক্ষর থাকতে পারে। অন্যথায় আপনি এই জাতীয় সমস্যার মধ্যে চলে যাবেন:
#!/bin/bash
bar="hi bye"
function foo {
local myvar=${bar}
printf "%s\n" $myvar
printf "%s\n" "$myvar"
}
foo
কোনও কার্যক্রমে ভেরিয়েবলের ব্যবহারের উদ্ধৃতিগুলির প্রয়োজন মনে হয় না, তবে আপনি যখন এটি ব্যবহার করতে যান তবে printf
আপনাকে সেখানে উদ্ধৃত করা দরকার:
printf "%s\n" "$myvar"
দ্রষ্টব্য: মনে রাখবেন যে ভেরিয়েবলটি $IFS
বিভাজক অক্ষরগুলি কী তা নিয়ন্ত্রণ করে।
IFS The Internal Field Separator that is used for word splitting after
expansion and to split lines into words with the read builtin command.
The default value is ``<space><tab><newline>''.
বাশে ডিবাগিং সক্ষম করে আমরা পর্দার আড়ালে কী ঘটছে তা দেখতে পাচ্ছি।
$ bash -x cmd.bash
+ bar='hi bye'
+ foo
+ local 'myvar=hi bye'
+ printf '%s\n' hi bye
hi
bye
+ printf '%s\n' 'hi bye'
hi bye
উপরের অংশে আমরা দেখতে পাচ্ছি যে পরিবর্তনশীলটিকে $bar
সূক্ষ্ম হাতে তুলে দেওয়া হয়েছিল $myvar
তবে আমরা যখন ব্যবহার করতে $myvar
যাই তখন যখন আমরা $myvar
এটি ব্যবহার করতে গিয়েছিলাম তখন এর বিষয়বস্তুগুলির জ্ঞানীয় হতে হয়েছিল ।
bash
এবং ksh
এ local
/ typeset
... বিশেষ builtins)।