Раніше я використовував 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.