不使用外部命令,列出文件权限的选项有哪些?
test
是内置函数,但据我所知,它只对文件所有者有效,我想要的是整个文件。我以为我发现了一些东西inodes
,但我找不到读取它们的方法(使用内置函数!)。
bash
仅此而已。任何版本和/或格式都是可以接受的。
编辑:
stat
我知道使用外部命令( ,,等等)有无数种方法可以做到这一点ls
,这只是一个思维练习——我所做的任何事情都不需要唯一builtin
的解决方案
编辑2:
Glenn Jackman 的可加载命令答案在技术上是正确的,因为它使用了内置命令。但是,我认为这只是表明我的问题定义不明确。
使用纯bash
(任何版本)builtin
命令,如下所列这里在手册中,以及系统上的其他内置功能bash
(重定向、替换、关键字、我甚至不知道的其他东西……),linux
我如何列出文件具有的完整权限?输出将类似于下面的任何一个,尽管 umask 值也可以工作。
user@hostname$ stat test -c %A
-rw-rw-r--
user@hostname$ stat test -c %a
664
答案1
使用普通的 bash,我认为你能得到的最好的结果是这样的:你的权限,而不是组或其他权限。
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"
}
然后:
$ 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
答案2
在 bash 版本 5 中,有“可加载命令” - 这些命令不是内置 bash 命令,但可以启用它们使其成为内置命令:
- 克隆 bash git 仓库:https://savannah.gnu.org/git/?group=bash
./configure --prefix=/path/where/you/want/it/installed
- 制作&&制作安装
stat
虽然它在这里存在,但并不是“受支持的”可加载项,因此cd ./examples/loadables
make others
cp stat /path/where/you/want/it/installed/lib/bash
然后
- 启动 bash shell:
/path/where/you/want/it/installed/bin/bash
- 设置 shell 变量:
BASH_LOADABLES=/path/where/you/want/it/installed/lib/bash
- 启用 stat 命令:
enable -f stat stat
- 并使用它:
stat -A statarray /some/file
stat
填充关联数组。演示(使用名为“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
为了自动设置 BASH_LOADABLE_PATH 变量,我在 ~/.bashrc 中输入:
# for loadable builtins
bash_root=${BASH%/bin/bash}
[[ -d "$bash_root/lib/bash" ]] && BASH_LOADABLES_PATH="$bash_root/lib/bash"
unset bash_root