Um pipe (representado pelo símbolo | ) envia a saída padrão de um processo para a entrada padrão de outro. No seu caso, parece que você deseja usar um arquivo nomeado para que um canal não seja apropriado - especificamente, não há nada no pipe (daí o erro gunzip ) porque o conteúdo remoto está indo para um arquivo local. Em vez disso, você precisaria extrair o nome do arquivo - por exemplo, de sua URL - algo como (usando os recursos internos de manipulação de strings do bash)
curl -O "$URL" && gunzip -f "${URL##*/}"
Se você quiser usar um pipe, a maneira de fazer isso seria algo como
curl "$URL" | gunzip -c
(sem a opção -O ), de modo que curl transmita o conteúdo remoto para stdout de onde ele pode ser canalizado para gunzip , mas você precisará redirecionar a saída gunzip para sobrescrever o%code% direcionar arquivo descompactado conforme apropriado.