Como escrever este comando
Esta tarefa em particular não requer um pipe.
No zsh:
a=(/dir1/dir2/filename*.txt(Nom[1]))
if ((! #a)); then
echo >&2 "No file matches /dir1/dir2/filename*.txt"
exit 2
fi
variable=$a[1]
ou, para sair do script automaticamente se a glob não corresponder:
set -e
a=(/dir1/dir2/filename*.txt(om[1]))
variable=$a[1]
Outros shells não possuem um recurso interno para encontrar o arquivo mais recente. Chamar ls
é razoável desde que seus nomes de arquivo contenham apenas caracteres imprimíveis diferentes de novas linhas, mas não passe a opção -l
e depois analise todos, exceto o nome, que é gratuitamente complexo e frágil (quebra de espaços, em particular ). Além disso, obtenha a primeira correspondência da -t
sort, mais rápido do que a última correspondência da -tr
sort. A abordagem direta:
variable=$(ls -td /dir1/dir2/filename*.txt 2>/dev/null | head -n 1)
if [ -z "$variable" ]; then
echo >&2 "No file matches /dir1/dir2/filename*.txt"
exit 2
fi
Manuseio de tubos
Se você quiser abortar seu script quando o lado esquerdo de um pipeline falhar (ou seja, sair com um status diferente de zero ou devido a um sinal), em ksh93 e bash, você pode definir a opção pipefail
e sair se o status do pipeline é diferente de zero.
set -e -o pipefail
somecommand | filter
echo "somecommand succeeded"
ou
set -o pipefail
if ! somecommand | filter; then
echo >&2 "somecommand or filter failed"
exit 2
fi
O Zsh não possui a opção pipefail
, mas você pode recuperar o código de status de cada componente do pipeline na matriz pipestatus
.
somecommand | filter
if ((pipestatus[1])); then
echo >&2 "somecommand failed"
exit 2
fi
Em outros shells, o status do pipeline é o status do comando à direita. Não há nenhuma maneira direta de recuperar o status do comando da esquerda. Consulte Obter o status de saída do processo canalizado para outro para algumas soluções possíveis.
Tenha em atenção que filter
deve ler toda a saída de somecommand
, caso contrário, terá de lidar com o caso em que somecommand
morre de um SIGPIPE .
Se você quiser agir com base no fato de somecommand
produzir alguma saída, em vez de basear-se no status de saída, use ifne
de moreutils de Joey Hess . Observe que a maioria dos sistemas não possui esses utilitários instalados por padrão.