Как Гариджон описал в своем комментарии, проблема с
wget (options and args) | bash
является то, что, по крайней мере, некоторые оболочки (очевидно, bash является одним из них), конвейер (
cmd 1 | cmd 2
) объединяет все команды компонентов в отдельные процессы.
Когда вы запускаете
something | bash
, новый процесс оболочки bash - это отдельный процесс от основной, родительской, интерактивной оболочки.
Любые функции, псевдонимы и т.д., Определенные в выходных данных команды слева, будут определены в новой оболочке bash, которая затем завершится без чтения каких-либо команд с вашего терминала / клавиатуры, тем самым вернув вас обратно в исходный код. оболочка, без функций и пр.
Как предположил Гэриджон, один из способов решить эту проблему и получить функции, псевдонимы и т.д., Определенные в вашей основной оболочке, - это загрузить команды в файл, а затем получить его; например,
wget -O - http://xxx.github.io/dotfiles/bashrc > bashrc && . bashrc && rm bashrc
Но это не единственный способ.
Хитрость заключается в создании трубы без создания конвейера.
Хитрость для этого заключается в использовании подстановки процессов (расширение bash для подстановки команд).
. <(wget -O - http://xxx.github.io/dotfiles/bashrc)
определит функции, псевдонимы и т. д., не создавая временный файл.
Другой подход
wget -O - http://xxx.github.io/dotfiles/bashrc | . /dev/stdin
Это не будет работать для bash (потому что он выполняет команду
.
В подоболочке), но может работать для некоторых других оболочек (например, ksh).
Конечно, применяется стандартное предупреждение: будьте осторожны при выполнении команд, загружаемых из Интернета.
Если вы используете защищенный сервер в локальной сети, вышеописанное может быть несколько безопасным.
В противном случае, если кто-то взломает веб-сервер, вы откроете ему дверь для выполнения произвольных команд на вашем компьютере.
Было бы безопаснее (хотя и явно более утомительно) загрузить команды в файл и затем проверить его.
Затем, если контрольная сумма верна, вы можете получить файл.