Như được nêu chi tiết trong các quyền của kiểu 755 với các 'ls' của Adam Courtemanche trên AgileAdam.com , bạn có thể tạo một bí danh lso
hoạt động giống như ls -l
nhưng xử lý nhẹ đầu ra 1 để hiển thị các quyền cũng theo bát phân. Điều này thêm một cột hàng đầu hiển thị quyền hai chữ số 3 chữ số . Như đã viết, điều này hoạt động cho hầu hết các tệp và thư mục, nhưng nó không hoạt động đúng nếu các bit dính hoặc setuid / setgid được đặt. 3
alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"
Điều này có một thiếu sót nghiêm trọng, mặc dù, như techtonik chỉ ra . Bạn không thể vượt qua đối số này lso
bí danh như bạn sẽ đến các ls
lệnh , bởi vì họ đang thực hiện như là đối số bổ sung để awk
thay thế. Do đó, bạn không thể chạy lso
trên một tệp hoặc thư mục cụ thể, cũng như không thể chuyển bất kỳ tùy chọn nào (như -F
, hoặc --color
) cho lso
.
Cách khắc phục là xác định lso
là hàm chứ không phải bí danh.
lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
Nếu bạn đang thử tương tác trong vỏ của mình, hãy chạy unalias lso
để xóa bí danh - bạn có thể làm điều đó trước hoặc sau khi bạn xác định hàm. Nếu bạn đang đặt nó vào một tệp có nguồn gốc, chẳng hạn như ~/.bashrc
, chỉ cần lấy ra alias
dòng và thêm định nghĩa hàm.
Tại sao điều này làm việc? Không giống như bí danh, các hàm bash shell có thể nhận các tham số vị trí , tức là các đối số dòng lệnh . "$@"
mở rộng đến danh sách đối số đầy đủ , làm cho các đối số của lso
hàm được truyền tới ls
. (Không giống như một định nghĩa bí danh, một thân hàm không được trích dẫn; do đó cần phải loại bỏ các \
ký tự trước $
và "
.)
Vì bạn có thể chuyển các tùy chọn lso
khi được định nghĩa theo cách này là một hàm, bạn có thể muốn xóa -a
và -G
các tùy chọn khỏi định nghĩa - bạn có thể chuyển chúng theo cách thủ công trong trường hợp bạn muốn chúng. ( Các -l
tùy chọn là cần thiết cho các chi tiết như cho phép file được hiển thị ở tất cả , vì vậy không có lợi cho việc loại bỏ nó.)
lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
Nhờ techtonik cho chỉ ra những hạn chế trong việc xác định lso
như một bí danh, do đó thúc đẩy tôi để mở rộng bài đăng này với tài liệu về làm cho nó một chức năng để thay thế.
1 Người ta có thể lưu ý điều này dường như bỏ qua quy tắc chung về việc không phân tích cú pháp đầu rals
. ls
tạo ra đầu ra rất dễ đọc của con người; điều này giới thiệu các đặc điểm riêng và giới hạn làm cho nó thường không phù hợp làm đầu vào cho các lệnh khác. Trong trường hợp này, chúng tôi phân tích cú pháp ls
vì chúng tôi muốn duy trì hành vi chính xácls
ngoại trừ một thay đổi được thêm vào của chúng tôi .
2 Một hạn chế của bí danh này, cũng áp dụng cho phiên bản hàm hiển thị bên dưới và có thể được coi là một lỗi, là nó chỉ hiển thị ba chữ số bát phân ngay cả khi chữ số bát phân thứ tư bằng không. Như jfmercer đã chỉ ra một cách đúng đắn , các chữ số bát phân hiển thị ở đây không phản ánh bit dính nếu có, cũng không phải bit setuid hoặc setgid.
3 cách nghiêm túc hơn chỉ đơn thuần là không hiển thị các chữ số bát phân thứ tư là phương pháp này giả định họ không được thiết lập, và nếu họ là - nếu bạn nhìn thấy t
, s
hoặc S
trong chuỗi sự cho phép - thì bạn nên bỏ qua các chữ số bát phân . Điều này là do các bit được suy ra từ chuỗi quyền theo cách không tính đến các bit setuid / setgid dính.