外部コマンドを使用せずにファイルの権限を一覧表示するオプションは何ですか?
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 シェルを起動します。
/path/where/you/want/it/installed/bin/bash
- シェル変数を設定します:
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