คำสั่ง unix คืออะไรเพื่อค้นหาไฟล์ที่สามารถเรียกทำงานได้ที่สอดคล้องกับคำสั่งที่กำหนด?


22

ตัวอย่างเช่นถ้าผ่านlsเป็นอินพุตก็ควรบอกฉันว่า/bin/lsจะทำงานถ้ารันlsบนบรรทัดคำสั่ง

คำตอบ:


25

คำสั่งที่ใช้แตกต่างกันไปจากเปลือกหอย

เฉพาะเชลล์ในตัวเท่านั้นที่จะบอกได้อย่างถูกต้องว่าเชลล์จะทำอะไรกับชื่อคำสั่งที่กำหนดเนื่องจากมีเพียงบิวด์อินเท่านั้นที่สามารถรู้เกี่ยวกับนามแฝงฟังก์ชันเชลล์บิวด์อินอื่น ๆ และอื่น ๆ ได้อย่างสมบูรณ์ เตือนความจำ: คำสั่งบางคำอาจไม่ตรงกับไฟล์เรียกทำงานในตอนแรก

  • สำหรับบอร์นอีกครั้งเปลือกbash, built-in เป็นtypeคำสั่ง:

    $ type '['
    [ is a shell builtin
    
  • สำหรับเปลือกปลาfishที่typebuiltin ทำงานคล้ายกับทุบตี ในการรับพา ธ ไปยังไฟล์สั่งการให้ใช้command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • สำหรับ Korn Shell, ksh, built-in เป็นwhenceคำสั่ง - มีการtypeเริ่มตั้งขึ้นเป็นนามแฝงสามัญwhence -vและcommandในตัวด้วย-vเทียบเท่าตัวเลือกในการwhence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • สำหรับ Z เชลล์zsh, built-in เป็นwhenceคำสั่งที่มีcommandในตัวด้วย-vเทียบเท่าตัวเลือกwhenceและสร้างอินtype, whichและwhereเทียบเท่าwhenceกับตัวเลือก-v, -cและ-caตามลำดับ

    $ whence ls
    /bin/ls
    
  • สำหรับ TC เชลล์tcsh, built-in เป็นwhichคำสั่ง - ไม่ต้องสับสนกับคำสั่งภายนอกใด ๆ โดยใช้ชื่อว่า:

    > which ls
    ls: aliased to ls-F
    > which \ls
    /bin/ls
    

อ่านเพิ่มเติม


โปรดทราบว่าภายใต้ ksh "type" เป็นนามแฝงเริ่มต้นสำหรับ "whence -v" ดังนั้นจึงสามารถใช้งานได้เหมือนกับเชลล์ bourne แบบดั้งเดิมและ bash
jlliagre

typeนอกจากนี้ยังมี builtin เพื่อ zsh?
Hongxu Chen

RHEL6 ซึ่ง RPM (เช่นwhich-2.19-6.el6.x86_64) /etc/profile.d/which2.shทำให้แฟ้มเริ่มต้นใน สิ่งนี้ถูกอ่านโดยเชลล์ที่ไม่ใช่ csh รวมถึง zsh มันเป็นนามแฝงของwhichตัวเอง ดังนั้นสำหรับผู้ใช้ zsh โดยเฉพาะจะมีการแทนที่ตัวบิวด์whichอิน
Dan Pritts

14

คุณสามารถใช้whichสิ่งนี้:

aix@aix:~$ which ls
/bin/ls

มันทำงานได้โดยการค้นหาPATHไฟล์เรียกทำงานที่ตรงกับชื่อของอาร์กิวเมนต์ โปรดทราบว่าจะไม่ทำงานกับนามแฝงเปลือก:

aix@aix:~$ alias listdir=/bin/ls
aix@aix:~$ listdir /
bin    dev   initrd.img      lib32   media  proc  selinux  tmp  vmlinuz
...
aix@aix:~$ which listdir
aix@aix:~$

typeอย่างไรก็ตามทำงานได้:

aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'

3
ระวัง: ถ้า ls เป็นฟังก์ชันหรือเป็น aliased คุณต้องการ 'type ls' แทน 'ซึ่ง ls'
William Pursell

1
whichไม่จำเป็นต้องมีเพียงพอในตัวเอง มันจะส่งคืนชื่อที่พบครั้งแรกใน $ PATH ... ชื่อนั้นอาจเป็นลิงก์สัญลักษณ์และไม่ใช่การปฏิบัติการแบบ end-of-chain ที่แท้จริง
Peter.O

8

whichไม่ได้ (จำเป็น) คืนไฟล์ที่ปฏิบัติการได้ มันคืนชื่อไฟล์แรกที่พบใน $ PATH (หรือหลาย ๆ ไฟล์เหมือนชื่อเมื่อใช้which -a) ... ปฏิบัติการจริงอาจจะมีลิงค์หลายลิงค์

  • which locate
    /usr/bin/locate
    `
  • file $(which locate)
    /usr/bin/locate: symbolic link to /etc/alternatives/locate'

คำสั่งซึ่งพบว่าที่จริงปฏิบัติการreadlink -e,
(ร่วมกับwhich)

  • readlink -e $(which locate)
    /usr/bin/mlocate

หากต้องการดูลิงก์กลางทั้งหมด:

f="$(which locate)"             # find name in $PATH
printf "# %s\n" "$f"
while f="$(readlink "$f")" ;do  # follow links to executable
    printf "# %s\n" "$f"
done

# /usr/bin/locate
# /etc/alternatives/locate
# /usr/bin/mlocate

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