回答:
あなたが説明することを行う単一のユーティリティを考えることはできませんが、それをシェルスニペットにするのは十分簡単です。
script=$(curl -s "$url")
printf "%s\nDo you want to run this script? [yN]" "$script"
read line
case $line in
[Yy]|[Yy][Ee][Ss]) sh -c "$script";;
esac
これは、スクリプトがテキストファイルであることを前提としています。ヌルバイトはサポートされていません。シェルによっては、削除される場合や、行またはファイル全体が切り捨てられる場合があります。また、ファイルの最後にあるすべての改行が削除されます(ヒアドキュメントコンストラクトが1つ追加されます)。これは通常、スクリプトの問題ではありませんが、たとえば、スクリプトがバイナリ形式のアーカイブで終了し、それが抽出する場合に発生する可能性があります。ある時点でそのようなバイナリスクリプトが誤ってエンコードされるという重大なリスクがあるため、これはファイルを配布する非常に信頼できる方法ではありません。それでも、スクリプトを一時ファイルに書き込むことで処理できます。
script_file=$(mktemp)
curl -s "$url" | tee "$script_file"
printf "Do you want to run this script? [yN]"
read line
case $line in
[Yy]|[Yy][Ee][Ss]) sh "$script_file";;
esac
rm "$script_file"
特別な目的のツールを必要とするほど頻繁にこのようにダウンロードして実行するスクリプトのソースを見つける場所は言うまでもなく、なぜこれを実行したいのか想像するのは困難です。
curl
(またはwget
、snarf
または何でも)を使用してスクリプトをダウンロードし、それを調べて編集し(特定のシステムをカスタマイズする必要のないまれなスクリプトです)、それを実行chmod
しsh scriptname
ます。
less
何かを表示してから、実行するかどうかを尋ねるのは難しくありません。それがスクリプトをダウンロードして表示し、それが問題ないように見える場合は実行することよりも優れているとは思えません。IMOそれはもっと悪いでしょう、それは何の利点も提供しませんが、シェルで作業するだけで得られる柔軟性を取り除きます。
次のコマンドラインを使用します。
curl URL | ( cat > /tmp/file; read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) | sh
あなたはそのために小さな関数を使うことができます:
curlsh()
{
curl "$1" \
| ( cat > /tmp/file;read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) \
| sh
}
そしてそれをこのように使うより:
curlsh http://site.in.net/path/to/script
$()
最初の行で引用する必要があります。また、これにより入力内のNUL文字が削除され、おそらく致命的となる可能性があります(たとえば、自己解凍スクリプトの場合)。