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 -lnhư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 lsobí danh như bạn sẽ đến các lslệnh , bởi vì họ đang thực hiện như là đối số bổ sung để awkthay thế. Do đó, bạn không thể chạy lsotrê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 aliasdò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 lsohà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 lsokhi được định nghĩa theo cách này là một hàm, bạn có thể muốn xóa -avà -Gcá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 -ltù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 lsonhư 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 . lstạ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 lsvì 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, shoặc Strong 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.