Danh sách công việc grep không thể khi công việc được gọi trong hàm


7

Tôi có thể grepđầu ra của jobs, và tôi có thể grepđầu ra của a function. Nhưng tại sao tôi không thể grep đầu ra jobskhi nó hoạt động?

$ # yes, i can grep jobs
$ jobs
[1]+  Running          vim
[2]+  Stopped          matlab

$ jobs | grep vim
[1]+  Running          vim

$ # yes, of course i can grep a function
$ type mockjobs
mockjobs is a function
mockjobs ()
{
    echo '[1]+ Running         vim banjo'
}
$ mockjobs | grep vim
[1]+ Running         vim banjo

$ # now put those two together and surely I can grep???
$ type realjobs
realjobs is a function
realjobs ()
{
    jobs
}
$ realjobs | grep vim
$ # Nope, WTF?

$ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

$ # funny though, redirection works just fine:
$ tmpfile=$(mktemp); realjobs > $tmpfile; grep vim $tmpfile; rm $tmpfile
[1]+  Running          vim

Tôi không thấy một lỗi trong danh sách bash, nhưng có lẽ tôi đã bỏ lỡ nó? Có tham chiếu đến một vấn đề trong Bash 2.02 khi jobslà một phần của đường ống, nhưng không có gì gần đây và trong một chức năng mà tôi có thể tìm thấy.

Tôi đang thiếu gì ở đây?


1
+1; các nguồn dường như chỉ ra rằng công việc sẽ in ra thiết bị xuất chuẩn
Jeff Schaller

Uh ... Tôi sẽ mở một lỗi chống lại bash, vì điều này thật kỳ quặc.
thrig

1
echo "$(realjobs)" | grep vilàm việc quá
cas

Nó không hoạt động functionquá. function testjobs(){jobs | grep vi}function testrealjobsgrep(){realjobs | grep vi}. Các testjobs có thể hoạt động, nhưng testrealjobsgrep không thể hoạt động.
dùng164825

Câu trả lời:


8

Eric Blake đã trả lời trong danh sách gửi thư bash-bug:

jobslà một nội dung thú vị - tập hợp các công việc trong trình bao cha mẹ KHÁC BIỆT hơn tập hợp các công việc trong một lớp con. Bash thường tạo ra một subshell để thực hiện một đường ống dẫn và vì không có công việc nào trong subshell đó, nên việc thực thi các công việc ẩn không có gì để báo cáo.

Bash có mã cho trường hợp đặc biệt jobs |khi rõ ràng có thể nói rằng bạn đang chạy các công việc được xây dựng như là lệnh duy nhất của bên trái của đường ống, để thay vào đó báo cáo về các công việc của shell cha, nhưng mã trường hợp đặc biệt đó không thể đá trong nếu bạn ẩn việc thực thi công việc, cho dù bằng cách ẩn nó bên trong một chức năng như bạn đã làm hoặc bằng các phương tiện khác như: eval jobs | grep vim

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.