Trước đây tôi đã sử dụng source
lệ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.
Trước đây tôi đã sử dụng source
lệ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:
Vì source
(hoặc .
) lấy một tệp làm đối số, bạn có thể thử:
source <(echo something)
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)
... echo
bit ở đó 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/62
hoặ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/stdin
Hoặ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.