Có tương đương Unix với biến môi trường Windows PATHEXT không


11

Tôi tự hỏi nếu có một tương đương Unix cho biến môi trường Windows PATHEXT.

Đối với những người không có nền Windows: Thêm hậu tố tệp để PATHEXTcho phép tôi thực thi tập lệnh mà không cần nhập hậu tố đó trong cmd.exe. Ví dụ, trên máy tính Windows của tôi, PATHEXT chứa hậu tố .plvà khi tôi muốn thực thi tập lệnh Perl trong cmd.exe, tôi chỉ cần gõ my-scriptvà nó sẽ được thực thi. Tuy nhiên, để thực thi cùng một tập lệnh trong bash, tôi cần phải viết tên đầy đủ : my-script.pl.

Vì hiện tại tôi làm việc trên cả Windows và Unix, nên tôi hầu như luôn rơi vào cái bẫy quên gõ hậu tố khi đi đến một hộp Unix một lần nữa.


Thật thú vị khi biết Windows đã làm gì nếu PATHEXT có chứa, ví dụ: .sh và .pl và bạn đã cố chạy 'foo' trong một thư mục có foo.sh và foo.pl trong đó.
Jeff Schaller

Nếu .shpreceedes .pl, foo.shsẽ được chạy. stackoverflow.com/a/7839178/180275
René Nyffalanger

Câu trả lời:


7

ngắn gọn: không

dài hơn: shell script yêu cầu tên tệp đầy đủ, nhưng bạn có thể xác định bí danh cho các lệnh của mình để gọi chúng bằng nhiều tên khác nhau. Ví dụ

alias my-script=my-script.pl

12

Giải pháp đơn giản nhất là không sử dụng tiện ích mở rộng cho tập lệnh của bạn. Chúng không cần thiết và chỉ phục vụ để xác định loại tập lệnh cho bạn, nhưng không phải cho máy tính. Mặc dù Windows sử dụng các tiện ích mở rộng để xác định loại tệp, nhưng các hệ thống * nix (với rất ít ngoại lệ như gzip) thì không.

Lưu ý rằng các tệp nhị phân không có .exephần mở rộng trong * nix, chúng chỉ được gọi foochứ không phải foo.exe. Vì vậy, nếu bạn muốn foo.plcó thể thực thi được foo, chỉ cần lưu tệp như fooở vị trí đầu tiên.

Ngoài ra, nếu bạn thực sự cần phải có các tiện ích mở rộng vì một số lý do, hãy truy cập vào bất kỳ thư mục nào bạn lưu tập lệnh của mình và chạy này:

for f in *.*; do ln -s "$f" "${f%%.*}"; done

Điều đó sẽ lặp lại trên tất cả các tệp có phần mở rộng và, đối với mỗi tệp foo.extcủa chúng, sẽ tạo ra một liên kết được gọi là footrỏ đến foo.ext. Lưu ý rằng điều này sẽ thất bại nếu bạn có nhiều tập lệnh có cùng tên nhưng các phần mở rộng khác nhau.


7

Nếu bạn thực sự muốn làm điều đó, có một cách. Thêm phần sau vào cuối thư mục chính của .bashrcbạn và đặt thành PATHEXTtên mở rộng có dấu chấm cách nhau :. (Thay đổi để bao gồm các dấu chấm để phù hợp với hành vi của Windows.) Sử dụng nó có nguy cơ của riêng bạn.

if declare -f command_not_found_handle >/dev/null; then 
    eval "original_command_not_found_handle() $(declare -f command_not_found_handle|tail -n +2)"
fi
command_not_found_handle(){
    local PATHEXT_EXPANDED i
    IFS=: read -a PATHEXT_EXPANDED<<<"$PATHEXT"
    for i in "${PATHEXT_EXPANDED[@]}"; do
        if type "$1$i" &>/dev/null; then
            "$1$i" "${@:2}"
            return $?
        fi
    done
    if declare -f original_command_not_found_handle >/dev/null; then
        original_command_not_found_handle "$@"
    else
        return 127
    fi
}

Cũng cần nhớ rằng bạn có thể sử dụng tab để hoàn thành tên lệnh nếu không có lệnh khác cũng bắt đầu my-script.

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.