বাশকে অন্তর্নির্মিত শেল না করে বাহ্যিক `টাইম` কমান্ডটি ব্যবহার করুন


27

শেল কীওয়ার্ডের পরিবর্তে আমি কীভাবে বাশ ব্যবহারের সময় বাইনারি (/ usr / bin / সময়) বাইনারি করতে পারি?

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
@ স্টাফেনচাজেলাস সর্বক্ষেত্রে আরও নিখুঁত বিবরণ প্রদানের উত্তরে এটিকে সম্পাদন করতে দ্বিধা বোধ করবেন। commandউদাহরণস্বরূপ যেমন এই বিশেষ ক্ষেত্রে কাজ করে তবে স্পষ্টতই একটি সঠিক উত্তর অর্ধ-ডানদিকের চেয়ে উত্তম।
একটি সিভিএন

1
আপনার উত্তরের শেষ অংশটি ভুল। সময় শেল বিল্টিন নয়, বরং শেল কীওয়ার্ড। builtin timeকাজ করে না
তেরেসা ই জুনিয়র

কমান্ডের অনুরূপ কেবল এটিকে উদ্ধৃত করা হবে:'time' echo test
এমএক্সএমএনএলএনইএন

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 আমি এখনও দেখেছি।
maxywb

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"ইত্যাদি etc.

    $  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তবে PATHed কমান্ড কার্যকর করা হবে (বা বিল্টিন এটি অক্ষম না করা থাকলে)।

  • বিল্টিন ব্যবহার করুন command(এটি বিল্ট-ইনগুলির সাথে কাজ করে না):

    $ command time
  • বিল্ট-ইনগুলির জন্য উপরে যেমন কোনও স্ল্যাশ /কাজ ব্যবহার করে:

    $ /usr/bin/time
  • বিল্ট-ইনগুলির জন্য উপরে হিসাবে, একটি উপাধি এখানেও কাজ করে:

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

[1] ধরে নেওয়া যাক ~/bin/test"বাহ্যিক পরীক্ষা" প্রিন্টগুলিতে একটি বাহ্যিক নির্বাহযোগ্য আছে । এবং আরও: সক্রিয় PATH এর ~/binচেয়ে এগিয়ে আছে তা ধরে নেওয়া যাক /bin



2

enableনির্দিষ্ট বিল্ট-ইনগুলি অক্ষম করতে আপনি কমান্ডটি ব্যবহার করতে পারেন ।

$ enable -n kill

তবে timeএটি একটি কীওয়ার্ড তাই এটি কাজ করবে না।

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

সুতরাং আপনি এটির ওভাররাইড করার জন্য একটি উপনাম তৈরি করে রেখে গেছেন:

$ alias time=/usr/bin/time

নাঃ। সময় হ'ল শেল কীওয়ার্ড, শেল অন্তর্নির্মিত নয়। আমি কেবল আমার প্রশ্নটি সম্পাদন করতে যাচ্ছিলাম যে আপনি যখন উত্তরটি দেখেছেন তখন সক্ষম -n কাজ করে না।
ডেভিড হোল্ডম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.