घड़ी कमान उर्फ ​​विस्तार


67

यदि watchकोई अन्य उपनाम वाला कमांड चलाता है , तो यह उपनाम का विस्तार नहीं करेगा। मैंने एकल उद्धरण और दोहरे उद्धरण चिह्नों के साथ कोशिश की है, वास्तव में निम्नलिखित उपनाम दिया गया है:

# alias ll
alias ll='ls -l --color=tty'

निम्न आदेश विफल हो जाएगा

# watch ll
sh: ll: command not found

क्या इस मामले में कमांड लाइन विस्तार का काम नहीं होना चाहिए?

जवाबों:


98

उपनाम केवल पहले तर्क के रूप में विस्तारित होते हैं, या कमांड के अंत में एक अनुगामी स्थान के साथ एक अन्य उपनाम के बाद।

से bashकी help alias:

VALUE में एक अनुगामी स्थान अन्य शब्द को उपनाम के प्रतिस्थापन के लिए जाँचने का कारण बनता है जब उपनाम का विस्तार किया जाता है।

ऐसा करने के लिए, निम्नलिखित प्रयास करें:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

ध्यान रखें कि के कुछ संस्करणों में सहन watchडिफ़ॉल्ट रूप से पट्टी रंग, कुछ संस्करणों पर इस का उपयोग करके रोका जा सकता है --colorया -G


1
यह बिल्कुल भयानक जवाब है! धन्यवाद और निश्चित रूप से +1।
ztank1013

1
धन्यवाद ... इस सभी समय के लिए, मैंने 1. टाइप ll, 2 का उपयोग किया। ctrl + alt + e, 3. फिर उपसर्ग घड़ी दबाएँ। यह एक समय बचाने वाला है।
ऐशसेन

10
दुर्भाग्य से इस पद्धति की एक सीमा है कि आप विकल्प प्रदान नहीं कर सकते watchक्योंकि उपनाम को अगला शब्द होना चाहिए, जबकि watchकमांड को चलाने के लिए इसके तर्क की आवश्यकता होती है। यदि आपने कोशिश की है watch -n 10 <alias>, तो हरा उर्फ ​​का विस्तार नहीं करेगा। इसके चारों ओर काम करने के लिए, आपको एक ऐसा उपनाम चाहिए, जिसमें आपके इच्छित विकल्प शामिल हों (जैसे, `अन्य उपनाम -10 = 'वॉच-एन 10'), फिर भी एक अनुगामी स्थान के साथ।
indiv

2

हो सकता है कि घड़ी देखने से पहले हम स्वयं उर्फ ​​का विस्तार कर सकें?

watch $(alias ll | cut -d\' -f2)

व्याख्या

alias llजैसा दिखता है का आउटपुट :

$ alias ll
alias ll='ls -lAGh'

इसलिए हमने कट की परिधि को एकल उद्धरण के रूप में सेट किया और 2 क्षेत्र को काट दिया, जिससे:

ls -lAGh

यानी विस्तारित उर्फ। इसके बाद दिए गए आर्गनों का निर्माण होता है watch

इसे करने के लिए एक फंक्शन बनाएं

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

फिर,

watcha ll

इच्छानुसार काम करता है। यह भयानक है और सभी प्रकार की स्थितियों में विफल हो जाएगा। माफ़ करना।


0

मुझे लगा कि यहां मूल समस्या निष्पादन के दौरान है watch, यह तर्क " sh -c" दिया गया है जिसका अर्थ है कि अगर उपनाम पर्यावरण llमें परिभाषित नहीं है, sh(dash shell's)तो यह इसका विस्तार नहीं करेगा। लेकिन मैं गलत था और यह मामला नहीं है, ऊपर क्रिस का जवाब सही है।


2
बिल्कुल नहीं। कोशिश करो watch 'alias ll="ls -l --color=tty"; type ll; ll'
क्रिस डाउन 12

इसे सत्यापित करने के लिए तत्काल प्रतिक्रिया के लिए +1। मैं ऊपर गलत था।
सचिन दिवेकर

@ChrisDown, इसलिए भले ही वॉच sh -cआपके " " प्रयोग का उपयोग करता है , आपके स्पष्टीकरण के लिए shभी लागू है। क्या मैं सही हू?
सचिन दिवेकर

1
यह इस बात पर निर्भर करता है कि किस शैल का उपयोग किया जा रहा है sh। ध्यान दें कि यह काम करता है :sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
क्रिस डाउन

0

है watchएक नया इंटरैक्टिव खोल, जो अन्य नाम का विस्तार होगा चलाएँ:

watch -x bash -i -c ll

(हमारा -xइरादा अपने दिए गए कमांड को लपेटने के लिए watchइसका उपयोग करने से रोकने का इरादा है sh -c। हम यह नहीं चाहते हैं क्योंकि हमें इसे इंटरेक्टिव शेल बनाने के लिए पास -iहोने shया करने की आवश्यकता है bash, जो .bashrc पढ़ता है और उपनामों को परिभाषित करता है -x, साथ में , घड़ी निष्पादित करता है। कमांड का उपयोग निष्पादन।)

गाह, वास्तव में, यह काम नहीं करता है। 'Ll' के आउटपुट को एक बार प्रदर्शित करने के बाद, 2 सेकंड सोते हुए, काम थोड़ा सा गूढ़ हो जाता है:

1]+  Stopped                 watch -x bash -i -c ll

यह बंद क्यों हुआ? खुला कंस कहाँ गया [? डारन मुझे लगा कि यह एक शानदार जवाब होगा लेकिन मैं इसे काम नहीं कर सकता।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.