Bash: Dấu cách trong tên bí danh


117

Tôi đang cố gắng tạo ra một bí danh trong bash. Những gì tôi muốn làm là ánh xạ ls -latớils -la | more

Trong tệp .bashrc của tôi, đây là những gì tôi đã cố gắng:

alias 'ls -la'='ls -la | more'

Tuy nhiên nó không hoạt động vì (tôi giả sử) nó có khoảng trắng trong tên bí danh. Có một cách giải quyết cho điều này?


8
Tại sao không làmalias lsm='ls -la | more'
Nifle

Câu trả lời:


126

Các tài liệu Bash bang "Đối với hầu hết các mục đích, chức năng vỏ được ưa thích hơn bí danh." Đây là một hàm shell thay thế lsvà làm cho đầu ra được dẫn đến morenếu đối số chỉ bao gồm (chỉ) -la.

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

Như một lớp lót:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Tự động đầu ra đường ống:

ls -la

1
Tại sao bạn cần sử dụng dấu ngoặc kép bên trong câu lệnh if?
Sixty feetersdude

1
@sixtyfootersdude: Hình thức khung đôi mạnh mẽ hơn và tôi sử dụng nó theo thói quen. Xem mywiki.wooledge.org/BashFAQ/031
Dennis Williamson

Vậy lệnh cuối cùng là gì? bí danh ls = 'ls ()' ??
Jeef

1
@Jeef: Không, câu trả lời của tôi sử dụng hàm thay vì bí danh. Tôi đã chỉnh sửa nó để cố gắng làm cho nó rõ ràng hơn.
Dennis Williamson

6
@merlinpatt: commandngăn chức năng được gọi đệ quy.
Dennis Williamson

53

Từ trang bí danh :

Từ đầu tiên của mỗi lệnh đơn giản, nếu không được trích dẫn, được kiểm tra xem nó có bí danh không. Nếu vậy, từ đó được thay thế bằng văn bản của bí danh. Tên bí danh và văn bản thay thế có thể chứa bất kỳ đầu vào shell hợp lệ nào, bao gồm cả siêu ký tự shell, ngoại trừ tên bí danh có thể không chứa `= '.

Vì vậy, chỉ có từ đầu tiên được kiểm tra đối sánh các bí danh khiến cho các bí danh nhiều từ không thể thực hiện được. Bạn có thể viết một tập lệnh shell để kiểm tra các đối số và gọi lệnh của bạn nếu chúng khớp và nếu không thì chỉ gọi bình thường ls(Xem câu trả lời của @Dennis Williamson )


8
+1 Để giải thích lý do tại sao tôi không được phép sử dụng ls -la làm bí danh.
Sixty feetersdude

7
Điều này rất hữu ích vì thay vì cố gắng giải quyết nó đã trả lời câu hỏi. Tôi đến đây vì tôi muốn tạo ra một bí danh với một khoảng trống trong đó và điều đó sẽ không xảy ra.
tức giận

Điều này không chỉ trả lời câu hỏi của tôi, mà còn cho tôi cái nhìn sâu sắc có giá trị về cách cơ chế răng cưa thực sự hoạt động. Trích dẫn của bạn từ trang người đàn ông là khá hữu ích.
Lily Finley

14

Một cách tiếp cận được cải thiện đôi chút được lấy từ câu trả lời của Dennis:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

Hoặc một lớp lót:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

Điều này cho phép các tùy chọn / đối số tiếp theo được thêm vào sau lệnh nếu cần, chẳng hạn ls -la -h


2
Làm thế nào điều này xử lý nếu tôi muốn ls -latđược loại trừ khỏi điều trị này? Tôi sẽ cần phải đặt một trường hợp để xử lý nó trên -la*mục, vâng?
Steven Lu

-1

Bạn vẫn có thể gọi bí danh này, nhưng bạn cần trích dẫn để khoảng trắng là một phần của từ lệnh. Vì vậy, "ls -la" -p patternsẽ vượt qua các -p patterntùy chọn để more, không ls.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.