1

У меня был .bashrc который я переместил на сервер, чтобы я мог скачать и выполнить его через wget:

wget -O - http://xxx.github.io/dotfiles/bashrc | bash

Он выполняется, но все функции и псевдонимы, определенные в этом скрипте, не работают.

Есть ли способ определить мои функции такими, какими они были бы, если бы скрипт запускался локально?

2 ответа2

1

Как Гариджон описал в своем комментарии, проблема с

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).

Конечно, применяется стандартное предупреждение: будьте осторожны при выполнении команд, загружаемых из Интернета.  Если вы используете защищенный сервер в локальной сети, вышеописанное может быть несколько безопасным.  В противном случае, если кто-то взломает веб-сервер, вы откроете ему дверь для выполнения произвольных команд на вашем компьютере.  Было бы безопаснее (хотя и явно более утомительно) загрузить команды в файл и затем проверить его.  Затем, если контрольная сумма верна, вы можете получить файл.

-1

Попробуй это:

wget -qO - https://raw.github.com/cescoferraro/dotfiles/master/src/os/setup.sh | xargs bash -c

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .