Bash coi tích hợp timenhư một trường hợp đặc biệt, khi phân tích cú pháp dòng lệnh.
Như có thể được đọc trong trang bash, dòng được gõ trước tiên được chia thành một danh sách:
pipeline ; pipeline
nơi một đường ống là:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
hoặc trong trường hợp của chúng tôi, chỉ cần:
time command
tức là nếu có thời gian thì lệnh cũng phải có mặt.
[Có một trường hợp đặc biệt cho phép timetheo dõi một dòng mới, nhưng điều đó không áp dụng ở đây]
Vì vậy, trong trường hợp của chúng tôi, chúng tôi có:
time;date
được chia thành hai đường ống:
1. time
2. date
và đường ống 1 không được hình thành tốt, vì chúng ta timekhông có lệnh. Do đó có lỗi.
Lưu ý rằng dòng lệnh timekhông hoạt động ở đây:
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bash phân tích cú pháp này như mong đợi, thành 2 đường ống:
1. /usr/bin/time
2. date
và /usr/bin/timesau đó từ chối chạy mà không có đối số. Lưu ý rằng đây là lỗi từ /usr/bin/timekhông phải lỗi từ bash.
Lý do mà back-tick hoạt động là vì back-tick dừng timeđược hiểu là một yếu tố đặc biệt trong đường ống.
tức là với back-tick:
`time`;date
nó được phân tích thành hai đường ống:
1. `time`
2. date
Hãy nhớ rằng một đường ống, trong trường hợp của chúng tôi, là:
[time] command
và vấn đề ban đầu là chúng tôi timekhông có lệnh, điều đó không được phép. Nhưng bây giờ chúng ta chỉ cần có lệnh:
`time`
không có từ trước time, vì dấu tick có nghĩa timeđược hiểu là lệnh, không phải là từ trước.
Vì vậy, bash sau đó chạy nội trang của nó timemà không có đối số, được chấp nhận. Nó không tạo ra đầu ra, và chúng tôi thấy không có lỗi.
Lưu ý rằng:
`time`
thực sự chạy kết quả của tích timehợp, tức là nó chạy bất cứ thứ gì tích timehợp tạo ra trên thiết bị xuất chuẩn. Nhưng vì timebản thân nó không viết bất cứ điều gì cho thiết bị xuất chuẩn, nó dường như hoạt động.
Cuối cùng, nó đã được lưu ý rằng điều này hoạt động:
time ; ; date
Điều mà tôi không thể giải thích, thật đáng buồn :)
time;datevsdate;time. Đây có vẻ là một vấn đề với đường ống trongbashvà char cuối cùng được tạo ra vớitimeđầu ra. Các kết quả được kiểm tra trong các trình giả lập thiết bị đầu cuối khác nhau là: - [Bash] $ date; time # [OK] $ time; date # [ NotOK ] bash: lỗi cú pháp gần mã thông báo không mong đợi `date '$ time # chỉ lỗi không xuất hiện rằng đó là lỗi kết quả của bất kỳ ngày nào. - [Csh] $ date; time # [OK] $ time; date # [OK] - [Tcsh] $ date; time # [OK] $ time; date # [OK] - [Ksh] $ date; time # [ OK] $ time; ngày # [OK]