"আরএম *" চালানোর সময় কীভাবে "কোনও মিল খুঁজে পাওয়া যায় না" কীভাবে পরিত্রাণ পাবেন


22

ব্যবহার করে zsh, rmআউটপুট পুনর্নির্দেশ করার পরেও উপযুক্ত নয় এমন প্যাটার্ন বাছাই করার সময় আমি একটি "কোনও মিল খুঁজে পাইনি" বার্তাটি পাই ।

# rm * > /dev/zero 2>&1
  zsh: no matches found: *

আমি কীভাবে এই বার্তাটি থেকে মুক্তি পাব?


আপনি কি বর্তমান ডিরেক্টরিতে সমস্ত কিছু মুছতে চাইছেন? বর্তমান ডিরেক্টরি কি?
কাটরেটজম

আপনি ব্যবহার করতে পারেন setopt extended_glob(বা এমনকি সরল rm * >/dev/null 2>&1) তবে সত্যই আপনার প্রয়োজন না হওয়ার জন্য rm *
কঠোর পরিশ্রম করা

/dev/nullতবুও আপনার আসলে ডুবে যাওয়া উচিত dev/zero। এছাড়াও, আপনার স্টাডার পুনঃনির্দেশ হারিয়েছে একটি &; এটা হওয়া উচিত 2>&1
রোয়াইমা

zshকমান্ডটি মূল্যায়নের সময় ত্রুটি বার্তা উত্পন্ন হয় এবং কমান্ডের রানটাইম চলাকালীন নয় (ত্রুটির কারণে কমান্ড এমনকি চালানো হয় না)। এখানে আউটপুট পুনর্নির্দেশগুলি কেবল কমান্ডের আউটপুটকেই প্রভাবিত করবে না শেল নিজেই।
আডাইফোন

উত্তর:


42

এই আচরণটি Zsh এর nomatchবিকল্প দ্বারা নিয়ন্ত্রিত হয় । ডিফল্টরূপে, যদি কোনও কমান্ড লাইনে কোনও গ্লোব্বিং এক্সপ্রেশন থাকে যা কোনও কিছুর সাথে মেলে না, Zsh আপনার দেখা ত্রুটি বার্তাটি মুদ্রণ করবে এবং কমান্ডটি মোটেই চালাবে না। আপনি এটি চালিয়ে অক্ষম করতে পারেন

setopt +o nomatch

তারপরে, গ্লোব্বিং এক্সপ্রেশনগুলি যা কোনও কিছুর সাথে মেলে না তা যেমন থাকবে তেমনই ছেড়ে দেওয়া হবে এবং আপনি একটি ত্রুটি বার্তা পাবেন rm(যা আপনি ব্যবহার করে অক্ষম করতে পারবেন -f, যদিও এটি একটি খারাপ ধারণা কারণ এটি অন্যান্য পরিস্থিতিতে অপসারণকে বাধ্য করবে যেখানে আপনি নাও করতে পারেন চাই).


4
আচরণটি nullglobএবং cshnullglobবিকল্পগুলি দ্বারাও নিয়ন্ত্রিত হয় । যদি nullglobসেট করা থাকে এবং কোনও মিলে যাওয়া ফাইল খুঁজে পাওয়া যায় না, ত্রুটি উত্পন্ন করার পরিবর্তে প্যাটার্নটি আর্গুমেন্ট তালিকা থেকে সরানো হবে। cshnullglobকমান্ডের সমস্ত নিদর্শনগুলির কোনও মিল না থাকলে সেটিংয়ের একই প্রভাব রয়েছে, এক্ষেত্রে একটি ত্রুটি প্রতিবেদন করা হবে। নোট: সেটিং nullglobবা cshnullglobওভাররাইড nomatch। এছাড়াও আপনি সেট করতে পারেন nullglobউল্লিখিত glob কোয়ালিফায়ার ব্যবহার করে একক নিদর্শনের জন্য N: rm *(N)
অ্যাডেফোন

nomatchআদর্শের চেয়ে কম, বোর্নের মতো শেলগুলি এটিই করে। যদি প্যাটার্নটি মেলে না, এটি rm(!) এর সাথে পাস করা হয়েছে যার উপর rmএকটি ত্রুটি দেওয়া হবে বা আরও খারাপ *.[ch]উদাহরণ হিসাবে উদাহরণের মতো ভুল ফাইলটি মুছতে পারে !
স্টাফেন চেজেলাস

9

পরিবর্তে আপনি এটি কী করতে চান? মোটেও চালাচ্ছেন না rm(1)? *অন্যান্য বোর্নের মতো শেলসের মতো আক্ষরিক যুক্তি দিয়ে এটি চালান (2)? এটিকে বিনা যুক্তি দিয়ে চালাবেন (3)?

  1. files=(*(N)); (($#files)) && rm -- $files। অথবা (rm -- *) 2> /dev/nullতবে এটি সত্যিকারের ত্রুটিগুলিও লুকিয়ে rmরাখবে যার দ্বারা নির্বোধ হবে। আপনি zshত্রুটিটি বাতিল করতে পারেন তবে স্ট্যান্ডার rmকমান্ডের সাথে থাকলেও পুনরুদ্ধার করতে পারেন with(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
  2. emulate sh -c 'rm -- *' 2> /dev/null। তারপর মত shযা zshএখন যে একক কমান্ড-লাইনে emulated, অ-ম্যাচিং *হিসেবে হল পাস করা হয়েছে rmএবং rmঅভিযোগ হিসাবে *ফাইল বিদ্যমান নেই। আমরা দমন rmএর দ্বারা stderr হিসাবে আপনি কাজ কী হবে shদমন করতে যে ত্রুটির বার্তা, কিন্তু আবার, যে নিরীহ যেমন দ্বারা প্রকৃত ত্রুটি আড়াল হবে rmহিসেবে অশোভন আচরণ যথাযোগ্য ত্রুটির বিরোধিতা shএকটি আক্ষরিক ক্ষণস্থায়ী *করতে rm। যদিও rm -f '*'কোনও অ-বিদ্যমান *ফাইল সম্পর্কে অভিযোগ করবে না , তাই আপনি করতে পারেনemulate sh -c 'rm -f -- *'
  3. rm -- *(N)rmযদিও যখন কোনো আর্গুমেন্ট পাস না নালিশ জানাব, যদিও আবার, না rm -f: rm -f -- *(N)

সাধারণত, rm -fআপনি যে সমস্ত আদেশ ব্যবহার করতে চান তা যদি আপনি সমস্ত ফাইল চলে যেতে চান এবং কেবল ফাইলগুলি অপসারণ করা যায়নি বা আইওডাব্লু rmফিরে আসার পরে রয়েছে তবেই একটি ত্রুটি পাবেন । -fকিছু পরিস্থিতিতে ব্যবহারকারীকে অনুরোধ করা থেকে বাঁচতে আপনি সাধারণত স্ক্রিপ্টগুলিতে ব্যবহার করতে চান ।

এখানে, rmযখন গ্লোব মেলে না তখন ফোন করা ভুল। sh1 আচরণ ভুল। এটি যেমন ধরণের জন্য নিরীহ *, তবে একটির মতো *.[ch], *.[ch]যখন এটি মেলে না তেমনিভাবে পাস *.[ch]করার ফলে ফাইলটি ভুল করে মুছে ফেলা হতে পারে:

$ ls
*.[ch]  foo.txt
$ zsh -c 'rm *.[ch]'
zsh:1: no matches found: *.[ch]
$ ls
*.[ch]  foo.txt
$ sh -c 'rm *.[ch]'
$ ls
foo.txt

একটি ত্রুটি সঙ্গে ব্যর্থ করতে সবচেয়ে যুক্তিসম্মত জিনিস এবং কি zsh(এবং fish, csh, tcsh, bash -o failglobএবং মূল ইউনিক্স শেল) আছে।

এবং যদি আপনি সেই বিশেষ ক্ষেত্রে নিজেকে যত্ন নিতে চান তবে উপরের ক্ষেত্রে (1) এর মতো এর গ্লোব কোয়ালিফায়ার ( নোগ্লোব জন্য ) zshদিয়ে এটি সহজ করে তোলে । (কমপক্ষে সাম্প্রতিক সংস্করণে ) এটি আরও সহজ করে তোলে কারণ এটি কমান্ডের জন্য অন্তর্ভুক্ত নোগলব করে । সুতরাং, সমতুল্য হ'ল:(N)fishset

set files *
if count $files > /dev/null
  rm -f -- $files
end

দেখুন কেন nullglob ডিফল্ট নয় আরো বিস্তারিত জানার জন্য।


। কঠোরভাবে বলতে গেলে এটি কেবল shবোর্ন শেল থেকে (1979 সালে ইউনিক্স ভি 7); এর আগের ভার্সন sh(যা কল করেনি /etc/globunquoted ওয়াইল্ডকার্ড উপর যা যেখানে উল্লিখিত glob নাম থেকে আসে) মত আচরণ করেনি cshবা zsh -o cshnullglobহলো, /etc/globকমান্ড বাতিল করবে globs কেউই কোনো ম্যাচ ছিল (এবং নন-ম্যাচিং globs অন্তত যদি দমন হবে তাদের মধ্যে কোনও ম্যাচ ছিল)। আচরণ ছিল ভাঙ্গা বোর্ন শেল দ্বারা।


আমি মনে করি তিনি rmশেলটি থেকে নয় ত্রুটি বার্তাটি পাবেন বলে আশাবাদী । "Rm:` * 'মুছে ফেলতে পারে না: এমন কোনও ফাইল বা ডিরেক্টরি নেই "like
ইমানুয়েল

@ এমমানুয়েল, তারপরে emulate sh -c 'rm -- *'বোর্ন শেলের (বগি আইএমও) আচরণ পেতে 2:
স্টাফেন চেজেলাস

লেখা হয়েছে যেমন @ স্টাফেন_চাজেলা, 2 তিনি যে প্রশ্ন করেন নি তার সঠিক উত্তর হ'ল :)।
এমানুয়েল

@ এমমানুয়েল, এই তিনটি প্রশ্নের উত্তর: কীভাবে "কোনও মিল নেই" ত্রুটি থেকে মুক্তি পাবেন। ওপির কোড rmত্রুটিগুলি দমন করে । এটি এমন কোনও কিছু যা আপনি অন্য শেলগুলিতে ত্রুটিটি দমন করার জন্য করবেন যখন কোনও মিল নেই ফাইল এবং এর ফলে খাঁটি আরএম ত্রুটিগুলিও দমন করা যায়। আমার উত্তর সেটির বাহ্যরেখা দেয় এবং আশা করে দেখায় যে কীভাবে zsh আচরণটি তাত্ত্বিক।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.