Quais são as opções, sem usar comandos externos, para listar as permissões de um arquivo?
test
é um builtin, mas só funcionaria para o dono do arquivo AFAIK, estou atrás de tudo. Pensei que estava no caminho certo com inodes
, mas também não consigo encontrar uma maneira de lê-los (com recursos integrados!).
bash
só, por favor. Qualquer versão e/ou formato é aceitável.
editar:
Estou ciente de que existem inúmeras maneiras de fazer isso usando comandos externos ( stat
, ls
, etc.), este é apenas um exercício de reflexão - nada do que estou fazendo "requer" uma builtin
única solução
editar2:
A resposta dos comandos carregáveis de Glenn Jackman é tecnicamente correta, pois ESTÁ usando um arquivo embutido. No entanto, acho que isso apenas mostra que minha pergunta foi mal definida.
Usando comandos puros bash
(qualquer versão) builtin
, conforme listadoaquino manual e outras funcionalidades integradas bash
(redirecionamento, substituição, palavras-chave, outras coisas que nem conheço...), em um linux
sistema, como posso listar todas as permissões que um arquivo possui? A saída seria semelhante a qualquer uma das abaixo, embora um valor umask também funcionasse.
user@hostname$ stat test -c %A
-rw-rw-r--
user@hostname$ stat test -c %a
664
Responder1
Com o bash simples, acho que o melhor que você pode conseguir é algo assim: você consegueseupermissões, não de grupo ou outro.
myperms() {
local file=$1
local perms=""
if [[ -d $file ]]; then
perms+='d'
elif [[ -L $file ]]; then
perms+='l'
else
perms+='-'
fi
[[ -r $file ]] && perms+='r' || perms+='-'
[[ -w $file ]] && perms+='w' || perms+='-'
[[ -x $file ]] && perms+='x' || perms+='-'
echo "$perms $file"
}
Então:
$ myperms /bin/bash
-r-x /bin/bash
$ touch afile
$ myperms afile
-rw- afile
$ chmod u+x afile
$ myperms afile
-rwx afile
$ ln -s afile alink
$ myperms alink
lrwx alink
$ chmod u-wx afile
$ myperms alink
lr-- alink
$ ls -l afile alink
-r--r--r-- 1 glennjackman staff 0 Dec 16 14:28 afile
lrwxr-xr-x 1 glennjackman staff 5 Dec 16 14:29 alink -> afile
Responder2
Com o bash versão 5, existem "comandos carregáveis" - comandos que não são comandos bash integrados, mas podem ser habilitados de forma que se tornem integrados:
- clone o repositório bash git:https://savannah.gnu.org/git/?group=bash
./configure --prefix=/path/where/you/want/it/installed
- fazer && fazer instalar
stat
não é um carregável "suportado", embora exista aqui, entãocd ./examples/loadables
make others
cp stat /path/where/you/want/it/installed/lib/bash
Então
- Inicie um shell bash:
/path/where/you/want/it/installed/bin/bash
- defina uma variável de shell:
BASH_LOADABLES=/path/where/you/want/it/installed/lib/bash
- ative o comando stat:
enable -f stat stat
- e use-o:
stat -A statarray /some/file
stat
preenche uma matriz associativa. Uma demonstração (usando a matriz padrão chamada "STAT")
$ ~/bash/5.0/bin/bash
$ echo $BASH_LOADABLES_PATH
/Users/glennjackman/bash/5.0/lib/bash
$ enable -f stat stat
$ stat ~/.bashrc
$ declare -p STAT
declare -A STAT=([nlink]="1" [link]="/Users/glennjackman/.bashrc" [perms]="0644" [inode]="14482796" [blksize]="4096" [device]="16777220" [atime]="1574454147" [type]="-" [blocks]="8" [uid]="502" [size]="2767" [rdev]="0" [name]="/Users/glennjackman/.bashrc" [mtime]="1574454147" [ctime]="1574454147" [gid]="20" )
$ for key in "${!STAT[@]}"; do printf "%s\t%s\n" "$key" "${STAT[$key]}"; done
nlink 1
link /Users/glennjackman/.bashrc
perms 0644
inode 14482796
blksize 4096
device 16777220
atime 1574454147
type -
blocks 8
uid 502
size 2767
rdev 0
name /Users/glennjackman/.bashrc
mtime 1574454147
ctime 1574454147
gid 20
Para definir automaticamente a variável BASH_LOADABLE_PATH, coloquei meu ~/.bashrc:
# for loadable builtins
bash_root=${BASH%/bin/bash}
[[ -d "$bash_root/lib/bash" ]] && BASH_LOADABLES_PATH="$bash_root/lib/bash"
unset bash_root