Lệnh nguồn cấp dữ liệu với một đường ống


25

Trước đây tôi đã sử dụng sourcelệnh như thế này:

source file_name

Nhưng những gì tôi đang cố gắng làm là:

echo something | source

Mà không làm việc.

Câu trả lời:


38

source(hoặc .) lấy một tệp làm đối số, bạn có thể thử:

source <(echo something)

1
Điều đó đã làm việc, cảm ơn bạn. Và chúc mừng năm mới!
Desmond Hume

@muru Điều này làm việc tuyệt vời. Lưu ý rằng "| source / dev / stdin" có vẻ như đang hoạt động, nhưng thực tế nó sẽ bỏ tất cả các bài tập biến. Không chắc chắn lý do tại sao. Có vẻ vững chắc trong lý thuyết. Đó là sự điên rồ.
Dustin Oprea

2
Các ống @DustinOprea tạo ra một lớp con, vì vậy tất cả các phép gán biến đó không bao giờ ảnh hưởng đến vỏ cha.
muru

8

Lệnh nguồn của bạn yêu cầu một đối số tệp. Bạn có thể có được điều đó trong một số shell với sự thay thế quá trình, và điều này là do cùng một cách mà shell thay thế ...

arg=$(echo hi)

... echobit ở đó trên dòng lệnh với đầu ra của subshell, trong trường hợp thay thế quy trình, nó thay thế subshell bằng một tệp có tên - thường /dev/fd/62hoặc một cái gì đó - một số liên kết đến một bộ mô tả tệp. Với một ống, bộ mô tả tập tin là 0 nên ...

echo 'echo hi' | . /dev/fd/0

... /dev/stdinHoặc bất cứ điều gì như trường hợp có thể sẽ hoạt động tốt trên bất kỳ hệ thống linux nào - và nhiều hệ thống khác bên cạnh đó. Bạn cũng có thể sử dụng tài liệu ở đây tương tự:

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

Bạn có thể xác minh cách shell của bạn xử lý thay thế quá trình, bằng cách này:

(set -x; readlink <(:))

... in (in bash) :

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

... và vì vậy chúng ta có thể thấy rằng trình bao đang thực hiện thay thế và readlinkđang đọc từ một đường ống anoymous mà nó mở trên mô tả tệp 63.

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.