2008-10-08 29 views

Trả lời

12

Nó phục vụ như một lời cảnh báo tốt cho những người không sử dụng bash làm vỏ của chúng tôi, bởi vì chúng tôi sẽ quên rằng một tính năng trong vỏ hàng ngày của chúng tôi sẽ không khả dụng khi mã này được chạy vào thời gian được chỉ định.

ví dụ:

[email protected]$ at 23:00  
warning: commands will be executed using /bin/sh 
at> rm **/*.pyc 
at> <EOT> 
job 1 at 2008-10-08 23:00 

Việc sử dụng '**' có zsh hoàn toàn hợp lệ, nhưng không phải/sbin/sh! Thật dễ dàng để thực hiện những sai lầm này nếu bạn quen với việc sử dụng một hệ vỏ khác, và bạn có trách nhiệm phải nhớ làm điều đúng đắn.

+0

/bin/sh là vỏ Bourne chứ không phải Bash. –

+1

Heck, thậm chí/bin/bash và/bin/sh hoạt động khác nhau, ngay cả khi/bin/sh được symlinked để bash. – ephemient

+0

@ John tốt nó thường là một liên kết tượng trưng để bash ... (không phải trên Ubuntu tuy nhiên ... vì vậy nó quan trọng) – Spudd86

2

Nếu bạn muốn để có được xung quanh thông điệp rằng, có 'at' chạy một kịch bản mà các cuộc gọi một môi trường nhất định, có thể là ksh, bash, csh, zsh, perl, vv

Ngoài - xem 'at' man page http://www.rt.com/man/at.1.html để biết thêm thông tin.

at and batch read commands from standard input or a specified file which are to be executed at a later time, using /bin/sh. 
+2

Không, ý tôi là, làm cách nào để tắt * thông báo cảnh báo? * – raldi

4

Cảnh báo có bất kỳ tác hại nào ngoài việc gây phiền nhiễu không? Trang người đàn ông không đề cập đến bất kỳ cách nào để tắt nó, vì vậy tôi không nghĩ rằng bạn có thể ngăn chặn nó được phát ra mà không cần xây dựng lại của bạn tại từ nguồn.

Bây giờ, nếu bạn muốn chỉ cần không nhìn thấy nó, bạn có thể sử dụng tại [thời gian] 2>/dev/null để gửi nó đi để lãng quên, nhưng thật không may, các tại> nhắc nhở được in để STDERR vì lý do nào đó (một lỗi, IMO - chúng thực sự nên đi tới STDOUT), vì vậy chúng cũng bị ẩn bởi điều này. Nó có thể có thể làm việc lên một số hệ thống ống nước vỏ mà sẽ loại bỏ các cảnh báo mà không cần ăn các lời nhắc, nhưng a) nỗ lực của tôi lúc này (tại [thời gian] 2> & 1 | grep -v cảnh báo) không hoạt động và b) ngay cả khi bạn có thể tìm thấy một kết hợp hoạt động, nó sẽ không phù hợp cho việc tạo răng cưa (vì thời gian ở giữa chứ không phải ở cuối), vì vậy bạn cần phải nhập đầy đủ mỗi khi bạn sử dụng hoặc viết tập lệnh bao bọc khác xung quanh tại để xử lý.

Vì vậy, trừ khi nó gây ra vấn đề thực tế, tôi muốn nói rằng bạn có lẽ là tốt nhất chỉ cần bỏ qua cảnh báo như phần còn lại của chúng tôi.

+1

Ah, bổ sung đẹp về STDERR chứ không phải STDOUT. Tôi đã luôn tự hỏi tại sao chuyển hướng bình thường không hoạt động. Các tác dụng phụ của nó bằng văn bản cho STDERR là nó sẽ gửi một email cho người quản trị (là tôi trên hệ thống địa phương của tôi) đó là, như bạn nói, không phải là một hiệu ứng có hại nhưng có nó là gây phiền nhiễu ;-) – Michel

3

Nó nhắc bạn rằng các lệnh sẽ được chạy bởi Bourne Shell chuẩn, có nghĩa là cú pháp lệnh của bạn phải tương thích với trình bao đó. ("Fun" thực tế: Tôi chỉ nhận thấy rằng nó cảnh báo bạn mặc dù vỏ hiện tại của bạn /bin/sh Phải là một lỗi..)

Một 'Hack dễ dàng' để loại bỏ các thông điệp là chỉ đơn giản là loại bỏ đầu tiên dòng đầu ra. Điều này có thể được thực hiện trong một cách thuận tiện bằng cách xác định lại lệnh at:

at() { /usr/bin/at [email protected] 2>&1 | tail -n +2; } 

Bạn có thể thêm nó vào tập tin trong đó có bí danh vỏ khác của bạn (~/.bashrc, ~/.zshrc hoặc tương đương cho vỏ của bạn).

LƯU Ý: lệnh tail trong 'hack' ở trên cũng sẽ loại bỏ at> -prefix khi viết lệnh nội dòng. Có lẽ không phải là một kẻ phá vỡ thỏa thuận, nhưng một cái gì đó để nhận thức được.

Các vấn đề liên quan