Скажем, у меня есть файл по адресу «http://mywebsite.com/myscript.txt», который содержит скрипт:
#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"
И я хотел бы запустить этот скрипт без предварительного сохранения его в файл. Как мне это сделать?
Теперь я видел синтаксис:
bash < <(curl -s http://mywebsite.com/myscript.txt)
Но это, похоже, не работает, как если бы я сохранил в файл, а затем выполнить. Например, readline не работает, а вывод просто:
$ bash < <(curl -s http://mywebsite.com/myscript.txt)
Hello, world!
Точно так же я пробовал:
curl -s http://mywebsite.com/myscript.txt | bash -s --
С такими же результатами.
Первоначально у меня было решение как:
timestamp=`date +%Y%m%d%H%M%S`
curl -s http://mywebsite.com/myscript.txt -o /tmp/.myscript.${timestamp}.tmp
bash /tmp/.myscript.${timestamp}.tmp
rm -f /tmp/.myscript.${timestamp}.tmp
Но это кажется небрежным, и я хотел бы более элегантное решение.
Я знаю о проблемах безопасности, связанных с запуском сценария оболочки из URL-адреса, но давайте сейчас проигнорируем все это.
cmd <<foo
это синтаксис heredoc в большинстве оболочек и, вероятно, не то, что вы хотите.
mktemp
вместо того, чтобы использовать собственное решение