O uso de “&&” não é efetivo para o formulário de envio cURL (não execute a segunda linha se a primeira linha falhar)

2

Estou enviando para o meu site usando o cURL. Eu faço cURL postá-lo em tempo hábil.

No código abaixo; primeira linha é enviar onda segunda linha é para enfileirar:

curl -b cookies.txt \
    -d title="$(sed '1,/sblmtitle/d;/slpstitle/,$d' sedut.html)" \
    -d taxonomy%5Btags%5D%5B1%5D="$(
        sed '1,/sblmkategori/d;/slpskategori/,$d' sedut.html
    )" \
    -d teaser_include=1 \
    -d body="$(sed '1,/sblmkonten/d;/slpskonten/,$d' sedut.html)" \
    -d field_source%5B0%5D%5Burl%5D="$(
        sed '1,/sblmurl/d;/slpsurl/,$d' sedut.html
    )" \
    -d changed= \
    -d form_build_id=form-424f851ad50bd4781c8c25ab7efd5c4c \
    -d form_token=0e7cc7437faf816f1ecd96087286bda9 \
    -d form_id=post_node_form \
    -d op=Save http://www.web.org/submit/post &&
for file in $(ls *.html | sort -r | tail -1); do
    mv $file sedut.html
done

Se o cURL não conseguir enviar, ele imprimirá sedut.html do conteúdo. Se o sucesso do cURL for enviado, ele não imprimirá nada. No meu caso, em algum momento cURL não consegue enviar.

O que eu quero é não executar a segunda linha se a primeira linha falhar. Mas usar && como códigos acima simplesmente não funciona. Eu testei, o envio de cURL falha e imprimo sedut.html do conteúdo, mas a segunda linha ainda é executada.

    
por Kamdar Nais 05.10.2011 / 05:49

2 respostas

3

curl não tem idéia de que ele falhou - ele tinha uma entrada bem definida, se comunicava com o servidor e recebia uma resposta 200 OK . Por causa disso, você não pode confiar no código de saída de curl (que é o que o && faz).

Em vez disso, precisamos usar outra coisa para determinar o sucesso ou o fracasso, como a saída gerada por curl .

Como observação, geralmente não é uma boa ideia usar ls em um script. Aqui, ele falhará se um arquivo tiver uma nova linha ou um caractere de espaço. Pode ser improvável, mas é possível. Consulte o link para obter mais detalhes. Como regra geral, só uso ls em scripts ao exibir os resultados para olhos humanos. Se eu estou processando os resultados de alguma forma, eu uso find . -0 ...

    
por 05.10.2011 / 13:08
1

&& e || (como testes de sucesso / reprovação) devem estar na mesma linha lógica que o (s) comando (s) que você deseja executar. Use uma linha de continuação && \ e / ou chaves { }

Observação: Como apontado por amphetamachine , a questão de continuação de linha não se aplica em shells compatíveis com sh modernas

true && echo "true"

true && \
   echo "true"

true && \
{  echo "true"; echo "===="; }

(( 123 == 123 )) && {
   echo "true"
   echo "====" 
}
    
por 05.10.2011 / 07:02