আমি কয়েকটি কমান্ডের ধরণ জানতে চাই। এটা নল বা কি সম্ভব xargs
থেকে একটি অনুসন্ধান ফলাফলে find
মধ্যে type
লিনাক্স কমান্ড?
উদাহরণ স্বরূপ:
find . -name anacron | type
অথবা
find . -name anacron | xargs type
আমি কয়েকটি কমান্ডের ধরণ জানতে চাই। এটা নল বা কি সম্ভব xargs
থেকে একটি অনুসন্ধান ফলাফলে find
মধ্যে type
লিনাক্স কমান্ড?
উদাহরণ স্বরূপ:
find . -name anacron | type
অথবা
find . -name anacron | xargs type
উত্তর:
type
কোনও সাধারণ আদেশ নয়। এটি শেল বুটিন দেখা:
$ type type
type is a shell builtin
সুতরাং, আপনি ডাকা প্রয়োজন bash
সঙ্গে -c
অর্জন করা কি আপনি চান
$ find . -name anacron | xargs -I '{}' bash -c "type {}"
বা এমনকি সহজ (কোনও প্রয়োজন নেই xargs
):
$ find . -name anacron -exec bash -c "type {}" \;
এটি সন্ধান করা bash -c "type ./file"
প্রতিটি ফাইল সহ কল করবে find
। -I
এর xargs
অর্থ, {}
পরে এখানে ব্যবহারের জন্য আমরা কোনও স্থানধারককে সংজ্ঞায়িত করি । এই স্থানধারকটি ফাইলের নামের সাথে প্রতিস্থাপিত হয়েছে।
শেল বিল্টিনগুলি কেন কাজ করে না xargs
:
[...] বিল্টিন কমান্ডগুলি শেলের মধ্যেই রয়েছে। একটি বিল্টিন কমান্ডের নাম যখন কোনও সাধারণ কমান্ডের প্রথম শব্দ হিসাবে ব্যবহৃত হয়, শেলটি অন্য কোনও প্রোগ্রাম না চালিয়ে সরাসরি কমান্ডটি কার্যকর করে। [...]
xargs স্ট্যান্ডার্ড ইনপুট থেকে আইটেম পড়ে, [...], এবং আদেশটি কার্যকর করে
এক্ষেত্রে কমান্ডটি একটি সহজ এক্সটুয়েটেবল এবং শেল বিল্টিন এক্সিকিউটযোগ্য নয়। এটি ফাইল সিস্টেমে খুঁজে পাওয়া যায় না। এটি খোলের মধ্যেই। সুতরাং আপনাকে শেলটি কল করতে হবে এবং বিল্টিন কমান্ডটি আহ্বান করতে ডাকা শেলটি বলতে হবে। এটাই হ'ল সুখে bash -c "command"
।
find ... -exec bash -c 'type "$@"' _ {} +
এখানে কয়েকটি সমস্যা রয়েছে (কিছু ইতিমধ্যে হাইলাইট হয়েছে):
type
একটি অন্তর্নির্মিত। এটি কোনও কমান্ড নয় যা সমাধান করা হয়েছে, এটি ব্যাশের অভ্যন্তরে একটি ফাংশন। দেখুন man bash-builtins
। এটি কেবল বাশের প্রসঙ্গে কাজ করে তাই কোনও xargs
বা -exec
জালযুক্ত সাব-শেল নয়।type
নিজস্ব পথ অনুসন্ধান করতে অভ্যস্ত। যদি আপনি এটিকে কোনও পথ দেন (যেমনটি find
করা হবে না) তবে সম্ভবত এটি সেই পথটি ফিরে আসবে। readlink -f
আপনি যদি কেবল সিমলিঙ্কগুলি সমাধান করার চেষ্টা করছেন তবে আরও ভাল হতে পারে; এবং আপনি মধ্যে নল করতে পারেন xargs readlink
বা -exec readlink -f {} +
সব দিন লম্বা।আপনি যা চেষ্টা করছেন তা করতে পারবেন না এমনটি বলার অপেক্ষা রাখে না। দুটি বিকল্প আছে। type
কমান্ড একবারে যাতে আপনি শুধু এটা সকল নামের একবারে প্রদান করতে পারে অনেক নাম সব ব্যবস্থা করতে সক্ষম:
type $(find /usr/sbin -name anacron)
অনেক কমান্ডের জন্য, যদি খুব বেশি আর্গুমেন্ট থাকে আপনি কমান্ড লাইনের দৈর্ঘ্য সীমা অতিক্রম করবেন (দেখুন getconf ARG_MAX
)। তবে, type
শেলটি তৈরি হওয়ার পরে এটি কোনও ক্ষেত্রে প্রযোজ্য নয় এবং কোনও নতুন প্রক্রিয়া আইডি তৈরি করে না (দৈর্ঘ্য সীমাটি একটি সাধারণ কমান্ড লাইনে শিশু প্রক্রিয়া দ্বারা ব্যবহৃত এক্সিকিউটিভ) ফাংশনের ক্ষেত্রে প্রযোজ্য )।