Tại sao định dạng đầu ra của thời gian khác nhau tùy thuộc vào cách tôi gọi nó


14

Đó có thể là câu hỏi của người mới, nhưng tôi không hiểu cách cấu hình này và tại sao định dạng đầu ra của timelệnh lại khác nhau trong hai trường hợp sau:

nếu được sử dụng qua time, đầu ra là ba hàng với thông tin cơ bản

$ time sleep 1

real    0m1.003s
user    0m0.000s
sys     0m0.000s

sau đó tôi có thể kiểm tra xem nhị phân nào được sử dụng

$ which time
/usr/bin/time

và gọi trực tiếp để nhận đầu ra ở định dạng hoàn toàn khác, với nhiều thông tin hơn

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2000maxresident)k
0inputs+0outputs (0major+77minor)pagefaults 0swaps

không có bí danh liên quan đến time

$ alias | grep time
$ 

Tôi đang chạy Ubuntu 16.04.


Đó là lý do tại sao whichvề cơ bản là vô dụng ...
Bakuriu

Câu trả lời:


23

Cái đầu tiên là bashtừ khóa dựng sẵn của riêng nó time(được biên dịch bash) và cái thứ hai là từ khóa thực thi bên ngoài time( /usr/bin/time, đi kèm với timegói).

Ngoài ra, whichkhông thể hiển thị các lệnh hoặc từ khóa dựng sẵn của shell khi nó chỉ tìm kiếm thông qua PATH, bạn cần sử dụng typecho điều đó. Là một vỏ được tích hợp sẵn, typecũng có thể kiểm tra thêm các thực thể bên trong của vỏ (và cả PATH), vì vậy bạn có thể phát hiện sự khác biệt bằng cách:

type -a time

Đây:

$ type -a time
time is a shell keyword
time is /usr/bin/time

Cái đầu tiên sẽ được thực thi nếu bạn chỉ sử dụng time. Bạn cũng có thể nhận được cái đang được thực thi chỉ bằng cách sử dụng type(không có -a):

type time

Các -ayêu typecầu tìm kiếm trong các thực thể nội bộ của shell và cũng PATHnhư tìm kiếm trong tất cả các nguồn có thể.

Nếu vì lý do nào đó bạn cần cái bên ngoài, hãy sử dụng bất kỳ một trong những:

\time
"time"
'time'
command time

ah, tôi hiểu rồi, vậy whichkhông xem xét nội dung sao? Và tôi nên luôn luôn kiểm tra với type -ađầu tiên. Trên thực tế, có vẻ như typelà vượt trội so với whichvì nó sẽ tạo ra vị trí /usr/bin/timecũng
xaxa

@xaxa Vâng, hãy kiểm tra các chỉnh sửa của tôi.
heemayl

cảm ơn vì câu trả lời chi tiết Điều gì là whichhữu ích cho sau đó?
xaxa

1
@xaxa typethực sự vượt trội --- nếu bạn đang sử dụng bash. Một vỏ khác có thể không có typebulitin hoặc timedựng sẵn.
jpaugh

2
@jpaugh Không hoàn toàn đúng. POSIX cho phép timeđể được bên ngoài chỉ nhưng không type, typecó sẵn trong tất cả các vỏ phù POSIX.
heemayl

4

Một điểm khác biệt nữa giữa các tiện ích dựng sẵn và các tiện ích bên ngoài là, phần mềm dựng sẵn của Bash time sẽ hoàn thành các đường ống hoặc gọi các hàm vỏ (rõ ràng là các vòng lặp, nhưng hướng dẫn sử dụng dường như không hứa hẹn điều đó). Không timethể bên ngoài , vì nằm ngoài vỏ, không biết về mã xung quanh.

bash$ time echo blah | sleep 3
real    0m3.002s
...
bash$ /usr/bin/time echo blah | sleep 3
0.00user 0.00system 0:00.00elapsed ?%CPU 
...
bash$ time for x in 1 2 3 ; do sleep 1 ; done
real    0m3.006s
...

Mặc dù thời gian được chỉ định trong tiêu chuẩn, nhưng vẫn không xác định được cách thức hoạt động trong một đường ống, do đó, việc triển khai nội bộ mạnh mẽ hơn như thế này là có thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.