Załóżmy, że mam plik o adresie URL „http://mywebsite.com/myscript.txt”, który zawiera skrypt:
#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"
I chciałbym uruchomić ten skrypt bez uprzedniego zapisania go w pliku. Jak mam to zrobic?
Teraz widziałem składnię:
bash < <(curl -s http://mywebsite.com/myscript.txt)
Ale to nie wydaje się działać tak, jak gdybym zapisał do pliku, a następnie wykonał. Na przykład readline nie działa, a wynik jest po prostu:
$ bash < <(curl -s http://mywebsite.com/myscript.txt)
Hello, world!
Podobnie próbowałem:
curl -s http://mywebsite.com/myscript.txt | bash -s --
Z tymi samymi wynikami.
Początkowo miałem rozwiązanie takie jak:
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
Ale to wydaje się niechlujne i chciałbym bardziej eleganckiego rozwiązania.
Zdaję sobie sprawę z problemów bezpieczeństwa związanych z uruchamianiem skryptu powłoki z adresu URL, ale na razie zignorujmy to wszystko.
cmd <<foo
jest składnią heredoc w większości powłok i prawdopodobnie nie jest tym, czego chcesz.
mktemp
zamiast toczenia własne rozwiązanie