Para adicionar seus próprios predicados test
, você teria que modificar as fontes bash
para o comando [
interno. Isso provavelmente não é o que você deseja fazer, pois resultaria em scripts irremediavelmente não portáveis. Você pode usar uma função shell:
isemptydir () (
shopt -s nullglob
shopt -s dotglob
if [ -z "$1" ]; then
echo 'isemptydir: Empty or missing argument' >&2
return 1
# could instead do: set .
# this would use the current directory as the "default" one
fi
if [ -d "$1" ]; then
# note: above test fails on inaccessible dirs --> "not empty"
set -- "${1%/}"/*
[ "$#" -eq 0 ]
# note: above test succeeds on unlistable dirs --> "empty"
fi
)
if isemptydir "$mydir"; then
printf 'Directory "%s" is empty\n' "$mydir"
else
printf '"%s" is not a directory, or is not empty\n' "$mydir"
fi
A função testa se o argumento fornecido é o nome de um diretório. Se estiver, ele conta o número de nomes (não apenas arquivos) disponíveis no diretório, incluindo nomes ocultos, e compara isso a zero. O status de retorno do teste que é executado por último é o status de retorno da função.
Você poderia sobrecarregar os comandos [
ou test
com suas próprias funções, mas isso também seria potencialmente problemático.