Katakanlah saya punya file di URL "http://mywebsite.com/myscript.txt" yang berisi skrip:
#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"
Dan saya ingin menjalankan skrip ini tanpa terlebih dahulu menyimpannya ke file. Bagaimana saya melakukan ini?
Sekarang, saya telah melihat sintaksnya:
bash < <(curl -s http://mywebsite.com/myscript.txt)
Tapi ini sepertinya tidak berfungsi seperti jika saya menyimpan ke file dan kemudian dieksekusi. Misalnya readline tidak berfungsi, dan outputnya hanya:
$ bash < <(curl -s http://mywebsite.com/myscript.txt)
Hello, world!
Demikian pula, saya sudah mencoba:
curl -s http://mywebsite.com/myscript.txt | bash -s --
Dengan hasil yang sama.
Awalnya saya punya solusi seperti:
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
Tapi ini sepertinya ceroboh, dan saya ingin solusi yang lebih elegan.
Saya mengetahui masalah keamanan terkait menjalankan skrip shell dari URL, tetapi mari kita abaikan semua itu untuk saat ini.
mktemp
alih-alih menggulirkan solusi Anda sendiricmd <<foo
adalah sintaks heredoc di sebagian besar shell dan mungkin bukan yang Anda inginkan.Jawaban:
seharusnya melakukannya. Bergantian, tinggalkan pengalihan awal pada Anda, yang mengarahkan input standar;
bash
mengambil nama file untuk mengeksekusi dengan baik tanpa pengalihan, dan<(command)
sintaks menyediakan path.Mungkin lebih jelas jika Anda melihat output dari
echo <(cat /dev/null)
sumber
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
Mengapa tidak hanya:bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
wget -q http://mywebsite.com/myscript.txt -O -
untukcurl -s http://mywebsite.com/myscript.txt
).bash will_not_work foobar <(curl -s http://example.com/myscript.sh)
Jika Anda memiliki skrip, Anda dapat menggunakan variabel lingkungan sebagai gantinya:MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)
dan itu juga berfungsi dengan pipa seperti:curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bash
Ini tentu saja mengharuskan Anda menggunakan MYFLAG1 dan MYFLAG2 alih-alih $ 1 dan $ 2Ini adalah cara untuk mengeksekusi skrip jarak jauh dengan memberikan beberapa argumen (arg1 arg2):
sumber
bash <(curl ... )
jika Anda menggunakan stdinUntuk bash, kulit Bourne dan ikan:
Bendera "-s" membuat shell dibaca dari stdin.
sumber
Menggunakan
wget
, yang biasanya merupakan bagian dari instalasi sistem default:sumber
Menggunakan:
Sebagai contoh:
sumber
Coba saja:
sumber
Anda juga dapat melakukan ini:
sumber
Cara terbaik untuk melakukannya adalah
yang merupakan sedikit perubahan jawaban oleh @ user77115
sumber
Saya sering menggunakan yang berikut ini sudah cukup
Tetapi dalam sistem lama (kernel2.4), ia menemui masalah, dan melakukan hal berikut dapat menyelesaikannya, saya mencoba banyak yang lain, hanya karya-karya berikut
Contohnya
Masalahnya mungkin disebabkan oleh lambatnya jaringan, atau versi bash terlalu lama yang tidak bisa menangani lambatnya jaringan dengan anggun
Namun, berikut ini menyelesaikan masalah
sumber
Juga:
sumber
Hanya menggabungkan jawaban amra dan user77115:
Ini mengeksekusi skrip jauh bbstart.sh meneruskannya opsi -v -v.
sumber
Apakah beberapa skrip yang tidak dijaga saya menggunakan perintah berikut:
sh -c "$(curl -fsSL <URL>)"
Saya merekomendasikan untuk menghindari mengeksekusi skrip langsung dari URL. Anda harus yakin URL itu aman dan memeriksa konten skrip sebelum mengeksekusi, Anda dapat menggunakan SHA256 checksum untuk memvalidasi file sebelum mengeksekusi.
sumber
Cara ini baik dan konvensional:
sumber
contoh aktual:
sumber