Aqui está o que estou tentando fazer (em um script):
#!/usr/bin/env bash
if [[ ! $("/usr/bin/scp [email protected]:/Users/seamus/Downloads/imgutils/image-utils* /home/pi/testscp") ]]; then
printf "\nERROR & EXIT: 'scp' failed \n"
exit 1
fi
printf "success!\n"
Eu tentei fazer isso de algumas maneiras, mas nada parece funcionar. Aqui está o que eu obtenho do acima:
./testscp.sh: line 3: /usr/bin/scp [email protected]:/Users/seamus/Downloads/imgutils/image-utils* /home/pi/testscp: No such file or directory
ERROR & EXIT: 'scp' failed
O scp
comando roda OK quando está em uma linha por si só. Se eu fizer isso, posso testar $0
- o que funciona OK... mas eu preferiria fazer tudo em uma única linha. O que estou perdendo?
Use
if
sozinho e cite o argumento que contém o glob pretendido parascp
:No bash, aspas são usadas para delimitar um ÚNICO rótulo que, de outra forma, seria interpretado como vários rótulos (devido a caracteres de espaço em branco). Então, quando o bash lê:
Ele interpreta isso como:
Suas citações estão no lugar errado.
Para decompor isso em um executável, há várias maneiras de escrever isso, mas simplesmente:
seria suficiente.
Mas como @StephenKitt diz, a combinação de test(
[[...]]
) e expansion($(...)
) é redundante. De fato (como ikkachu aponta abaixo) isso é testar uma resposta não nula em stdout, NÃO o código de saída de scp.Isso é mais uma questão de estilo do que de funcionalidade, mas sugiro que não é um bom estilo escrever roteiros com linhas muito longas.