2010-04-15 33 views
8

Tôi muốn biết nếu có lệnh BASH được tích hợp có in một số văn bản trên stderr, giống như lệnh echo in văn bản trên thiết bị xuất chuẩn hay không. Tôi không muốn sử dụng chuyển hướng io tạm thời. Tôi sử dụng lệnh tích hợp để tạo ra lỗi trên stderr chẳng hạn như ls --asdf (ls: tùy chọn không được công nhận '--asdf') nhưng tôi muốn một cái gì đó neater.Lệnh Bash in một thông báo trên stderr

Sửa ----

Thật sự tôi đang cố gắng để chứng minh chuyển hướng stderr/stdout, và ví dụ của tôi trông giống như:

sh test.sh >test-out.txt 2>test-err.txt 

Để rõ ràng, tôi muốn giữ file test.sh như đơn giản và sạch sẽ nhất có thể, điều này có nghĩa là tránh toán tử > bên trong tệp.

Trả lời

11

echo something >&2 là cách chính xác để thực hiện những gì bạn muốn.

Tuy nhiên ...

này sẽ tạo ra một chương trình nhỏ mà sẽ echo đối số của nó để stderr:

gcc -o echoerr -x c - <<'EOF' 
#include <stdio.h> 
#include <stdlib.h> 
void main(int argc, char **argv) { 
    int i; 
    for (i = 1; i < argc; i++) { 
     fprintf(stderr, "%s ", argv[i]); 
    } 
    fprintf(stderr, "\n"); 
    exit(0); 
} 
EOF 

Bạn có thể sử dụng nó như thế này:

$ ./echoerr this is an error message 
this is an error message 
$ ./echoerr this is an error message 2>error.out 
$ cat error.out 
this is an error message 
+0

Bạn có thể muốn thêm: 'if (argc> 1) fprintf (stderr," \ n ");' để ngăn chặn một dòng mới đi tới 'stderr' khi không có đầu vào nào được đưa ra. –

+0

@DavidC.Rankin: Tôi nghĩ đó là một ý kiến ​​hay. Tuy nhiên, khi nó đứng, nó xuất ra một dòng mới khi không có đối số nào có cùng cách với 'echo'. –

+0

Vâng, tôi cũng thấy điều đó, nhưng tôi nghĩ nếu chúng tôi đang làm một cái gì đó tùy chỉnh, chúng tôi có thể làm cho nó hoạt động tốt hơn :) Tôi đã thử nghiệm cả hai cách, và tôi thích chặn dòng mới trong trường hợp không có đầu vào. Những người khác có thể thích dòng trống. –

2

Không dựng sẵn, bạn có thể sử dụng:

function echo-err { echo "[email protected]" >&2; } 
0

Nói chung, tôi nghĩ rằng không có thực sự là một sự khác biệt giữa 'tạm io-chuyển hướng và điều bạn muốn. stderr là một bộ mô tả tập tin giống như bất kỳ phần mềm nào khác, và bất kỳ nội trang nào làm những gì bạn muốn chỉ làm cùng nội dung mà bạn làm bằng cách chuyển hướng echo như Jurgen đã đề xuất ở trên, cụ thể là, gọi write() trên đó.

1

Bạn cũng có thể tạo bí danh.

alias echoerr='echo >&2' 
+0

Điều này sẽ không hoạt động đối với 'echoerr foo 2> test-err.txt' vì bí danh được mở rộng sau đó cả hai chuyển hướng được thiết lập cùng một lúc và lần thứ hai không biết cài đặt đầu tiên đã được thiết lập chưa. Cần tránh các bí danh trong tập lệnh - thay vào đó hãy sử dụng các hàm thay thế. –

1

Chỉ cần một sidenote : Nếu bạn muốn chứng minh bash, bạn nên sử dụng bash, không phải sh:

sh test.sh >test-out.txt 2>test-err.txt 
bash test.sh >test-out.txt 2>test-err.txt 

Thậm chí nếu sh là một liên kết để bash trên hệ thống của bạn, nó sẽ kiểm tra nó như thế nào được gọi là (arg0) và đối xử với sh-cuộc gọi như một lời gọi

bash --posix 

dẫn đến đôi khi Subtile hành vi khác nhau. Một lỗi phổ biến, như shebangs #/bin/sh 'nhưng nó đã làm việc trong trình bao' (đó là/bin/bash).

1

Không ai có đề cập điều này, nhưng bạn cũng có thể làm điều này:

echo An error message > /dev/stderr

Đó có thể dễ đọc hơn so >&2 nhưng tôi đoán điều đó phụ thuộc bạn là ai.

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