সিদ্ধান্ত আপনার. আপনি যদি $@
এর মানগুলির কোনও উদ্ধৃতি না করেন তবে অতিরিক্ত সম্প্রসারণ এবং ব্যাখ্যার মধ্য দিয়ে যায়। আপনি যদি এটিকে উদ্ধৃত করেন তবে কার্যকারিতাটি পাস করা সমস্ত আর্গুমেন্ট তার সম্প্রসারণ ভারব্যাটিমে পুনরুত্পাদন করা হয়। আপনি যে &>|
কোনও উপায়ে নিজেই যুক্তিগুলি পার্স না করে কোনওভাবেই শেল সিনট্যাক্স টোকেনকে নির্ভরযোগ্যভাবে পরিচালনা করতে সক্ষম হবেন না - এবং তাই আপনার ফাংশনগুলির মধ্যে একটির হস্তান্তর করার আরও যুক্তিসঙ্গত পছন্দগুলি আপনি রেখে গেছেন:
- একক সাধারণ কমান্ডের সাথে কার্যকরভাবে ব্যবহৃত শব্দগুলি
"$@"
।
... অথবা ...
- আপনার আর্গুমেন্টগুলির আরও বিস্তৃত এবং ব্যাখ্যাযুক্ত সংস্করণ যা কেবল তখনই সাধারণ কমান্ড হিসাবে একসাথে প্রয়োগ করা হয়
$@
।
কোনও উদ্দেশ্যই ভুল নয় যদি তা ইচ্ছাকৃত হয় এবং যদি আপনি যা পছন্দ করেন তার প্রভাবগুলি ভালভাবে বোঝা যায়। উভয় পদ্ধতির একে অপরের তুলনায় সুবিধাগুলি রয়েছে, যদিও দ্বিতীয়টির সুবিধাগুলি খুব কমই সম্ভবত বিশেষভাবে কার্যকর হবে। এখনও ...
(run_this(){ $@; }; IFS=@ run_this 'ls@-dl@/tmp')
drwxrwxrwt 22 root root 660 Dec 28 19:58 /tmp
... এটি অকেজো নয় , খুব সম্ভবত খুব বেশি ব্যবহারের সম্ভাবনা রয়েছে । এবং একটি bash
শেলের মধ্যে, কারণ bash
ডিফল্টরূপে তার পরিবেশের একটি পরিবর্তনশীল সংজ্ঞা আটকে থাকে না এমনকি যখন বলা হয় যে একটি বিশেষ বিল্টিনের কমান্ড-লাইনে বা কোনও ক্রিয়াকলাপের কাছে সংজ্ঞাটি চাপানো হয়, এর জন্য বিশ্বব্যাপী মানটি $IFS
প্রভাবিত হয় না এবং এর ঘোষণাটি স্থানীয় হয় শুধু run_this()
কল করতে
একইভাবে:
(run_this(){ $@; }; set -f; run_this ls -l \*)
ls: cannot access *: No such file or directory
... গ্লোববিংও কনফিগারযোগ্য। উক্তিগুলি একটি উদ্দেশ্য পরিবেশন করে - এগুলি কোনও কিছুর জন্য নয়। এগুলি ছাড়া শেল সম্প্রসারণ অতিরিক্ত ব্যাখ্যার মধ্য দিয়ে যায় - কনফিগারযোগ্য ব্যাখ্যা interpretation এটি ব্যবহৃত হত - বেশ কয়েকটি পুরানো শাঁসের সাথে - যা বিশ্বব্যাপী সমস্ত ইনপুটগুলিতে প্রয়োগ $IFS
হয়েছিল , এবং কেবল বিস্তৃতি নয়। প্রকৃতপক্ষে, বলেছিল শেলগুলি এর মতোই আচরণ করে যা তারা সমস্ত ইনপুট শব্দগুলির মানকে ভেঙে দেয় । এবং তাই, আপনি যা সন্ধান করছেন তা যদি খুব পুরানো শেল আচরণ হয় তবে আপনার ব্যবহার করা উচিত ।run_this()
$IFS
run_this()
আমি এটি খুঁজছি না, এবং আমি এই মুহুর্তে এর জন্য একটি দরকারী উদাহরণ নিয়ে আসতে বেশ চাপ দিয়েছি। আমার শেল যে কমান্ডগুলিতে এটি টাইপ করে সেগুলি চালানোর জন্য আমি সাধারণত তাদের পছন্দ করি। এবং তাই, পছন্দটি দেওয়া, আমি প্রায় সবসময় করব run_that()
। সেটি বাদে...
(run_that(){ "$@"; }; IFS=l run_that 'ls' '-ld' '/tmp')
drwxrwxrwt 22 root root 660 Dec 28 19:58 /tmp
কিছু সম্পর্কে উদ্ধৃত করা যেতে পারে। কমান্ডগুলি উদ্ধৃত হবে। এটি কাজ করে কারণ কমান্ডটি আসলে চালিত হওয়ার সাথে সাথে সমস্ত ইনপুট শব্দ ইতিমধ্যে উদ্ধৃতি-অপসারণের মধ্য দিয়ে গেছে - এটি শেলের ইনপুট ব্যাখ্যা প্রক্রিয়ার শেষ পর্যায়। সুতরাং শেলটি ব্যাখ্যা করার সময় 'ls'
এবং এর মধ্যে পার্থক্য ls
কেবল ততটাই গুরুত্বপূর্ণ - এবং এজন্যই উদ্ধৃতিটি ls
নিশ্চিত করে যে কোনও নামকৃত উপন্যাসটিls
আমার উদ্ধৃত ls
কমান্ড শব্দের পরিবর্তে নয় । এগুলি ব্যতীত, উদ্ধৃতিগুলি কেবলমাত্র শব্দগুলির সীমানা (যা কীভাবে এবং কেন ভেরিয়েবল / ইনপুট-হোয়াইটস্পেস উদ্ধৃতি কাজ করে) এবং মেটাচার্যাক্টর এবং সংরক্ষিত শব্দের ব্যাখ্যা are
তাই:
'for' f in ...
do :
done
bash: for: command not found
bash: do: unexpected token 'do'
bash: do: unexpected token 'done'
তুমি যে কাজ করতে উভয় সঙ্গে সক্ষম হবেন run_this()
বা run_that()
।
কিন্তু ফাংশন নাম, বা $PATH
'ঘ কমান্ড, অথবা builtins শুধু জরিমানা উদ্ধৃত বা unquoted চালানো হবে, এবং যে ঠিক কীভাবে তা run_this()
এবং run_that()
কাজ প্রথম স্থানে। আপনি এগুলির কোনওটির সাথে দরকারী কিছু করতে সক্ষম হবেন না $<>|&(){}
। সংক্ষিপ্ত eval
, হয়।
(run_that(){ "$@"; }; run_that eval printf '"%s\n"' '"$@"')
eval
printf
"%s\n"
"$@"
তবে এটি ব্যতীত, আপনি যে উদ্ধৃতিগুলি ব্যবহার করছেন তার গুণাবলী অনুসারে আপনি একটি সরল কমান্ডের সীমাবদ্ধ হয়ে রয়েছেন (এমনকি যখন আপনি $@
প্রক্রিয়া শুরুর সময় উদ্ধৃতিটির মতো কাজ করেন না যখন কমান্ডটি মেটাচার্যাক্টারের জন্য বিশ্লেষণ করা হয়) । একই সীমাবদ্ধতা কমান্ড-লাইন অ্যাসাইনমেন্ট এবং পুনর্নির্দেশগুলির ক্ষেত্রে সত্য, যা ফাংশনের কমান্ড-লাইনের মধ্যে সীমাবদ্ধ। তবে এটি কোনও বড় বিষয় নয়:
(run_that(){ "$@";}; echo hey | run_that cat)
hey
পাইপটি খোলার সাথে সাথে আমি সহজেই এখানে <
ইনডপুট বা >
আউটপুট পুনর্নির্দেশ করতে পারতাম ।
যাইহোক, প্রায় চারদিকে, এখানে কোনও সঠিক বা ভুল উপায় নেই - প্রতিটি উপায়ে এর ব্যবহার রয়েছে। এটি কেবল এটি যে আপনি এটি ব্যবহার করার ইচ্ছা হিসাবে এটি লিখেছিলেন এবং আপনার কী করা উচিত তা আপনার জানা উচিত। ছেড়ে যাওয়া হচ্ছে কোট একটি উদ্দেশ্য থাকতে পারে - অন্যথায় না হতে এ সব কোট - কিন্তু যদি আপনি তাদের আপনার উদ্দেশ্য মানুষের কাছে প্রাসঙ্গিক নয় কারণে বাদ, আপনি শুধু খারাপ কোড লিখছি। আপনি যা বলতে চাইছেন তা করুন; আমি যাই হোক না কেন চেষ্টা করি।
run_that
এর আচরণ অবশ্যই আমি প্রত্যাশা করেছিলাম (কমান্ডের পথে কোনও জায়গা থাকলে কী হবে?) আপনি যদি অন্য আচরণটি চান, অবশ্যই আপনি কল- সাইটটিতে এটিকে উদ্ধৃত করবেন যেখানে আপনি জানেন যে ডেটা কী? আমি এই ফাংশনটি হিসাবে কল করতে আশা করবrun_that ls -l
, যা উভয় সংস্করণে একই কাজ করে। এমন কোনও মামলা রয়েছে যা আপনাকে আলাদাভাবে প্রত্যাশা করে?