Команда джерела подачі з трубою


25

Раніше я використовував sourceтаку команду:

source file_name

Але я намагаюся зробити це:

echo something | source

Що не працює.

Відповіді:


38

Оскільки source(або .) приймає файл як аргумент, ви можете спробувати:

source <(echo something)

1
Це спрацювало, дякую. І з Новим роком!
Десмонд Юм

@muru Це чудово працює. Зауважте, що "| source / dev / stdin" має вигляд працюючого, але він фактично відкидає всі змінні призначення. Не знаю чому. Теоретично здається твердим. Це божевілля.
Дастін Опреа

2
@DustinOprea труби створюють нижню оболонку, тому всі ці змінні призначення ніколи не впливають на батьківську оболонку.
муру

8

Для вихідної команди потрібен аргумент файлу. Це можна отримати в деяких оболонках із заміною процесу, і це тому, що так само оболонка замінює ...

arg=$(echo hi)

... echoбіт, що знаходиться в командному рядку з виходом субшалі, у разі заміни процесу він замінює підпрограшку на іменований файл - зазвичай /dev/fd/62або щось таке - деяким посиланням на файл-дескриптор. Дескриптор файлу з трубкою 0, так що ...

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

... /dev/stdinабо в будь-якому іншому випадку має працювати чудово в будь-якій системі Linux - і багатьох інших. Ви також можете використовувати тут-документи аналогічно:

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

Ви можете перевірити, як ваша оболонка обробляє процес заміни, до речі:

(set -x; readlink <(:))

... які друкує bash) :

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

... і тому ми можемо побачити, що оболонка робить заміну і readlinkчитає з анонімної труби, яку вона відкриває на файловому дескрипторі 63.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.