Borulu besleme kaynağı komutu


25

Daha önce sourceböyle bir komut kullandım :

source file_name

Ama yapmaya çalıştığım şey şudur:

echo something | source

Bu işe yaramıyor.

Yanıtlar:


38

Yana source(veya .) argüman olarak bir dosya alır, sen deneyebilirsiniz:

source <(echo something)

1
İşe yaradı, teşekkür ederim. Ve mutlu yıllar!
Desmond Hume

@muru Bu harika çalışıyor. "| Source / dev / stdin" öğesinin çalışma görünümüne sahip olduğunu unutmayın, ancak gerçekte tüm değişken atamalarını bırakacaktır. Emin değilim neden. Teoride sağlam görünüyor. Bu delilik.
Dustin Oprea

2
@DustinOprea boruları bir alt kabuk yaratır, bu yüzden bu değişken atamalarının tümü ana kabuğu etkilemez.
muru

8

Kaynak komutunuz bir dosya argümanı gerektirir. Bunu, işlem kabiliyetine sahip bazı mermilerde alabilirsiniz, çünkü bunun nedeni kabuğun yerini almasıdır.

arg=$(echo hi)

... echoalt kabuk çıktısının bulunduğu komut satırındaki bit, işlem değişikliği durumunda, alt kabuğu adlandırılmış bir dosyayla değiştirir - genellikle /dev/fd/62ya da bir şey - bir dosya tanıtıcısına bağlanır. Bir boru ile dosya tanımlayıcısı 0'dır ...

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

... /dev/stdinya da durum ne olursa olsun, herhangi bir linux sisteminde - ve bunun dışında birçoğunda iyi çalışmalıdır. Burada da belgeleri benzer şekilde kullanabilirsiniz:

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

Bu arada, kabuğunuzun işlem değişimini işleme biçimini doğrulayabilirsiniz:

(set -x; readlink <(:))

... hangi baskılar (in bash) :

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

... ve böylece kabuğun değişimini yaptığını ve readlinkdosya-tanımlayıcı 63'te açtığı muazzam bir borudan okuduğunu görebiliyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.