Uma forma hacky, mas sem PID:
is_empty() {
test -e "$1/"* 2>/dev/null
case $? in
1) return 0 ;;
*) return 1 ;;
esac
}
Isto tira partido do facto de test
construir saídas com 2 se for dado mais do que um argumento depois de -e
: Primeiro, "$1"/*
glob é expandido por bash. Isto resulta em um argumento por ficheiro. Assim
- Se não houver ficheiros, o asterisco em
test -e "$1"*
não se expande, por isso a Shell volta a tentar o ficheiro *
, que retorna 1.
& - …excepto se houver realmente um ficheiro com o nome exacto *
, então o asterisco expande-se bem, asterisco, que acaba por ser a mesma chamada que acima, ou seja, test -e "dir/*"
, só que desta vez retorna 0. (Obrigado @TrueY por apontar isto. )
& - Se houver um ficheiro, test -e "dir/file"
é executado, que retorna 0.
- Mas se houver mais ficheiros do que 1,
test -e "dir/file1" "dir/file2"
é executado, o que o bash reporta como erro de utilização, ou seja, 2.
case
envolve toda a lógica de modo a que apenas o primeiro caso, com 1 estado de saída, seja reportado como sucesso.
Possíveis problemas que ainda não verifiquei:
Há mais ficheiros do que o número de argumentos permitidos - acho que isto poderia comportar-se de forma semelhante ao caso com 2+ ficheiros.
Ou há de facto um ficheiro com um nome vazio - Não tenho a certeza se é possível em qualquer OS/FS sãos.