Ранее я использовал source
команду, как это:
source file_name
Но то, что я пытаюсь сделать, это:
echo something | source
Который не работает.
Ранее я использовал source
команду, как это:
source file_name
Но то, что я пытаюсь сделать, это:
echo something | source
Который не работает.
Ответы:
Поскольку source
(или .
) принимает файл в качестве аргумента, вы можете попробовать:
source <(echo something)
Ваша исходная команда требует аргумент файла. Вы можете получить это в некоторых оболочках с подстановкой процесса, и это происходит потому, что оболочка аналогичным образом заменяет ...
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.