একটি সিমিলিংক থেকে নিয়মিত ফাইলের পার্থক্য করা


22

আমি একটি বাশ স্ক্রিপ্ট লিখছি যা একটি নিয়মিত ফাইলকে একটি সিমিলিংক থেকে আলাদা করতে হবে। আমি ভেবেছিলাম / টেস্ট এক্সপ্রেশন দিয়ে আমি এটি করতে পারব, তবে আমার প্রত্যাশা মতো এটি কাজ করে না:

$ touch regular_file
$ test -f regular_file; echo $?
0
$ test -h regular_file; echo $?
1
$ ln -s regular_file symlink
$ test -h symlink; echo $?
0
$ test -f symlink; echo $?
0

তা কেন? এবং, আমি কীভাবে এটি সঠিকভাবে করতে পারি?

উত্তর:


20

দেখে মনে হচ্ছে আপনি কেবল নিজের পরীক্ষাগুলি খানিকটা ছিটকে যাচ্ছেন। আপনার উভয় পরীক্ষা চালানোর দরকার নেই, এই ক্ষেত্রে কেবলমাত্র আপনার প্রয়োজন -hফাইলটি একটি সিমলিংক কিনা তা আপনাকে জানাতে হবে।

test -h file && echo "is symlink" || echo "is regular file"

-fপরীক্ষা শুধুমাত্র আপনি বলে যদি বস্তুর একটি ফাইল। এটি 0যদি ডিরেক্টরি বা ডিভাইস নোড বা ডিরেক্টরিতে একটি সিমলিংক হয় তবে এটি ফিরে আসবে, তবে 1কোনও ফাইলে একটি সিমলিংকে ফিরে আসবে ।

আপনার যদি এটিরও জানতে হবে যে এটি কোনও ডিরেক্টরি পরিবর্তে কোনও ফাইলের একটি সিমিলিংক ছিল, তবে আপনার উভয় পরীক্ষার ফলাফলকে কিছুটা যুক্তির সাথে একত্রিত করতে হবে।


আমি ডক্স থেকে বোঝা যায়, এর মধ্যে পার্থক্য -eএবং -fযে ছিল -eযদি (যে কোন ধরনের) একটি ফাইল অস্তিত্ব চিনতাম করা হয়েছিল, এবং -fপরীক্ষা বিশেষভাবে ছিল ফাইলটি অস্তিত্ব এবং একটি নিয়মিত ফাইল ছিল। দেখে মনে হচ্ছে যে "নিয়মিত ফাইল" কী তা আমি ভুল
বুঝেছি

1
@ নিউপ্রাপ্টর: হ্যাঁ, আপনি ডক্সকে ভুল বুঝেছিলেন। কোনও সিমলিংককে একটি নিয়মিত ফাইল হিসাবে বিবেচনা করা হয় যা কোনও ফাইলের অন্য ধরণের নোডের বিপরীতে থাকে (ব্লক-ডিভাইস নোড, অক্ষর-ডিভাইস নোড, ডিরেক্টরি ইত্যাদি)। ফাইলের টিওয়াইপিই কী কী তা আপনি যদি জানতে চান তবে একটি ফাইল টাইপের নির্দিষ্ট পরীক্ষা যেমন -hসিমলিংকের -pজন্য, নামযুক্ত পাইপ ইত্যাদির জন্য চালাতে হবে
কালেব

তারপরে, যদি ফাইলটি পাইপ বা সিমলিংক নয় এমন অর্থে নিয়মিত ফাইল হয় তবে কীভাবে পরীক্ষা করব? আমি কি এই জন্য অন্য প্রশ্ন খুলতে হবে?
নুপ্রাপ্টর

@ নিউপ্রাপ্টর: একমাত্র অদ্ভুত ঘটনাটি এমন একটি সিমিলিং যা নিয়মিত ফাইলের সাথে লিঙ্ক করে। অন্যথায়, এটি যদি নিয়মিত ফাইল হিসাবে পরীক্ষা করে, এটি একটি নিয়মিত ফাইল।
ডেভিড শোয়ার্জ

3
টেস্ট -f ডিরেক্টরিটি 1 টি 0 না দিয়ে ফিরে আসবে: টেস্ট -f। ; প্রতিধ্বনি $? (আউটপুট 1)
বহুব্যাপী

7

স্ক্রিপ্টটি কেবলমাত্র সিমলিংকের জন্য পরীক্ষা করা সম্পর্কে ক্যালিব সঠিক। তবে কেন অংশটি বাদ গেল এবং আমি আগ্রহী ছিলাম। যদি আপনি কোর্টিলস উত্স কোডটি দেখেন এবং পরীক্ষার আউটপুটটি স্ট্রেস করেন আপনি দেখতে পাচ্ছেন যে আপনি যখন প্রতীকী লিংক পরীক্ষাটি চালাবেন তখন এটি lstat ব্যবহার করে এবং আপনি যদি -f পরীক্ষা ব্যবহার করেন তবে এটি আসলে 'স্ট্যাট' কল করে যা সিমলিংকের অনুসরণ করে:

$ ln -s varnish_config XXX
$ strace -s 2000 test -L XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-L", "XXX"], [/* 47 vars */]) = 0
lstat("XXX", {st_mode=S_IFLNK|0777, st_size=14, ...}) = 0

$ strace -s 2000 test -L varnish_config 2>&1 | grep varnish
execve("/usr/bin/test", ["test", "-L", "varnish_config"], [/* 47 vars */]) = 0
lstat("varnish_config", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0

$ strace -s 2000 test -f XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-f", "XXX"], [/* 47 vars */]) = 0
stat("XXX", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0

স্ট্যাট ম্যান পৃষ্ঠা থেকে:

   stat() stats the file pointed to by path and fills in buf.

   lstat() is identical to stat(), except that if path is a symbolic link,
   then the link itself is stat-ed, not the file that it refers to.

এর অর্থ -f পরীক্ষাটি যথাযথ ফিরে আসবে যতক্ষণ না নির্দিষ্ট ফাইলের নামটি নিয়মিত ফাইল বা নিজেই একটি নিয়মিত ফাইলের একটি সিমিলিংক হয়।

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