มี Unix เทียบเท่ากับตัวแปรสภาพแวดล้อม Windows PATHEXT


11

ฉันสงสัยว่ามี Unix เทียบเท่ากับตัวแปรสภาพแวดล้อมของ Windows PATHEXTหรือไม่

สำหรับผู้ที่ไม่มีพื้นหลัง Windows: การเพิ่มคำต่อท้ายไฟล์เพื่อPATHEXTให้ฉันสามารถเรียกใช้สคริปต์โดยไม่ต้องพิมพ์คำต่อท้ายใน cmd.exe ตัวอย่างเช่นบนคอมพิวเตอร์ Windows ของฉัน PATHEXT มีคำต่อท้าย.plและเมื่อฉันต้องการรันสคริปต์ Perl ใน cmd.exe ฉันสามารถพิมพ์my-scriptและเรียกใช้งานได้ แต่ในการที่จะรันสคริปต์เดียวกันด้วยการทุบตีฉันต้องเขียนชื่อเต็ม: my-script.pl.

ตั้งแต่ฉันทำงานทั้ง Windows และ Unix ในปัจจุบันฉันเกือบจะตกหลุมพรางของการลืมพิมพ์คำต่อท้ายเมื่อไปที่กล่อง Unix อีกครั้ง


มันน่าสนใจที่จะรู้ว่า Windows ทำอะไรถ้า PATHEXT มีอยู่เช่น. sh และ. pl และคุณพยายามเรียกใช้ 'foo' ในไดเรกทอรีที่มี foo.sh และ foo.pl อยู่
Jeff Schaller

หาก.shpreceedes .pl, foo.shจะถูกเรียกใช้ stackoverflow.com/a/7839178/180275
René Nyffenegger

คำตอบ:


7

สั้น: ไม่

อีกต่อไป: เชลล์สคริปต์ต้องการชื่อไฟล์แบบเต็ม แต่คุณสามารถกำหนดชื่อแทนสำหรับคำสั่งของคุณเพื่ออ้างถึงพวกเขาด้วยชื่อต่าง ๆ ตัวอย่างเช่น

alias my-script=my-script.pl

12

ทางออกที่ง่ายที่สุดคือการไม่ใช้ส่วนขยายสำหรับสคริปต์ของคุณ พวกเขาไม่จำเป็นและทำหน้าที่เพียงเพื่อระบุประเภทของสคริปต์ให้คุณ แต่ไม่ใช่กับคอมพิวเตอร์ ในขณะที่ Windows ใช้ส่วนขยายเพื่อระบุประเภทของไฟล์ระบบ * nix (ยกเว้นเพียงเล็กน้อยเท่านั้นเช่นgzip) จะไม่ทำเช่นนั้น

โปรดทราบว่าไบนารีไม่มี.exeส่วนขยายในระวัง * พวกเขากำลังเรียกว่าเพียงแค่ไม่foo foo.exeดังนั้นหากคุณต้องการfoo.plที่จะปฏิบัติการเป็นfooเพียงบันทึกไฟล์fooในสถานที่แรก

หรือหากคุณต้องการมีส่วนขยายด้วยเหตุผลบางประการให้เข้าไปในไดเรกทอรีใดก็ตามที่คุณบันทึกสคริปต์ของคุณและเรียกใช้สิ่งนี้:

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

ที่จะย้ำกว่าไฟล์ทั้งหมดที่มีนามสกุลและสำหรับแต่ละไฟล์foo.extของพวกเขาจะสร้างการเชื่อมโยงที่เรียกว่าซึ่งจุดที่จะต้องfoo foo.extโปรดทราบว่าสิ่งนี้จะล้มเหลวหากคุณมีหลายสคริปต์ที่มีชื่อเหมือนกัน แต่มีนามสกุลต่างกัน


7

หากคุณต้องการทำจริงๆมีวิธี เพิ่มต่อไปนี้ในตอนท้ายของ.bashrcในไดเรกทอรีบ้านของคุณและตั้งชื่อนามสกุลที่มีจุดคั่นด้วยPATHEXT :(เปลี่ยนเพื่อรวมจุดเพื่อให้ตรงกับลักษณะการทำงานของ Windows) ใช้ความเสี่ยงของคุณเอง

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
}

my-scriptยังจำได้ว่าคุณสามารถใช้แท็บให้เสร็จสมบูรณ์ชื่อคำสั่งถ้าไม่มีคำสั่งอื่นยังเริ่มต้นด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.