chuyển hướng stderr không hoạt động trong csh


11

Tôi chạy lệnh sau:

pkg_add emacs-23.4,2.tbz 2> output.log

Đầu ra vẫn hiển thị trong thiết bị đầu cuối. Khi tôi nhấn , tôi nhận được

pkg_add emacs-23.4,2.tbz 2 > output.log

với một không gian trước2 .

Ban đầu tôi không đặt cái này. tôi thử

pkg_add emacs-23.4,2.tbz > output.log 2>&1

Một lần nữa, khi tôi nhấn , khoảng trắng đã được thêm vào .

Tại sao điều này xảy ra với tôi?

Tôi đang chạy csh trên FreeBSD.

Câu trả lời:


11

Chuyển hướng 2> không hoạt động với csh hoặc tcsh.

Sử dụng chshlệnh để thay đổi shell của bạn thành / bin / sh hoặc / usr / local / bin / bash để sử dụng 2>chuyển hướng kiểu. Lưu ý: Không thay đổi shell của root thành / usr / local / bin / bash

csh và tcsh không thể chuyển hướng tiêu chuẩn ra và lỗi riêng biệt, nhưng >&sẽ chuyển hướng đầu ra kết hợp thành một tệp.


+1 và ✔. Tôi đã thay đổi vỏ bằng cách sử dụng sh.
gadmo

1
@Craig Anh ấy đang chạy pkg_addtrên FreeBSD, vì vậy tôi cho rằng đây là dành cho người dùng root (/ bin / csh là mặc định cho root trên FreeBSD). Trong trường hợp này, bạn không nên thay đổi shell thành / usr / local / bin / bash. / bin / sh là chấp nhận được. Bạn cũng có thể chuyển sang shell khác sau khi đăng nhập bằng root.
James O'Gorman

@ JamesO'Gorman Bắt tốt tôi đã cập nhật câu trả lời của tôi.
Craig

20

Tôi không chắc chắn nếu bạn đang cố gắng ẩn STDERR hoặc chuyển hướng nó sang STDOUT.

Để chuyển hướng STDOUT đến một tệp:

pkg_add emacs-23.4,2.tbz > stdout.log

Để chuyển hướng STDOUT và STDERR sang một tệp:

pkg_add emacs-23.4,2.tbz > & stdxxx.log

Để chuyển hướng STDOUT đến một tệp và ẩn STDERR:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

Để chuyển hướng STDOUT sang bàn điều khiển và ẩn STDERR:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

Để chuyển hướng STDOUT sang bàn điều khiển và STDERR vào một tệp:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

Để chuyển hướng STDOUT sang tệp và STDERR sang tệp:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

EDIT: Lý do tại sao điều này hoạt động là vì hành động trong () xảy ra đầu tiên; Ergo, nếu chúng tôi đã chuyển hướng STDOUT, thì nó sẽ không còn khả dụng bên ngoài (). Điều này để lại cho chúng tôi chỉ với STDERR, và sau đó chúng tôi có thể chuyển hướng đó theo ý muốn.


Xin chào @nikc, chào mừng bạn đến với unix.SE. Nhận xét của bạn là hữu ích và nhiều thông tin. Tôi sẽ đề nghị chỉnh sửa câu trả lời của bạn và bao gồm nó ngay trong đó để nó không dễ bị bỏ qua.
DRS

1

Tôi biết cách thực hiện trong Csh, nhưng sử dụng 2 shell:

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

Cách như vậy cho phép chuyển hướng chỉ stderr sang file.txt, mà không có thiết bị xuất chuẩn - cụ thể là những gì bạn muốn.

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.