ফাইন্ড কমান্ডে '{}' এবং {between এর মধ্যে পার্থক্য?


18

ইন ডকুমেন্টেশন , আমি ব্যবহার উভয় উপায় দেখুন:

find . -type f -exec file '{}' \;

find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; \

4
নিশ্চিত মনে হচ্ছে এটির সন্ধান, কমান্ড এবং এর পরিবর্তে কমান্ড ডেকে আনার জন্য যথাযথ উদ্ধৃতি দিয়ে কিছু করার নেই।
জোড়াদেচে

1
বাশ না দিয়ে মাছ দিয়ে চেষ্টা করে দেখুন।
চার্লস ডাফি

উত্তর:


24

জন্য bashশেল, '{}'এবং {}বিনিমেয়। সমস্ত শেল (যেমন fish) এর ক্ষেত্রে এটি হয় না ।

একক উদ্ধৃতিতে যুক্তিটি স্পষ্টভাবে নির্দেশ করে যে কোঁকড়া ধনুর্বন্ধনী প্রেরণ করা উচিত find। ব্যবহারের উপর নির্ভর করে ব্যাশ শেল কখনও কখনও কোঁকড়ানো বন্ধনীগুলির সামগ্রীগুলি প্রতিস্থাপন করে।

নীচে যেমনটি দেখা গেছে, ব্যাশ খালি বন্ধনীগুলির বিকল্প দেয় না এবং সেগুলি কমান্ডে পৌঁছে যায়। জন্য findকমান্ড, এটা কোন ব্যাপার না।

$ echo {}
{}

$ echo {1}
{1}

$ echo {1,3}
1 3

$ echo '{1,3}'
{1,3}

4
বাশ দিয়ে কিছু যায় আসে না। মাছের সাথে কিছু যায় আসে না।
চার্লস ডাফি

1
আমি এর " are interchangeable"সাথে প্রতিস্থাপন করব " are interchangeable in some shells, not in all of them. ALWAYS use the single quotes to make sure they get passed as-is to the find command"(ভাল অভ্যাসগুলি নিশ্চিত করে আপনি সঠিক পদ্ধতিটি ব্যবহার করছেন কিনা তা নিশ্চিত করেই শুরু করা হয় (সর্বদা?) এমন একটি সিস্টেমে হয়ে থাকে যা দ্ব্যর্থক
বিষয়টিকে

9

প্রায় সমস্ত শেল অনুবাদক উপলব্ধ, '{}'এবং এর মধ্যে একেবারে পার্থক্য নেই {}

একক উদ্ধৃতি সাধারণত এম্বেড স্ট্রিংটিকে অন্য কোনও কিছু দ্বারা প্রতিস্থাপন থেকে রক্ষা করতে ব্যবহৃত হয়, উদাহরণস্বরূপ:

  • 'a b' একটি একক তিনটি অক্ষরের প্যারামিটার, উদ্ধৃতিগুলি ছাড়াই যে দুটি একক অক্ষরের পরামিতি হবে
  • '$b' আক্ষরিক অর্থে ডলার চিহ্ন হ'ল বি বর্ণ অনুসারে, উদ্ধৃতি ব্যতীত যা বি ভেরিয়েবলের যা কিছু থাকবে এবং যদি সেট না করা থাকে তবে সম্ভবত কিছুই নেই
  • '!!' উদ্ধৃত এবং কিছু ইন্টারেক্টিভ শাঁস সহ, লিটারেরাল বিস্ময়কর চিহ্নগুলি হ'ল তারা ইতিহাসের সর্বশেষ আদেশে প্রসারিত হবে
  • '*' একটি লিটারেরাল অ্যাসিরিস্টক, অব্যক্ত এটি বর্তমান ডিরেক্টরিতে লুকানো নয় ফাইলের তালিকা দ্বারা প্রতিস্থাপন করা হবে।

তন্ন তন্ন POSIX মান কিংবা মূলধারার শাঁস হিসাবে ( sh(বোর্ন), ksh, bash, ash, dash, zsh, csh, tcsh) প্রসারিত {}অন্য কিছু করার, কোট প্রয়োজন নেই।

তবে, এখানে একটি বিদেশী শেল রয়েছে, যার নাম খালি স্ট্রিং হিসাবে fishপ্রসারিত হবে {}, যেমন:

> ps -p %self
  PID TTY          TIME CMD
 5247 pts/1    00:00:00 fish
> echo a {} b '{}'
a  b {}

সম্ভবত এই কারণেই জিএনইউ findডকুমেন্টেশনগুলি {}উদ্ধৃতি বা ব্যাকস্ল্যাশগুলির সাহায্যে ব্যাখ্যার হাত থেকে রক্ষা করার পরামর্শ দেয় ।


9

বেশিরভাগ ব্যবহারকারীর জন্য (বিশেষত যারা পসিক্স শেল ব্যবহার করেন) তাদের পক্ষে কোনও পার্থক্য নেই।

জিএনইউর জন্য ম্যান পৃষ্ঠার উদাহরণ বিভাগ অনুসারে find:

লক্ষ্য করুন যে বন্ধনীগুলি শেল স্ক্রিপ্ট বিরামচিহ্ন হিসাবে ব্যাখ্যা থেকে তাদের রক্ষা করতে একক উদ্ধৃতি চিহ্নগুলিতে আবদ্ধ।

আমি মনে করি জিএনইউ ম্যান পৃষ্ঠার লেখক (গুলি) সাবধানতার দিক থেকে ভুল করছেন তবে আমি নোট করছি যে তাদের ম্যান পেজের সমস্ত উদাহরণ ব্রেসকে উদ্ধৃত করে না। অফিসিয়াল জিএনইউ-র এই উদাহরণগুলি নথিপত্রগুলিও উদ্ধৃতি বাদ দেয়।

ইন POSIX / একক ইউনিক্স স্পেসিফিকেশন থেকে উদাহরণ ধনুর্বন্ধনী হয় উদ্ধৃত না যখন সঙ্গে ব্যবহার -execবিকল্প।

একটি পসিক্স শেল দিয়ে, প্যারামিটারের বিস্তৃতি কেবল তখনই ঘটে যখন বিশেষত প্যারামিটারগুলি বন্ধনীগুলির মধ্যে আবদ্ধ থাকে - তবে খালি ধনুর্বন্ধনী সহ নয়

বাশ শেলটিতে ব্রেস এক্সপেনশনটি (অ-বহনযোগ্য) বৈশিষ্ট্য হিসাবে অন্তর্ভুক্ত করা হয় , তবে এই ধরণগুলি কেবল তখনই প্রসারিত হয় যখন কোনও কমা বা বিন্দুগুলি বন্ধনীগুলির মধ্যে অন্তর্ভুক্ত করা হয় । ব্যাশ এছাড়াও ধনুর্বন্ধনী ব্যবহার কমান্ড গোষ্ঠী , কিন্তু এই ঘটবে না যদি না সেখানে আসলে হয় বক্রবন্ধনী মধ্যে কমান্ড একটি গ্রুপ।

অবশেষে, আমি চলমান চেষ্টা find -exec ls -l {} \;মধ্যে sh, dashএবং tcshকিন্তু এই শাঁস কেউই প্রসারিত {}অন্য কিছু করুন। অন্যরা উল্লেখ করেছে যে, fishশেলটি {}বিশেষভাবে আচরণ করে তবে এটি কোনও পসিক্স শেল নয় (যা এর নির্মাতারা এবং ব্যবহারকারীরা একটি সুবিধা হিসাবে বিবেচনা করে)। ধনুর্বন্ধনী উদ্ধৃত করতে এটি কোনও ক্ষতি করে না তবে অলস টাইপিস্টরা যারা ফিশ শেল ব্যবহার করেন না তাদের এগুলি বাদ দেওয়ার বিষয়ে দোষী মনে করা উচিত নয়।


তারা ভুল করছে না, তারা চেষ্টা করছে যে লোকেরা সঠিক উপায়ে ব্যবহার করবে (যেমন '{}'পরিবর্তে ব্যবহার করুন {}) যাতে তাদের শেলটি {}এটি ব্যাখ্যা না করেই অনুসন্ধান কমান্ডে প্রেরণ করে (উপরে বর্ণিত হিসাবে @ চার্লস-ডাফি, যদি আপনি মাছ ব্যবহার করেন তবে) , এটি ব্যাখ্যা করবে {}কিন্তু তা নয় '{}', সুতরাং আপনাকে সেই শেলের উপরেরটি ব্যবহার করা উচিত (এবং আরও অনেকের উপরে!) সুতরাং, সর্বদা '{}'অস্পষ্টতা দ্বারা দংশিত হওয়া এড়াতে ব্যবহার করুন{}
অলিভিয়ার ডুলাক

6

এটি আপনার শেলের সিনট্যাক্সের উপর নির্ভর করে। সন্দেহ হলে, প্রতিধ্বনি!

এই চালান

echo '{}'

এবং এই.

echo {}

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


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

আরও কিছুটা ভার্বোজ ইকো কমান্ড (গিলাইমেট-কোটড আর্গুমেন্ট দেখানো) এর মাধ্যমে যাচাই করা যেতে পারে,

#!/bin/sh
for a in "$@"; do
    printf '«%s» ' "$a"
done
echo ''

কমান্ড লাইনে এটি টাইপ করা,

find 'My Documents and Settings' -type f -exec file {} \;

এটি বোঝা মানে:

«find» «My Documents and Settings» «-type» «f» «-exec» «file» «{}» «;»

এবং এই মাছ:

«find» «My Documents and Settings» «-type» «f» «-exec» «file» «» «;»

একটি সাধারণ পরামর্শ হিসাবে, এটি উদ্ধৃতি কখনও আঘাত করে না।

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