Linux 中列出檔案權限的內建方法?

Linux 中列出檔案權限的內建方法?

在不使用外部命令的情況下,有哪些選項可以列出檔案的權限?

test是一個內建的,但只適用於文件的所有者,據我所知,我正在尋找整個事情。我以為我正在做一些事情inodes,但我也找不到閱讀這些內容的方法(使用內建函數!)。

bash只是,拜託。任何版本和/或格式都是可接受的。

編輯:

我知道有很多方法可以使用外部命令(statls等)來做到這一點,這只是一個思想練習——我所做的一切都「不需要」builtin唯一的解決方案

編輯2:

格倫傑克曼的可載入指令答案在技術上是正確的,因為它使用內建指令。然而,我認為這只是顯示我的問題定義不明確。

使用純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 命令的命令,但可以啟用以使其成為內建命令:

  1. 克隆 bash git 儲存庫:https://savannah.gnu.org/git/?group=bash
  2. ./configure --prefix=/path/where/you/want/it/installed
  3. 製作 && 製作安裝
  4. stat不是“受支援”的可加載文件,儘管它存在於此處,所以
    1. cd ./examples/loadables
    2. make others
    3. cp stat /path/where/you/want/it/installed/lib/bash

然後

  1. 啟動 bash shell:/path/where/you/want/it/installed/bin/bash
  2. 設定 shell 變數:BASH_LOADABLES=/path/where/you/want/it/installed/lib/bash
  3. 啟用 stat 指令:enable -f stat stat
  4. 並使用它: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

相關內容