জিএনইউ কিছু শেলের জন্য find find সন্ধান করে এবং মাস্কিং করছে - কোনটি?


34

জিএনইউ সন্ধানের জন্য ম্যান পেজটিতে বলা হয়েছে:

-exec command ;
    [...] The  string `{}'  is  replaced  by the current 
    file name being processed everywhere it occurs in the 
    arguments to the command, not just in arguments where 
    it is alone, as in some  versions  of  find.
    Both  of  these  constructions might need to be escaped 
    (with a `\') or quoted to protect them from expansion 
    by the shell. 

এটি লোকটি থেকে find(জিএনইউ সন্ধানী) ৪.৪.২।

এখন আমি এটি ব্যাশ এবং ড্যাশ দিয়ে পরীক্ষা করেছি এবং উভয়কেই {}মুখোশ দেওয়ার দরকার নেই । এখানে একটি সহজ পরীক্ষা:

find /etc -name "hosts" -exec md5sum {} \; 

এমন কোনও শেল আছে, যার জন্য আমার সত্যিই ধনুর্বন্ধকগুলি মাস্ক করা দরকার? দ্রষ্টব্য, এটি যে ফাইলটি খুঁজে পেয়েছে তাতে ফাঁকা রয়েছে (বাশ থেকে আহবান করা হয়েছে) তার উপর নির্ভর করে না:

find ~ -maxdepth 1 -type d -name "U*" -exec ls -d {} \; 
/home/stefan/Ubuntu One

যদি পাওয়া ফাইলটি একটি সাব-শেলের হাতে দেওয়া হয় তবে এটি পরিবর্তিত হবে:

find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d {}' \; 
ls: cannot access /home/stefan/Ubuntu: No such file or directory
ls: cannot access One: No such file or directory

যা দ্বারা সমাধান করা যেতে পারে:

find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "$0"' {} \;

বিপরীতে:

find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "{}"' \; 
/home/stefan/Ubuntu One

তবে ম্যান পেজ যে কথা বলছে তা নয়, তাই না? তাহলে কোন শেলটি {}অন্যভাবে আচরণ করে ?


@ ভোলকার সিগেল: আপনার সম্পাদনাটি খুব ভাল উদ্দেশ্য হতে পারে, তবে আমি আমার বর্তমান সন্ধানী-ম্যানুয়ালটি পরীক্ষা করেছিলাম এবং আপনার সংশোধনগুলি ভুল, আপনি আপনার সম্পাদনাগুলি সংক্ষেপে সংক্ষেপিত করার অভ্যাস যা একটি খারাপ অভ্যাস হিসাবেও হারিয়েছেন, তাই আমি আপনার পরিবর্তনগুলি আবার রোল করি। দুঃখিত, সহকর্মী।
ব্যবহারকারীর অজানা

ওহ, যদি এটি কিছু ভেঙে যায় তবে তা ঘুরিয়ে দেওয়ার জন্য আপনাকে ধন্যবাদ। আমি মনে রাখছিলাম যে পাঠ্য সংকলকটি ম্যান পেজ ফর্ম্যাটকে উত্পন্ন করে যা এই "টাইপোগ্রাফিক কোটস" রেন্ডারিং সংজ্ঞাটির একটি শৈল্পিক হিসাবে তৈরি করে। এটি নিখুঁত প্রিন্টআউট ফর্ম্যাটিংয়ের জন্য টেক্সকেও রেন্ডার করতে পারে। আমি উদ্ধৃতিগুলি লক্ষ্য করেছি কারণ তারা সিনট্যাক্স হাইলাইটে বিভ্রান্ত হয়েছে। আমি ধরে নিয়েছি যে কোড ব্যবহার করার সময় অস্বাভাবিক প্রথম উক্তিটি ভুল, এবং এখনও ধরে নিয়েছি। উল্লেখ্য যে দুটি পরিবর্তন কোডে নয়, বর্ণনামূলক পাঠ্যে ছিল। সুতরাং আমরা যদি এগুলি টাইপোগ্রাফি হিসাবে দেখি - নান্দনিক উপস্থাপনা - তারা সঠিক are
ভোলকার সিগেল

তথ্য আউটপুট উপস্থাপনে দেখে মনে হচ্ছে, উভয় পক্ষেই একই উদ্ধৃতি ব্যবহৃত হয়। সন্দেহ নেই যে আমার পরিবর্তন এটিকে মূল থেকে আলাদা করেছে, আপনি ঠিক বলেছেন। কিন্তু এতে কি কোনও সমস্যা হয়েছে? (আমি লোকটির রেন্ডারিং সংজ্ঞাটিতে প্রথম উক্তিটিকে বাগ হিসাবে বিবেচনা করি, যতদূর আমি জানি টাইপোগ্রাফির একমাত্র ঘটনা।)
ভলকার সিগেল

আমি কেবল যাচাই করেছি: command {} 'কমান্ড লাইনে কাজ করে না। এটি প্রযুক্তিগতভাবে সঠিক, তবে আমি এটি পছন্দ করি না যে কোনও অনিচ্ছাকৃত ব্যবহারকারী যখন সেটিকে অনুলিপি করে আটকানোর চেষ্টা করে তখন একটি অদ্ভুত ত্রুটি পায়।
ভোলকার সিগেল

@ ভোলকারসিগেল: এটি গদ্যের পাঠ্য, কোড নয়, সুতরাং এখানে কোন ব্যবহারকারী কপি-পেস্ট করবেন? এবং এটি ২০১১ সাল থেকে ম্যান পৃষ্ঠার একটি উদ্ধৃতি। আমি সেই প্যাসেজটি সংশোধন করার কোনও মান দেখতে পাচ্ছি না তবে আমি কেন সেই পৃষ্ঠাটিতে সংশোধন করেছি point বিষয়টি যথেষ্ট জটিল। যদি এটি আপনার প্রশ্ন হয় তবে আমি আপনাকে বোঝানোর চেষ্টা করব না, ম্যান পৃষ্ঠাটি সঠিকভাবে উদ্ধৃত করার জন্য তবে আমার প্রশ্নের জন্য, আমি আপস করার মতো মুডে নেই। উদ্ধৃতি হল উদ্ধৃতি।
ব্যবহারকারী অজানা

উত্তর:


26

সংক্ষিপ্তসার : যদি কখনও কোনও শেল প্রসারিত হয়ে থাকে তবে {}এটি এখনই সত্যই পুরানো উত্তরাধিকারের জিনিস।

বোর্ন শেল এবং পসিক্স-কমপ্লায়েন্ট শেলগুলিতে, ধনুর্বন্ধনী ( {এবং }) হ'ল সাধারণ অক্ষর (এর বিপরীতে (এবং )যা শব্দের বিস্মৃতকরর মতো ;এবং &এবং [এবং ]যা গ্লোবাইং অক্ষর)। নিম্নলিখিত স্ট্রিংগুলি সমস্ত আক্ষরিকভাবে মুদ্রিত হওয়ার কথা:

$ echo { } {} {foo,bar} {1..3}
{ } {} {foo,bar} {1..3}

একটি একক বন্ধনী সমন্বিত একটি শব্দ একটি সংরক্ষিত শব্দ , যা কেবলমাত্র বিশেষ যদি এটি কোনও কমান্ডের প্রথম শব্দ হয়।

Ksh বোর্ন শেলটির একটি বেমানান এক্সটেনশান হিসাবে ব্রেস প্রসারণ প্রয়োগ করে। এটি দিয়ে বন্ধ করা যেতে পারে set +B। বাশ এই ক্ষেত্রে ksh অনুকরণ করে। Zsh পাশাপাশি বন্ধনী সম্প্রসারণ প্রয়োগ করে; সেখানে এটি সঙ্গে বন্ধ পরিণত করা যাবে set +Iবা setopt ignore_bracesবা emulate sh। এই শাঁস কোনটিই প্রসারিত {}কোনো ক্ষেত্রে, এমনকি এটি একটি শব্দ (যেমন একটি সাবস্ট্রিং এর foo{}barআর্গুমেন্ট সাধারণ ব্যবহারের কারণে), findএবং xargs

একক ইউনিক্স ভি 2 নোট করে

কিছু systemsতিহাসিক সিস্টেমে, কোঁকড়া ধনুর্বন্ধনী কন্ট্রোল অপারেটর হিসাবে বিবেচিত হয়। ভবিষ্যতের মানককরণের ক্রিয়াকলাপগুলিতে সহায়তা করার জন্য, পোর্টেবল অ্যাপ্লিকেশনগুলিকে অক্ষরগুলির প্রতিনিধিত্ব করার জন্য অব্যক্ত ব্রেস ব্যবহার করা উচিত। এটা সম্ভব যে আইএসও / আইসিসি 9945-2: 1993 স্ট্যান্ডার্ডের ভবিষ্যতের সংস্করণটির প্রয়োজন হতে পারে {এবং }স্বতন্ত্রভাবে কন্ট্রোল অপারেটর হিসাবে বিবেচনা করা যেতে পারে, যদিও টোকন {}সম্ভবত ব্যবহৃত-ব্যবহৃত find {}নির্মাণের কারণে সম্ভবত এটি থেকে একটি বিশেষ ক্ষেত্রে ছাড় পাবে ।

এই নোটটি স্ট্যান্ডার্ডের পরবর্তী সংস্করণগুলিতে ফেলে দেওয়া হয়েছিল; জন্য উদাহরণfind কয়েক unquoted ব্যবহার আছে {}, যেমন কি জন্য উদাহরণxargs । এখানে historicalতিহাসিক বোর্ন শেলগুলি থাকতে পারে যেখানে {}উদ্ধৃতি দিতে হয়েছিল, তবে এগুলি এখন অবধি সত্যই পুরানো উত্তরাধিকার ব্যবস্থা হবে।

আমার হাতে থাকা csh বাস্তবায়নগুলি (ওপেনবিএসডি 4.7, দেবিয়ান বিএসডি csh , tcsh) সমস্তগুলি প্রসারিত {foo}হয় fooতবে {}একা ছেড়ে যায়।


1
@ গেকোসৌর: মন্তব্যে কেবলমাত্র একটি ছোট উপসেট কাজ করে । আপনি কী বলতে চাইছেন তা আমি জানি না। এটি যদি ksh এট আল এর ব্রেস প্রসার সম্পর্কে হয় তবে আমার অনুচ্ছেদটি "Ksh প্রয়োগগুলি ব্রেস সম্প্রসারণকে একটি বেমানান এক্সটেনশন হিসাবে" দিয়ে শুরু করুন।
গিলস 19:52-তে খারাপ হয়ে যাওয়া বন্ধ করুন '

2
এটি ছিল bash(দেখুন $BASH_VERSION) ব্রেস সম্প্রসারণ খুব জীবিত এবং ভাল।
গীকোসৌর

2
এটা ছিল পয়েন্ট। {}সিনট্যাক্স মধ্যে সম্ভূত csh, কিন্তু {}খালি স্ট্রিং প্রসারিত। নতুন শেলগুলি সনাক্ত করে যে এটি অযৌক্তিক, তবে এখনও কিছু পুরানো cshআছে।
গাইকোসৌর

1
@ গেকোসৌর: আপনি বলতে পারবেন কোন নির্দিষ্ট প্ল্যাটফর্মের কোন নির্দিষ্ট সিএস-সংস্করণ? আমি নিজে এটি পরীক্ষা করতে পছন্দ করি (যদি এটি লিনাক্সের উপর সম্ভব হয়) বা আশ্বাস দেওয়া হবে যে ব্যক্তি নিজেই এটি পরীক্ষা করে দেখেন।
ব্যবহারকারী অচেনা

1
@ জাইকোসৌর, {}fooপ্রসারিত হবে foo, তবে {}প্রসারিত হবে {}(ব্যাকটিক্সের মধ্যে থাকা ছাড়া , তবে উদ্ধৃতিটি কোনও উপকারে আসবে না) এবং সে হিসাবে নথিভুক্ত হয়েছিল। আমি এটি 2BSD (প্রথম প্রকাশ), 2.79BSD, 2.8BSD এবং 2.11BSD এর csh এর জন্য যাচাই করেছি।
স্টাফেন চেজেলাস

12

{}এর সংস্করণে উদ্ধৃত করা প্রয়োজন fishশেল 3.0.0 পূর্বে।

$ fish -c 'echo find -exec {} \;'
find -exec  ;

আরসি শেলের মধ্যে (এছাড়াও akangaভিত্তিক rc, তবে নয় es):

$ rc -c "echo find -exec {} ';'"
line 1: syntax error near '{'

এগুলি সম্ভবত সেই জিএনইউর লেখকদের মনে মনে ছিল যে শেলগুলি লেখকরা যখন fish2005 সালে প্রকাশিত হওয়ার পরে লেখাটি লেখেন (তবে সেই পাঠ্য বা অনুরূপটি 1994 সালে ইতিমধ্যে ছিল) এবং rcএটি মূলত ইউনিক্স শেল ছিল না।

এর কয়েকটি সংস্করণ csh(শেল যা ব্রেস সম্প্রসারণের সূচনা করেছিল) এর জন্য কয়েকটি গুজব রয়েছে । তবে csh2BSD- এ প্রথম প্রকাশ না হওয়ায় তাদের ক্রেডিট দেওয়া শক্ত । এখানে PDP11 এমুলেটর পরীক্ষিত হিসাবে:

# echo find -exec {} \;
find -exec {} ;

এবং 2BSDcsh এর ম্যান পেজটি পরিষ্কারভাবে বলেছে :

একটি বিশেষ কেস হিসাবে `{',`}' এবং `{} 'নির্বিঘ্নে পাস হয়েছে।

সুতরাং আমি এটি খুব বিস্ময়কর মনে করবো যদি পরের csh বা tcsh এর পরবর্তী সংস্করণটি এটি ভেঙে দেয়।

এটি কিছু সংস্করণে কিছু বাগ জুড়ে কাজ করতে পারে to এখনও সেই 2BSD সিএসএস সহ (এটি 2.79BSD, 2.8BSD, 2.11BSD তে একই)

# csh -x
# echo foo {} bar
echo foo {} bar
foo {} bar
# echo `echo foo {} bar`
echo `echo foo {} bar`
echo foo {} bar
foo  bar

উদ্ধৃতি যদিও সাহায্য করে না:

# echo `echo foo '{}' bar`
echo `echo foo '{}' bar`
echo foo {} bar
foo  bar

আপনি পুরো কমান্ডের বিকল্পটি উদ্ধৃত করতে পারেন:

# echo "`echo foo {} bar`"
echo `echo foo {} bar`
echo foo {} bar
foo {} bar

কিন্তু এটি বাইরের প্রতিধ্বনিতে একটি যুক্তি পার করছে।

ইন cshবা tcsh, আপনি উদ্ধৃত করা প্রয়োজন চাই {}মত যখন তার না নিজের:

find . -name '*.txt' -type f -exec cp {} '{}.back' \;

(যদিও সেই ধরণের findব্যবহার বহনযোগ্য নয় কারণ কিছু নিজস্ব findকেবল {}তখন প্রসারিত হয়)।


1

এক কথায় csh,। bashএবং অন্যান্য আধুনিক শেলগুলি সনাক্ত করে যে ব্যবহারকারী সম্ভবত নাল ধনুর্বন্ধনী প্রসারণের জন্য জিজ্ঞাসা করছে না। (আধুনিক cshপ্রকৃতপক্ষে tcshএবং {}এখন অবধি খুব সহজেই পরিচালনা করতে পারে ))


শুনে ভাল লাগল, তবে আমি বিপরীতে জিজ্ঞাসা করছি, এমন একটি শেল যার জন্য এটি চূড়ান্তভাবে পরিচালনা করে না।
ব্যবহারকারী অজানা

আপনি ধরে নিচ্ছেন যে কেউ লিনাক্স সিস্টেমে নতুনতর হওয়ার কারণে অতিরিক্ত পৃষ্ঠাগুলির জন্য তথ্য পৃষ্ঠার রেফারেন্সটি প্রবেশ করবে এবং ছড়িয়ে দেবে csh। সবাই লিনাক্সে জিএনইউ ইউটিলিটি চালায় না; আসলে এটি পুরানো বাণিজ্যিক ইউনিক্স সিস্টেমে ইনস্টল করা বেশ সাধারণ, যাদের বান্ডিল কমান্ডগুলি সীমাবদ্ধ। (প্রতিস্থাপন করা হচ্ছে cshঐ সমস্ত সিস্টেমে সম্ভাবনা কম, কারণ সিস্টেম স্ক্রিপ্ট মূল idiosyncrasies উপর নির্ভর করতে পারে হয় csh, এবং ব্যবহারকারীদের সব নতুন ব্যবহার করার জন্য কনফিগার করা হয়েছে এমনকি যদি csh, rootপ্রায় অবশ্যই একত্রিত সংস্করণ থাকা প্রয়োজন হবে।)
geekosaur

2
না। আমি এমন এক ব্যক্তির সাথে বিতর্ক করছি যিনি বলেছিলেন যে, আমাদের উইকিতে আমাদের "{}" সারাক্ষণ ব্যবহার করার পরামর্শ দেওয়া উচিত, কারণ ম্যান পৃষ্ঠাটি তাই বলে। এবং এখন আমি জানতে চাই যে এমন কোন শেল আছে যা আমি ব্যবহার করছি না, যেমন আমি, ksh, zsh, tcsh, csh বা XYZsh যা আমি জানি না, যার জন্য এই দাবি সত্য, বা আমি সত্যই ধরে নিতে পারি কিনা, নেই। যদি বিভিন্ন ইউনিক্সের জন্য শেল থাকে তবে "{need" দরকার হয়, এটি বাক্যটি কেন ম্যান পৃষ্ঠাতে রয়েছে তা লিনাক্স শুরুর পরামর্শ হিসাবে উপযুক্ত নয় বলে একটি সূক্ষ্ম ব্যাখ্যা হবে।
ব্যবহারকারী অজানা

এখন আমি যদি হতাশ করছি pdksh... ডান জিনিস আছে যদিও সঠিক উত্তর যে সম্ভবত "বাস্তব kshFOSS এই দিন হয়"।
গীকোসৌর

4
মিক্স, ksh93, বাশ এবং জেডএস এর মতো পিডিক্স কেবল তখনই বন্ধনীগুলি প্রসারিত করে যখন (বা ..ksh93, বাশ এবং zsh এর মধ্যে) কমা রয়েছে । কেবলমাত্র (টি) সিএসএস প্রসারিত {foo}হয় fooএবং এমনকি এটি {}একা চলে যায় (কমপক্ষে সাম্প্রতিক বিএসডি এর উপর)।
গিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.