সোর্স ফাইল উপস্থিত না থাকায় কীভাবে 'সিপি' কমান্ড ত্রুটি চালায় না?


58

আমি ম্যাক ওএস এক্স ব্যবহার করছি। আমি এই জাতীয় বিল্ড স্ক্রিপ্টের জন্য সিপি কমান্ড দিয়ে কিছু ফাইল অনুলিপি করার চেষ্টা করছি।

cp ./src/*/*.h ./aaa

./Src ডিরেক্টরিতে কোনও .h ফাইল না থাকলে এই কমান্ডটি একটি ত্রুটি ঘটায়। কমান্ড কিভাবে ত্রুটি আগুন না করা যায়? (নীরব ব্যর্থতা) ত্রুটিটি বিল্ড রেজাল্টকে ব্যর্থ করে তোলে, তবে যখন কেবল কিছু শিরোনাম ফাইল থাকে তখন আমি কেবল অনুলিপি করতে চাই।

উত্তর:


69

আপনি যদি ত্রুটির বার্তার কথা বলছেন তবে আপনি এটি বিট বালকে প্রেরণ করে দমন করতে পারেন:

cp ./src/*/*.h ./aaa 2>/dev/null

আপনি যদি প্রস্থান কোড এবং ত্রুটি বার্তাটি দমন করতে চান:

cp ./src/*/*.h ./aaa 2>/dev/null || :

8
:এই প্রসঙ্গে এর অর্থ কী তা ব্যাখ্যা করে ভাল লাগবে ।
পাইওটার ডব্রোগস্ট

23
@ পাইওটারডব্রোগোস্ট: বাশ এবং কিছু অন্যান্য শেলের মধ্যে কোলন একটি নাল ইউটিলিটি (কোনও বিকল্প) নয়। এটি পসিক্স দ্বারা নির্দিষ্ট করা হয়েছে । যেহেতু এটি সর্বদা সত্য প্রত্যাবর্তন করে, এটি এখানে ব্যর্থতার প্রস্থান কোড দমন করতে ব্যবহার করা হয় (এটি পছন্দসই হওয়া উচিত)। শেল্ট বিল্টিন পরিবর্তে ব্যবহার করা যেতে পারে এবং আরও পঠনযোগ্য হবে। cptrue
ডেনিস উইলিয়ামসন


1
এই অন্যান্য ত্রুটি (উৎস / গন্তব্য ডিরেক্টরির বিদ্যমান নয়, সোর্স ফাইল থাকে কিন্তু পাঠযোগ্য নয়, ডিস্ক পূর্ণ, শুধুমাত্র পাঠযোগ্য ফাইল সিস্টেম, আই ত্রুটি, উপেক্ষা করা হবে cpহচ্ছে না PATHএকরকম ...)
ভ্লাদিমির Panteleev

অপ্রত্যাশিত টোকেনের নিকটে সিনট্যাক্স ত্রুটি `|| '
থ্যাং করুন

13

আপনি লাইন বরাবর কিছু সন্ধান করছেন

if [ -e file ]
 then cp file /somewhere
fi

(দুর্ভাগ্যক্রমে, -fবিকল্পটি আপনি যে সন্ধান করছেন তাতে ড্রয়েড নয়))

যদি আপনি কোনও গ্লোব মিলাতে চান, তবে এটি কার্যকর হবে না; findপরিবর্তে ব্যবহার করুন, যেমন:

find ./src -name \*.h -exec cp {} ./destination \;

নোট করুন যে এই জাতীয় পদ্ধতির সাথে একটি সম্ভাব্য টেকটিইউ সমস্যা রয়েছে (যেমন আপনি যদি ব্যবহার করেন set -e, এবং ফাইলটি [এবং cpঅনুরোধগুলির মধ্যে অদৃশ্য হয়ে যায় , আপনার স্ক্রিপ্টটি ক্র্যাশ হয়ে যাবে)।
ভ্লাদিমির পানতেলিভ

9

পুরানো প্রশ্ন, তবে এখনও অন্যদের জন্য প্রাসঙ্গিক হতে পারে।
আপনার যদি সিপি ব্যবহারের প্রয়োজন না হয় তবে আপনি rsync দিয়ে চেষ্টা করতে পারেন।
গন্তব্য ডিরেক্টরিতে কোনও উত্স থেকে সমস্ত ফাইল অনুলিপি করতে, চালান:

rsync -avzh --ignore-errors /path/to/source /path/to/destination

Rsync লিনাক্স, ম্যাক ওএস এক্স বা ফ্রিবিএসডি এর মতো বেশিরভাগ ইউনিক্সের মতো সিস্টেমের সাথে আসে।


4
আপনি CP পরিবর্তে rsync ব্যবহার করতে পারে, প্যারামিটার যোগ --ignore-missing-args: rsync -av --ignore-missing-args ./src/*/*.h ./aaaএই সুবিধা ধরে আছে --ignore-errorsযে উপেক্ষিত শুধুমাত্র ত্রুটি উৎস এর সাথে সম্পর্কিত ঐ বিদ্যমান না ফাইল। সঙ্গে --ignore-errorsযে ত্রুটি উপেক্ষা করা হয়, বিপজ্জনক হতে পারে। এছাড়াও, অ্যাকাউন্টটি বিবেচনা করুন যে এই প্যারামিটারটি মোটামুটি সাম্প্রতিক so
jesjimher

6

ফলাফলটিকে সত্যে পাইপ করা নিশ্চিত করে যে আদেশটি সর্বদা সফল হবে। আমি লিনাক্সে চেষ্টা করেছি তবে কোনও ম্যাক ওএসে নয়:

cp ./src/*/*.h ./aaa | true

5
সাধারণ পাইপ |সর্বদা চালিত হয় যখন ||কেবল কোনও ত্রুটির ক্ষেত্রে করা হয়। এবং trueসাধারণত বাইনারি হয় যখন কোলন :একটি অন্তর্নির্মিত হয় এবং পিআইডি গ্রাস করে না।
অট--

MacOS- এ একটি বাশ স্ক্রিপ্ট - "সিপি।
বিবেক

2

আপনি সঠিক ত্রুটি স্থিতি জোর করতে পারে। একটি ফাংশন সহ:

$ cpalways () { cp $1 $2 2>/dev/null ; return 0 ; }

নিম্নলিখিত দেওয়া:

$ ls foo bar baz
ls: baz: No such file or directory
bar foo

নিয়মিত অনুলিপি একটি ত্রুটি ফিরে আসবে। এটি 1 এর প্রস্থান স্থিতি ফিরে আসবে।

$ cp baz bar ; echo $?
cp: baz: No such file or directory
1

যদি আমরা উপরের সিপলওয়ে () ফাংশনটি ব্যবহার করি তবে যে কোনও ত্রুটি গোপন থাকবে:

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