मैं कई आदेशों के प्रकार का पता लगाना चाहता हूं। यह पाइप या संभव है 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
शेल में बनाया गया है और यह एक नई प्रक्रिया आईडी उत्पन्न नहीं करता है ( एक सामान्य कमांड लाइन में चाइल्ड प्रोसेस द्वारा उपयोग की जाने वाली फ़ंक्शन ( लंबाई फ़ंक्शन पर लागू होती है )।