É aparente que o diretório / root em seu sistema não tem (pelo menos) 'execute' permisões para o usuário 'yu', seja através da associação ao grupo ou dos 'outros' bits. Assim, 'yu' não pode listar o conteúdo do diretório / root para determinar se o /root/1.txt existe ou não.
Para uma descrição mais detalhada das permissões de arquivos e diretórios (no Linux, como você mencionou o Ubuntu), veja: Executar vs Ler bit. Como funcionam as permissões de diretório no Linux?
Se você não estiver disposto a alterar as permissões em / root, precisará escalonar seus próprios privilégios (bem, test
) para ler o diretório. Como [
é um programa real ( /usr/bin/[
), assim como um shell integrado, você pode usar sudo: sudo [ -e /root/1.txt ] && echo yes || echo no
. (Contraste com [[
, que é apenas incorporado, não um programa externo).
Se você estiver disposto a alterar as permissões em / root, uma mudança mínima seria abrir as permissões 'other' para adicionar o bit 'execute' ( sudo chmod o+x /root
, por exemplo). Isso impede a listagem geral do diretório, mas permite que você verifique arquivos específicos:
user@host:~$ ls -ld /root
drwx-----x 2 root root 4096 Apr 3 04:55 /root
user@host:~$ [ -e /root/1.txt ] && echo yes
yes
user@host:~$ ls /root
ls: cannot open directory /root: Permission denied
Uma variação em 'other + execute' seria 'group + execute' onde você adiciona permissões de execução ao grupo e muda o grupo de / root para um que 'yu' é membro de.
Longa história curta, esta afirmação:
When I use the code if [ -e /root/1.txt ] , it returns false. I know I can use su - root to change user and get the right result.
tem um uso enganoso da palavra "direita". As permissões do sistema de arquivos determinam como o test
se comporta. Não importa se você sabe que o arquivo existe; importa se o programa tem permissões para ver o arquivo.