Một vấn đề với lệnh đầu tiên của bạn là bạn chuyển hướng thiết bị xuất chuẩn đến vị trí xuất chuẩn (nếu bạn thay đổi $ thành a & như được đề xuất trong nhận xét) và sau đó, bạn đã chuyển hướng thiết bị xuất chuẩn sang một số tệp nhật ký, nhưng điều đó không kéo theo thiết bị lỗi được chuyển hướng . Bạn phải thực hiện theo thứ tự khác, trước tiên hãy gửi thiết bị xuất chuẩn đến nơi bạn muốn đến và sau đó gửi thiết bị xuất chuẩn đến địa chỉ thiết bị xuất chuẩn
some_cmd > some_file 2>&1 &
và sau đó bạn có thể ném & vào để gửi nó vào nền. Công việc có thể được truy cập bằng jobs
lệnh. jobs
sẽ cho bạn thấy các công việc đang chạy, và đánh số chúng. Sau đó, bạn có thể nói về các công việc bằng cách sử dụng% theo sau là số tương tự kill %1
.
Ngoài ra, không có & ở cuối, bạn có thể tạm dừng lệnh với Ctrlz, sử dụng bg
lệnh để đặt nó ở chế độ nền và fg
đưa nó trở lại nền trước. Kết hợp với jobs
lệnh, điều này là mạnh mẽ.
để làm rõ phần trên về thứ tự bạn viết các lệnh. Giả sử stderr là địa chỉ 1002, stdout là địa chỉ 1001 và tệp là 1008. Lệnh đọc từ trái sang phải, do đó, điều đầu tiên nó nhìn thấy trong 2>&1
đó là di chuyển stderr đến địa chỉ 1001, sau đó nó sẽ > file
di chuyển stdout sang 1008, nhưng giữ mức tiêu chuẩn ở mức 1001. Nó không kéo mọi thứ chỉ vào 1001 và chuyển nó sang 1008, mà chỉ tham chiếu thiết bị xuất chuẩn và di chuyển nó vào tệp.
Theo cách khác, nó di chuyển stdout đến 1008, và sau đó di chuyển stderr đến điểm mà stdout đang trỏ tới, 1008. Bằng cách này cả hai có thể trỏ đến tập tin duy nhất.
2>$1
có lẽ là nghĩa vụ phải được2>&1
.