প্রথমে আমি একটি পরীক্ষার বেস করব - 5 ফাইল এবং একটি ফোল্ডার:
touch file1 file2 file3 file4 file5
mkdir folder
এরপরে আমি একটি পরীক্ষা কমান্ড চালাব। -v
বিকল্প নির্দিষ্ট করে আমি প্রতি কমান্ড শেল, executes থেকে প্রিন্ট করা চাই যে stderr
। -x
বিকল্প নির্দিষ্ট করে আমি চাই যে একই মুদ্রিত stderr
- কিন্তু আমি এটি সম্পন্ন চান পর কমান্ড মূল্যায়ন করা হয় কিন্তু আগে শেল করে সঞ্চালিত হয়।
sh -cxv 'echo mv *'
আউটপুট
echo mv *
+ echo mv file1 file2 file3 file4 file5 folder
mv file1 file2 file3 file4 file5 folder
সুতরাং আপনি দেখতে পাচ্ছেন যে আমি কমান্ডটি শেল ফিড করব এবং শেলটি প্রসারিত হওয়ার পরে কার্যকর করা echo mv *
কমান্ডটি সেই ফাইল এবং ফোল্ডারের সমস্তটি অনুসরণ করবে। *
echo mv
ডিফল্টরূপে শেলটি গ্লোবগুলি প্রসারিত করে :
sh -cxv 'echo file[1-5]'
আউটপুট
echo file[1-5]
+ echo file1 file2 file3 file4 file5
file1 file2 file3 file4 file5
এটি set [+-]f
গ্লোব ফাংশনের ফলাফল :
sh -cxvf 'echo file[1-5]'
আউটপুট
echo file[1-5]
+ echo 'file[1-5]'
file[1-5]
সুতরাং আপনি যখন শেলটিতে একটি কমান্ড চালান যখন ডিফল্ট বিকল্পগুলির সাথে কনফিগার mv *
করা শেলের মতো শেল *
শব্দের মধ্যে প্রসারিত হয় বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের একটি আর্গুমেন্টের তালিকা স্থানীয় অনুসারে বাছাই করা হয়। এটা তোলে প্রাপ্ত syscall করে exec(ve)
জন্য mv
(মূলত) এই যুক্তি তালিকা যোগ করা হয়। সুতরাং mv
হিসাবে শেল তাদের globs এবং তাদের বাছাই করে এর সব আর্গুমেন্ট পায়। strace
এই প্রভাবগুলি দেখার জন্য করা ছাড়াও , আপনি আবার ডিবাগ আউট ব্যবহার করতে পারেন যেমন:
sh -s -- mv * <<\SCRIPT
sed -n l /proc/$$/cmdline
echo "$@"
SCRIPT
আউটপুট
sh\000-s\000--\000mv\000file1\000file2\000file3\000file4\000file5\000folder\
\000$
mv file1 file2 file3 file4 file5 folder
এবং বহনযোগ্য:
( PS4= IFS=/; set -x mv *; : "/$*/" ) 2>&1
আউটপুট
: /mv/file1/file2/file3/file4/file5/folder/
মূলত, শেল, executes mv
ডিরেক্টরি বিষয়বস্তু সঙ্গে (এবং যদি এটা খালি না থাকে নামের সাথে শুরু সঙ্গে ফাইল / ফোল্ডার সহ না .
) তার যুক্তি তালিকা হিসাবে। mv
POSIX এর চূড়ান্ত যুক্তিটিকে ডিরেক্টরি হিসাবে ব্যাখ্যা করার জন্য নির্দিষ্ট করা হয় যদি এটি দুটিরও বেশি আর্গুমেন্টের সাথে আহ্বান করা হয় - একইভাবে ln
হয় (কারণ, প্রকৃতপক্ষে, তারা অন্তর্নিহিত ফাংশনে অবিশ্বাস্যরূপে একই সরঞ্জাম) ।
echo
যদিও যথেষ্ট :
sh -cxv 'mv *' ; ls
আউটপুট
mv *
+ mv file1 file2 file3 file4 file5 folder
folder/
সমস্ত ফাইল চূড়ান্ত যুক্তিতে স্থানান্তরিত হয়েছিল - কারণ এটি একটি ফোল্ডার। এখন যদি এটি ফোল্ডার না হয়?
sh -cxv 'cd *; mv *'; ls . *
আউটপুট
cd *; mv *
+ cd folder
+ mv file1 file2 file3 file4 file5
mv: target ‘file5’ is not a directory
.:
folder/
folder:
file1 file2 file3 file4 file5
এই হল কিভাবে POSIX নির্দিষ্ট করে mv
যে ক্ষেত্রে আচরণ করা উচিত:
mv [-if] source_file target_file
mv [-if] source_file... target_dir
প্রথম সংক্ষিপ্ত আকারে, mv
ইউটিলিটি Source_file অপারেন্ড দ্বারা চিহ্নিত ফাইলটিকে টার্গেট_ফায়াল দ্বারা নির্দিষ্ট গন্তব্যে নিয়ে যাবে । এই প্রথম সংশ্লেষ ফর্মটি ধরে নেওয়া হয় যখন চূড়ান্ত অপারেন্ডটি কোনও বিদ্যমান ডিরেক্টরিকে নাম দেয় না এবং কোনও বিদ্যমান ডিরেক্টরিকে উল্লেখ করে প্রতীকী লিঙ্ক না করে। এই ক্ষেত্রে, যদি সোর্স_ফাইলে একটি ডিরেক্টরি-নির্দেশিত ফাইলের নাম এবং টার্গেট_ফায়াল একটি শেষের /slash
অক্ষর দিয়ে শেষ হয় তবে এটিকেmv
ত্রুটি হিসাবে বিবেচনা করা হবে এবং কোনও সোর্স_ফাইলে অপারেশনগুলি প্রক্রিয়া করা হবে না।
দ্বিতীয় mv
সংশ্লেষ আকারে, Source_file অপারেন্ডের নামে চিহ্নিত প্রতিটি ফাইলকে টার্গেট_ডির অপারেন্ড দ্বারা বিদ্যমান ডিরেক্টরিতে একটি গন্তব্য ফাইলে স্থানান্তরিত করা হবে , বা লক্ষ্য_ডির একটি বিদ্যমান ডিরেক্টরিকে উল্লেখ করে একটি প্রতীকী লিঙ্ক থাকলে উল্লেখ করা হবে। প্রতিটি উত্স-ফাইলের গন্তব্য পথ হ'ল লক্ষ্য নির্দেশকের সংমিশ্রণ, লক্ষ্যটি /slash
যদি একটিতে শেষ না হয় তবে একটি একক অক্ষর /slash
এবং উত্স_ফায়ালের শেষ পথের উপাদানটি । এই দ্বিতীয় ফর্মটি ধরে নেওয়া হয় যখন চূড়ান্ত অপরেন্ড একটি বিদ্যমান ডিরেক্টরিটির নাম দেয়।
সুতরাং যদি *
প্রসারিত হয়: