Isso é tão eficiente quanto parece.
Você pode ver qual sistema chama o shell fazendo com strace
(ou o equivalente em variantes unix diferentes do Linux).
strace bash -c '[[ -d $directory_path && -r $directory_path && -x $directory_path ]]'
…
stat64("foo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
faccessat(AT_FDCWD, "foo", R_OK) = 0
faccessat(AT_FDCWD, "foo", X_OK) = 0
…
Isso é quase tão bom quanto parece. Uma chamada de sistema para verificar o tipo de arquivo ( -d
) e uma chamada de sistema para verificar cada permissão. Embora o bash pudesse tentar deduzir os direitos de acesso do modo de arquivo, isso só funcionaria em sistemas sem listas de controle de acesso.
As duas chamadas para faccessat
podem ser combinadas; nem bash nem ksh nem dash são espertos o suficiente para fazer isso. Mas o ganho seria mínimo. O inode estará no cache, portanto, o custo das chamadas repetidas do sistema será extremamente pequeno. Se você realmente precisasse desse tipo de microeficiência, você não estaria escrevendo um shell script em primeiro lugar.