Команда источника подачи с каналом


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.