Cách chuyển hướng thiết bị xuất chuẩn từ phải sang trái


8

Điều này hoạt động hoàn hảo:

./foo | ./bar

Nhưng tôi muốn một cái gì đó như thế:

./bar <| ./foo

Vì vậy, tôi có thể dẫn đường khác và thay đổi các đối số của foo nhanh hơn trong dòng lệnh.

Các đường ống cần phải là thời gian thực - foochương trình của tôi không bao giờ trở lại.

Điều này có thể không?


Không thực sự là một đường ống nhưng bạn có thể sử dụng./bar <(./foo)
Lambert

2
hoặc ./bar < <(./foo)nếu barlà một kịch bản.
Lambert

5
Làm thế nào mà sẽ nhanh hơn? Bạn chỉ đang tìm kiếm các phím tắt shell như Ctrl + A để bắt đầu và Alt + F để di chuyển về phía trước một từ?
terdon

Tuy nhiên, các phím tắt shell có thể hữu ích, tôi vẫn phải nhấn các phím đó nhiều lần để đưa con trỏ vào đối số mong muốn, trong khi đó, con trỏ trực tiếp ở cuối khiến tôi giành chiến thắng vài giây
Bilow

Bạn mất vài giây để gõ Ctrl + A?
chepner

Câu trả lời:


2
./bar < <( ./foo )

Ví dụ: cat < <(echo "hello there!")

Để hiểu cách thức hoạt động của nó, hãy xem xét các phần của tập lệnh một cách riêng biệt.

Cú pháp này: cat < /path/to/filesẽ đọc tệp /path/to/filevà chuyển nó thành stdin tới cat.

Cú pháp này: <(echo "hello there!")có nghĩa là thực thi lệnh và đính kèm thiết bị xuất chuẩn vào một mô tả tệp như thế nào /dev/fd/65. Kết quả của toàn bộ biểu thức là một văn bản như thế /dev/fd/65, và một lệnh chạy song song và cung cấp cho bộ mô tả tệp đó.

Bây giờ, kết hợp lại, tập lệnh sẽ chạy lệnh bên phải, chuyển nó thành một bộ mô tả tệp, chuyển đổi bộ mô tả tệp đó thành stdin cho lệnh bên trái và thực hiện lệnh bên trái.

Không có chi phí mà tôi biết, nó hoàn toàn giống như a | b, chỉ là đường cú pháp.


9

Một cách đơn giản và phù hợp có thể là xác định hàm foobar,

foobar () { ./foo "$@" | ./bar ; }

(trong dòng lệnh, nếu cần hoặc trong một số tập lệnh khởi động, chẳng hạn như ".bashrc" chẳng hạn). Sau đó, bất cứ khi nào bạn làm:

foobar "this"  that   "and this also"

nó sẽ làm

./foo  this   that   "and this also" | ./bar

1
Phải, tôi làm điều này mọi lúc để dễ dàng mũi tên lên và chỉnh sửa phần lệnh tôi muốn thay đổi, mà không cần phải ctrl-trái-mũi tên theo cách đó. Bạn thậm chí có thể để lại định nghĩa hàm như một phần của lệnh : foobar() { printf '%s\n' -x "$1" -y "$2" blah blah "${@:3}" | grep -v 123; }; foobar a b abc 'cd ef'. Vì vậy, bạn có thể dễ dàng điều chỉnh định nghĩa hàm nếu bạn nghĩ về điều gì khác. ( "${@:3}"mở rộng đến các tham số vị trí bắt đầu bằng 3, bỏ qua hai tham số chúng tôi đã sử dụng.)
Peter Cordes

Bạn có thể thực hiện các công cụ hữu ích như local IFS=bên trong một hàm và tính toán một số biến dựa trên hàm args.
Peter Cordes

4

Tôi nghĩ rằng bạn có thể làm một cái gì đó như thế với một ống có tên:

mypipe=$(mktemp -d /tmp/XXXXXX)/pipe
mkfifo $mypipe
grep something < $mypipe & tail > $mypipe -f  some_input_file 
rm $mypipe

hoặc đặt phần không thay đổi của lệnh trong tập lệnh shell:

./foo "$@" | ./bar

và đưa ra các đối số footrên dòng lệnh script:

./myscript <args to foo>
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.