সিডির জন্য মোড়ক লেখার সময় কেন আমাকে সিডি "$ @" পরিবর্তে সিডি ব্যবহার করতে হবে?


25

অন্য কোথাও আমি নীচের মতো একটি সিডি ফাংশন দেখেছি:

cd()
{
 builtin cd "$@"
}

এটি $@পরিবর্তে ব্যবহার করার জন্য সুপারিশ করা হয় কেন $1?

আমি একটি পরীক্ষা ডিরেক্টরি "r st" তৈরি করেছি এবং এই ফাংশনটিযুক্ত স্ক্রিপ্টটিকে কল করেছিলাম এবং এটি কোনওভাবেই কাজ করে

$ . cdtest.sh "r st"

কিন্তু $ . cdtest.sh r stব্যর্থ কিনা আমি ব্যবহৃত "$@"বা"$1"


1
cd "$*"1 টিরও বেশি আর্গ দিয়ে সঠিকভাবে কাজ করবে না।
GoFundMonica - codidact.org

উত্তর:


57

কারণ অনুযায়ী bash(1), cdযুক্তি লাগে

   cd [-L|[-P [-e]] [-@]] [dir]
          Change  the  current  directory to dir.  if dir is not supplied,
          ...

সুতরাং ডিরেক্টরিটি $1সম্ভবত এর পরিবর্তে কোনও বিকল্প -Lবা অন্য পতাকা হিসাবে থাকতে পারে in

এটা কত খারাপ?

$ cd -L /var/tmp
$ pwd
/var/tmp
$ cd() { builtin cd "$1"; }
$ cd -L /var/tmp
$ pwd
/home/jhqdoe
$ 

আপনি যদি ব্যবহারের প্রত্যাশা না করেন তবে শেষ হয়ে গেলে বিষয়গুলি খুব উদ্বেগজনক হতে পারে cd "$1"


19

ব্যবহারে "$@"সমস্ত আর্গুমেন্ট পাস হবে cdযেখানে $1কেবল প্রথম যুক্তিই পাস করবে।

আপনার উদাহরণে

$ . cdtest.sh "r st"

আপনি কেবল একটি যুক্তিতে পাস করার সাথে সর্বদা কাজ করে তবে আপনি যদি কোনও পতাকাতে যেমন পাস করেন তবে

$ . cdtest.sh -L "r st"

তারপরে কেবল "$@"সঠিকভাবে কার্যকর করা "$1"হবে যেখানে cd -Lডিরেক্টরিটি পুরোপুরি হারাতে প্রসারিত হবে ।

যাহোক

$ . cdtest.sh r st

উভয় ক্ষেত্রেই ব্যর্থ হয় যেহেতু আপনি দুটি পরামিতি সিডিতে পাস করছেন, rএবং stএটি সিডি কার্যকর করার কোনও বৈধ উপায় নয়। প্যারামিটারগুলি ফাঁকা জায়গাগুলি দ্বারা পৃথক করা হয় যা অবশ্যই আপনার r\ stযুক্তি হিসাবে বিবেচনা করতে (আপনার প্রথম উদাহরণ হিসাবে) উদ্ধৃত হতে হবে বা পালিয়ে যাওয়া ( ) হওয়া উচিত।

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


14

কোনও যুক্তি না থাকলেও মামলাটি রয়েছে :

$ cd /tmp; cd; pwd
/home/muru
$ cd_func() { builtin cd "$1"; }
$ cd_func /tmp; cd_func; pwd
/tmp

cdকোনও যুক্তি ছাড়াই হোম ডিরেক্টরিতে পরিবর্তন হয়। কোনও যুক্তি ছাড়াই, "$@"কিছুইতে প্রসারিত হয় না, তবে "$1"খালি স্ট্রিংয়ে প্রসারিত হয়। এগুলি পৃথক:

$ args() { for i in "$@"; do echo "|$i|"; done; }
$ args
$ args ""
||

কিছুটা সম্পর্কহীন, তবে: আমি অবশেষে বুঝতে পারি কেন নাল যুক্তি cdএকটি ভাল জিনিস। এটি হোম ডিরেক্টরিতে পরিবর্তনের পরিবর্তে একটি ত্রুটি ঘটায়। কিছু অন্যান্য কমান্ডের সাথে, উল্লেখযোগ্যভাবে rsync, একটি নাল প্রথম যুক্তি অপ্রত্যাশিত আচরণের কারণ হয় (স্থানান্তর উত্সগুলিতে বর্তমান ডিরেক্টরি অন্তর্ভুক্ত করে)।
জো

4

বাশ স্ক্রিপ্টের যুক্তিগুলি স্থান সীমিত করা হয়। $ 1 প্রথম যুক্তি। আপনার উদাহরণগুলিতে ...

উদাহরণস্বরূপ 1, $ 1 হ'ল স্ট্রিং "r st" ... দ্বিতীয় উদাহরণে, character 1 হ'ল এক বর্ণের স্ট্রিং 'r' ...

$ @ হ'ল সমস্ত যুক্তি।

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