Điều gì có thể làm cho `>` âm thầm thất bại trong Linux?


20

Tôi đã chạy lệnh này:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json

Để đổ dữ liệu vào partyapp_dump.jsontập tin. Nhưng tất cả dữ liệu chỉ được in trên màn hình và một partyapp_dump.jsontệp trống được tạo.

Tại sao điều này có thể xảy ra? Tôi đã thử nghiệm ls > partyapp_dump.jsonvà điều đó đã làm việc hoàn hảo.

Câu trả lời:


40

Với > bạn chỉ chuyển hướng đầu ra tiêu chuẩn. Thay vào đó hãy thử 2> để chuyển hướng đầu ra lỗi. Sử dụng &> để chuyển hướng cả hai.


1
FYI, &>sẽ chỉ hoạt động trong Bash 4.0 và iirc các phiên bản gần đây của zsh. Đối với một giải pháp di động hơn , foo > bar 2&>1. Tham khảo: mywiki.wooledge.org/BashFAQ/014
Rein Henrichs

6
@Rein Henrichs: Đó là 2> & 1, không phải 2 &> 1
camh

Tôi nhớ nó với một pneumonic (?) Từ lập trình: '2', đến ('>') Vị trí ('&') của '1'
hometoast

1
@hometoast: Ý bạn là ghi nhớ? :) Pneumonic có nghĩa là phổi ...
carlpett

22

Ứng dụng python của bạn phải ghi đầu ra của nó vào kênh đầu ra STDERR thay vì STDOUT thông thường. Sử dụng cấu trúc shell >chỉ bắt và chuyển hướng dữ liệu được ghi vào kênh đầu ra, nhưng thực tế có một số kênh khác có thể được in, phổ biến nhất là kênh thứ hai, thường được sử dụng cho các lỗi.

Bạn có thể thử bẫy STDERR (kênh thứ 2) cũng như thế này:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2>&1

Cấu 2>&1trúc kết nối luồng đầu ra cho các lỗi với kênh đầu ra bình thường. Thật bất thường khi một chương trình tạo đầu ra mà bạn muốn chụp trên kênh lỗi; thông thường sẽ được dành riêng cho thông tin gỡ lỗi không phải dữ liệu ứng dụng. Vui lòng sử dụng tập lệnh này một cách thận trọng vì nó hoạt động theo cách không chuẩn.

Bạn cũng có thể kết xuất các kênh đầu ra và lỗi vào các tệp khác nhau như sau:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2> error_output.txt

5

Ngoài giải thích đầu ra stderr và stdout đã đề xuất, ứng dụng của bạn có thể chỉ cần bỏ qua cả hai luồng này và mở "/ dev / tty" rõ ràng cho đầu ra của nó.


1

Nếu noclobbertùy chọn bash được đặt, thì> chuyển hướng sẽ thất bại (mặc dù không âm thầm) nếu tệp đích đã tồn tại.

Để có tính di động tốt hơn, hãy sử dụng cmd >| fileđể ghi đè bất kỳ tệp hiện có.


0

Nếu bạn bị mất, bạn luôn có thể thử chạy nó với bước tiến để xem các quy trình đang làm gì:

strace -f command

1
Câu trả lời đúng, nhưng không đặc biệt có liên quan. Nếu bây giờ anh chàng không quản lý luồng lỗi thì tôi không nghĩ anh ta sẽ biết phải làm gì với đầu ra của một strace.
Caleb
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.