बाश मेक-इन के बजाय बाहरी `टाइम` कमांड का उपयोग करें


27

मैं शेल कीवर्ड के बजाय डिफ़ॉल्ट रूप से बश उपयोग समय बाइनरी (/ usr / बिन / समय) कैसे बना सकता हूं?

which timeरिटर्न /usr/bin/time
type timeरिटर्न time is a shell keyword
रनिंग timeस्पष्ट रूप से शेल कीवर्ड निष्पादित कर रहा है:

$ time

real    0m0.000s
user    0m0.000s
sys     0m0.000s
$ /usr/bin/time
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
   [--portability] [--format=format] [--output=file] [--version]
   [--quiet] [--help] command [arg...]

enable -n time रिटर्न bash: enable: time: not a shell builtin

जवाबों:


30

आप commandसामान्य लुकअप प्रक्रिया को बायपास करने के लिए शेल का उपयोग कर सकते हैं और दिए गए कमांड को किसी अन्य संभावनाओं (शेल बिल्ट-इन, उपनाम आदि) की परवाह किए बिना एक बाहरी कमांड के रूप में चला सकते हैं। यह अक्सर उन लिपियों में किया जाता है, जो पूरे सिस्टम में पोर्टेबल होने की आवश्यकता होती है, हालांकि संभवतः शॉर्टहैंड का उपयोग करना अधिक \(जैसा कि \rmइसके बजाय command rmया rm, जैसा कि विशेष रूप से उत्तरार्द्ध को कुछ ऐसा नहीं कहा जा सकता है rm -i)।

$ time

real    0m0.000s
user    0m0.000s
sys 0m0.000s
$ command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]
$ 

यह एक उपनाम के साथ इस्तेमाल किया जा सकता है, जैसे:

$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]
$ 

उदाहरण के लिए इस पर लाभ यह alias time=/usr/bin/timeहै कि आप timeबाइनरी को पूर्ण पथ निर्दिष्ट नहीं कर रहे हैं , बल्कि सामान्य पथ खोज तंत्र पर वापस गिर रहे हैं।

aliasआदेश ही जैसे ~ / .bashrc या /etc/bash.bashrc में जा सकते हैं (उत्तरार्द्ध सिस्टम पर सभी उपयोगकर्ताओं के लिए वैश्विक है)।

विपरीत मामले के लिए (शेल में निर्मित मामले का उपयोग करने के लिए एक उपनाम परिभाषित है), आप कुछ इस तरह का उपयोग करेंगे builtin time, जो फिर से सामान्य खोज प्रक्रिया को ओवरराइड करता है और नामित शेल-इन-रन चलाता है। बैश मैन पेज में उल्लेख किया गया है कि इसका उपयोग अक्सर cdएक फ़ंक्शन के साथ कस्टम कार्यक्षमता प्रदान करने के लिए किया जाता है cd, जो बदले cdमें वास्तविक काम करने के लिए बिलिन का उपयोग करता है।


आप यह भी पूछताछ कर सकते हैं कि कमांड के उपयोग से कोई विशेष कमांड कहां आ रही है type -a <cmd>
SLM

12
commandबिल्डिंस को बायपास नहीं करता (सिवाय zshअन्य गोले के अनुकरण के नहीं)। यह कार्यों को दरकिनार करता है और यही इसके अस्तित्व का मुख्य कारण है। इसके दूसरे भूमिका दूर करने के लिए है विशेष में विशेष builtins । यह केवल उपनामों और खोजशब्दों को zshदरकिनार करता है क्योंकि वे केवल पहली स्थिति में विस्तारित होते हैं ( उदाहरण के लिए, यह वैश्विक उपनामों को बायपास नहीं करता है)। कोई timeबैश बिलियन नहीं है। timeएक कीवर्ड है, इसलिए आप उदाहरण के लिए कर सकते हैं time { foo; bar; }
स्टीफन चेज़लस

1
@StephaneChazelas हर तरह से एक अधिक सटीक विवरण प्रदान करने के लिए जवाब में संपादित करने के लिए स्वतंत्र महसूस करता है। commandइस विशेष मामले में, जैसा कि अनुकरणीय है, लेकिन स्पष्ट रूप से एक सही उत्तर आधे-दाहिने की तुलना में बेहतर है।
बजे एक CVn

1
आपके उत्तर का अंतिम भाग गलत है। समय शेल बिल्ट नहीं है, बल्कि शेल कीवर्ड है। builtin timeकाम नहीं करता है।
टेरेसा ई जूनियर

कमांड के समान ही इसे उद्धृत करना होगा:'time' echo test
mxmlnkn

9

किसी पथ को निर्दिष्ट करने या किसी अन्य बिलिन का उपयोग किए बिना कीवर्ड को हटाने के लिए बैश में एक शॉर्टकट होता है command: बैकस्लैश से इसे एस्केप करें।

=^_^= izkata@Izein:~$ time

real    0m0.000s
user    0m0.000s
sys     0m0.000s
=^_^= izkata@Izein:~$ \time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]

व्यक्तिगत रूप से, मुझे यह अधिक पठनीय और सुरक्षित लगता है, क्योंकि यह संभव है:

=^_^= izkata@Izein:~$ alias command=echo
=^_^= izkata@Izein:~$ command time
time

8
नोट यह है कि बनाता है के हवाले से या कुछ भी के किसी भी रूप है कि नहीं टोकन timeकरना होगा: ti\me, 'time', ti""me, ti${-##*}me, ${-+time}... यही कारण है कि किसी भी खोल कीवर्ड पर लागू होता है।
स्टीफन चेज़लस

सर्वश्रेष्ठ PS1 मैंने अभी तक देखा है।
मैक्सविब

1
@ मोमीक्वब इसके अलावा, यह सिर्फ सजावटी नहीं है - अगर अंतिम आदेश विफल हो गया, तो खुश चेहरा लाल रंग में बदल जाता है(x_x)
इज़्काता

4

बिल्ट-इन (उदाहरण परीक्षण के लिए) के सामान्य समाधान हैं [1] :

  • उपयोग env(सभी गोले)

    $ env test
    external test
    
  • बिल्डिन को अक्षम करें (केवल बैश और zsh):

    $ test 1 = 1 && echo "yes"
    yes
    $ enable -n test        ### for bash. Re-enable with "enable test".
    $ disable test          ### for zsh. Re-enable with "enable test".
    $ test
    external test
    
  • /कमांड को कॉल करने के लिए किसी भी स्लैश का उपयोग करें (सभी गोले):

    $ test 1 = 1 && echo "yes"
    yes 
    $ ~/bin/test
    external test
    
  • एक उपनाम बनाओ (यदि shopt -s expand_aliasesउपयोग किया जाता है , तो एक बाश स्क्रिप्ट के अंदर विफल रहता है):

    $ alias test='~/bin/test'             ### remove with 'unalias test'.
    $ test
    external test
    

लेकिन समय एक बिलियन नहीं है।

शब्द timeएक "आरक्षित शब्द" है, न कि एक कमांड और न ही एक अंतर्निहित। इस समाधान को सक्षम करें:

  • शब्द को उद्धृत करें। यह बिल्ट-इन के साथ काम नहीं करता है।
    कार्य उद्धृत करने के कई रूप: \time "time" 'time' ti\me ti"me"इत्यादि।

    $  time
    
    real    0m0.000s
    user    0m0.000s
    sys     0m0.000s
    
    $ \time
    Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
           [--portability] [--format=format] [--output=file] [--version]
           [--quiet] [--help] command [arg...]
    

    यह एक उपनाम को बायपास करने के लिए उपयोगी है। यहां तक ​​कि अगर उर्फ किया गया है test, \testतो पाथेड कमांड को निष्पादित करेगा (या अगर यह अक्षम नहीं हुआ है तो बिलिन)।

  • बिलिन का उपयोग करें command(यह बिल्ट-इन के साथ काम नहीं करता है):

    $ command time
  • बिल्ट-इन के लिए ऊपर के रूप में, किसी भी स्लैश /कार्यों का उपयोग करते हुए :

    $ /usr/bin/time
  • बिल्ट-इन के लिए ऊपर, एक उपनाम भी यहाँ काम करता है:

    $ alias time='command time'
    $ alias time='/usr/bin/time'
    

[१] मान लें ~/bin/testकि उस "बाहरी परीक्षण" में एक बाहरी निष्पादन योग्य है । और आगे: मान लेते हैं कि सक्रिय पथ में ~/binआगे है /bin



2

आप enableकुछ बिल्ट-इन को निष्क्रिय करने के लिए कमांड का उपयोग कर सकते हैं ।

$ enable -n kill

हालाँकि timeयह एक कीवर्ड है इसलिए यह काम नहीं करेगा।

$ builtin time
bash: builtin: time: not a shell builtin

इसलिए आप इसे ओवरराइड करने के लिए एक उपनाम बनाने के साथ बचे हैं:

$ alias time=/usr/bin/time

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