"टाइप" कमांड के लिए पाइपिंग


10

मैं कई आदेशों के प्रकार का पता लगाना चाहता हूं। यह पाइप या संभव है xargsसे एक खोज परिणाम findमें typeलिनक्स में आदेश?

उदाहरण के लिए:

find . -name anacron | type

या

find . -name anacron | xargs type

मुझे लगता है कि ओली का जवाब सबसे अच्छा जवाब है। अराजकता जवाब सिर्फ काम करता है, लेकिन ओली जवाब चतुर है।
हेलियो

जवाबों:


17

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"


3
आप इसे संक्षेप में बता सकते हैंfind ... -exec bash -c 'type "$@"' _ {} +
'10

2
वास्तव में @muru, मैं फिर से अपने खुद के जवाब पढ़ने के लिए और देखा यह =)
अराजकता

11

यहां कुछ समस्याएं हैं (कुछ पहले से ही उजागर):

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


1
थैंक्स ओली! इस प्रकार के लिनक्स नौसिखिया ने "प्रकार" और उसके व्यवहार के बारे में आज कुछ नया सीखा है।
लजिनकाज़मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.