นี่คือทั้งหมดที่คุณไม่เคยคิดว่าคุณจะไม่อยากรู้เกี่ยวกับมัน:
สรุป
ในการรับชื่อพา ธ ของไฟล์เรียกทำงานในสคริปต์เชลล์แบบบอร์น (มีคำเตือนอยู่บ้างเล็กน้อยดูด้านล่าง):
ls=$(command -v ls)
หากต้องการค้นหาว่ามีคำสั่งที่กำหนดอยู่หรือไม่:
if command -v given-command > /dev/null 2>&1; then
echo given-command is available
else
echo given-command is not available
fi
ที่พร้อมต์ของเชลล์แบบบอร์นเชิงโต้ตอบ:
type ls
which
คำสั่งเป็นมรดกทางวัฒนธรรมที่แตกสลายจาก C-เชลล์และจะดีกว่าปล่อยให้อยู่ตามลำพังในเปลือกหอยบอร์นเหมือน
ใช้เคส
มีความแตกต่างระหว่างการค้นหาข้อมูลที่เป็นส่วนหนึ่งของสคริปต์หรือโต้ตอบที่ shell prompt
ที่เชลล์พรอมต์กรณีการใช้งานทั่วไปคือ: คำสั่งนี้ทำงานผิดปกติฉันใช้อันที่ถูกต้องหรือไม่ ว่าสิ่งที่เกิดขึ้นเมื่อฉันพิมพ์mycmd
? ฉันสามารถดูเพิ่มเติมว่ามันคืออะไร?
ในกรณีดังกล่าวคุณต้องการทราบว่าเชลล์ของคุณทำอะไรเมื่อคุณเรียกใช้คำสั่งโดยไม่ต้องเรียกใช้คำสั่งจริง
ในเชลล์สคริปต์มันมีแนวโน้มที่จะแตกต่างกันมาก ในเชลล์สคริปไม่มีเหตุผลที่คุณต้องการรู้ว่าคำสั่งนั้นอยู่ที่ไหนหรืออะไรถ้าสิ่งที่คุณต้องการทำคือเรียกใช้ โดยทั่วไปสิ่งที่คุณต้องการรู้คือพา ธ ของไฟล์สั่งการดังนั้นคุณสามารถรับข้อมูลเพิ่มเติมได้ (เช่นพา ธ ไปยังไฟล์อื่นเทียบกับไฟล์นั้นหรืออ่านข้อมูลจากเนื้อหาของไฟล์เรียกทำงานที่พา ธ นั้น)
คุณอาจต้องการทราบเกี่ยวกับคำสั่งทั้งหมดที่my-cmd
มีอยู่ในระบบในสคริปต์แบบโต้ตอบ
เครื่องมือส่วนใหญ่ที่มีอยู่ (ตามปกติ) ได้รับการออกแบบให้ใช้งานแบบโต้ตอบ
ประวัติศาสตร์
ประวัตินิดหน่อยก่อน
กระสุน Unix ในช่วงต้นจนถึงปลายยุค 70 ไม่มีหน้าที่หรือนามแฝง เฉพาะแบบดั้งเดิมมองขึ้นไปของ executables $PATH
ใน csh
นามแฝงแนะนำรอบ 1978 (แม้ว่าจะcsh
เป็นครั้งแรกที่ปล่อยออกมาใน2BSD
เดือนพฤษภาคม 1979) และยังประมวลผลของการที่.cshrc
ให้ผู้ใช้สามารถปรับแต่งเปลือก (ทุกเปลือกเช่นcsh
อ่าน.cshrc
แม้ไม่ได้โต้ตอบเช่นในสคริปต์)
ในขณะที่เปลือกบอร์นได้รับการปล่อยตัวครั้งแรกใน Unix V7 ก่อนหน้านี้ในปี 1979 การสนับสนุนฟังก์ชั่นเป็นเพียงการเพิ่มมากภายหลัง (1984 ใน SVR2) และแล้วก็ไม่เคยมีบางrc
ไฟล์ (คน.profile
คือการกำหนดค่าสภาพแวดล้อมของคุณไม่ได้เป็นเปลือกต่อ se )
csh
ได้รับความนิยมมากกว่าบอร์นเชลล์มาก (แม้ว่ามันจะมีซินแทกซแย่กว่าบอร์นเชลล์มาก) มันเพิ่มฟีเจอร์ที่สะดวกและดีกว่าสำหรับการใช้แบบอินเตอร์แอคทีฟ
ใน3BSD
(1980) which
สคริปต์ cshถูกเพิ่มสำหรับcsh
ผู้ใช้เพื่อช่วยระบุการปฏิบัติการและมันเป็นสคริปต์ที่แตกต่างกันแทบจะไม่คุณสามารถหาได้which
ใน Unices เชิงพาณิชย์จำนวนมากในปัจจุบัน (เช่น Solaris, HP / UX, AIX หรือ Tru64)
สคริปต์นั้นจะอ่านผู้ใช้~/.cshrc
(เช่นเดียวกับcsh
สคริปต์ทั้งหมดยกเว้นที่เรียกใช้ด้วยcsh -f
) และค้นหาชื่อคำสั่งที่ระบุในรายการชื่อแทนและใน$path
(อาร์เรย์ที่csh
ดูแลตาม$PATH
)
ที่นี่คุณไปwhich
มาก่อนสำหรับเปลือกที่นิยมมากที่สุดในเวลา (และcsh
ยังคงเป็นที่นิยมจนถึงช่วงกลาง 90s) ซึ่งเป็นเหตุผลหลักว่าทำไมมันได้รับการบันทึกไว้ในหนังสือและยังคงใช้กันอย่างแพร่หลาย
โปรดทราบว่าแม้สำหรับcsh
ผู้ใช้which
สคริปต์ csh นั้นไม่จำเป็นต้องให้ข้อมูลที่ถูกต้องแก่คุณ จะได้รับนามแฝงที่กำหนดไว้ใน~/.cshrc
ไม่คนที่คุณอาจได้กำหนดไว้ต่อมาที่พรอมต์หรือตัวอย่างเช่นโดยsource
ไอเอ็นจีอีกcsh
ไฟล์และ ( แต่ไม่คิดว่าจะเป็นความคิดที่ดี) อาจจะมีการนิยามใหม่ในPATH
~/.cshrc
การรันwhich
คำสั่งนั้นจากเชลล์เป้าหมายจะยังคงใช้ชื่อแทนการค้นหาที่กำหนดไว้ในของคุณ~/.cshrc
แต่ถ้าไม่มีเพราะคุณไม่ได้ใช้csh
นั่นอาจจะเป็นคำตอบที่ถูกต้อง
ไม่ได้เพิ่มฟังก์ชันการทำงานที่คล้ายกันลงในเชลล์เป้าหมายจนกระทั่ง 1984 ใน SVR2 ด้วยtype
คำสั่ง builtin ความจริงที่ว่ามันถูกสร้างขึ้นภายใน (ตรงข้ามกับสคริปต์ภายนอก) หมายความว่าสามารถให้ข้อมูลที่ถูกต้อง (ในระดับหนึ่ง) เนื่องจากมีการเข้าถึง internals ของเชลล์
type
คำสั่งเริ่มต้นได้รับความเดือดร้อนจากปัญหาที่คล้ายกันเนื่องจากwhich
สคริปต์ไม่ได้ส่งคืนสถานะการออกจากความล้มเหลวหากไม่พบคำสั่ง นอกจากนี้สำหรับเอ็กซีคิวต์ซึ่งตรงกันข้ามกับwhich
มันจะส่งออกบางอย่างเช่นls is /bin/ls
แทนที่จะ/bin/ls
ทำให้มันใช้งานง่ายในสคริปต์
ยูนิกซ์เวอร์ชัน 8 (ไม่ปล่อยในป่า) บอร์นเปลือกมีก็เปลี่ยนไปในตัวtype
whatis
และแผน 9 (ครั้งเพื่อจะสืบต่อจาก Unix) เชลล์rc
(และอนุพันธ์ของมันเช่นakanga
และes
) มีwhatis
เช่นกัน
Korn เชลล์ (ชุดย่อยที่คำนิยาม sh POSIX ตั้งอยู่บนพื้นฐาน) พัฒนาขึ้นในช่วงกลางยุค 80 แต่ไม่สามารถใช้ได้อย่างแพร่หลายก่อนปี 1988 เพิ่มคุณสมบัติหลายcsh
อย่าง (ตัวแก้ไขบรรทัดนามแฝง ... ) ที่ด้านบนของบอร์นเชลล์ . มันเพิ่มwhence
builtin ของตัวเอง(นอกเหนือจากtype
) ซึ่งมีหลายตัวเลือก ( -v
เพื่อให้มีtype
เอาต์พุต verbose เหมือนและ-p
เพื่อค้นหาเฉพาะไฟล์ที่เรียกทำงานได้ (ไม่ใช่ aliases / function ... ))
บังเอิญกับความวุ่นวายเกี่ยวกับปัญหาลิขสิทธิ์ระหว่าง AT&T และ Berkeley มีการใช้งานเชลล์ซอฟต์แวร์ฟรีเพียงไม่กี่รายการในช่วงปลายยุค 80 ต้น 90 ต้น ๆ Almquist shell ทั้งหมด (ash, เพื่อแทนที่เชลล์เป้าหมายใน BSDs), การใช้งานโดเมนสาธารณะของ ksh (pdksh), bash
(สนับสนุนโดย FSF) zsh
ออกมาในระหว่างปี 1989 และ 1991
แอช แต่หมายถึงการเป็นแทนเปลือกบอร์นไม่ได้มีtype
ในตัวจนมากภายหลัง (ใน NetBSD 1.3 และ FreeBSD 2.3) hash -v
แม้ว่ามันจะมี OSF / 1 /bin/sh
มีtype
builtin ซึ่งส่งคืน 0 ถึง OSF / 1 v3.x เสมอ bash
ไม่ได้เพิ่มwhence
แต่เพิ่ม-p
ตัวเลือกในการtype
พิมพ์เส้นทาง ( type -p
จะเหมือนwhence -p
) และ-a
จะรายงานทุกคำสั่งที่ตรงกัน tcsh
ทำwhich
builtin และเพิ่มwhere
คำสั่งทำตัวเหมือน'sbash
มีพวกเขาทั้งหมดtype -a
zsh
fish
เปลือก (2005) มีtype
คำสั่งดำเนินการตามฟังก์ชั่น
which
สคริปต์ csh ขณะที่ถูกลบออกจาก NetBSD (ขณะที่มันกำลัง builtin ใน tcsh และการใช้งานไม่มากในเปลือกหอยอื่น ๆ ) และฟังก์ชั่นที่เพิ่มให้กับwhereis
(เมื่อเรียกว่าเป็นwhich
, whereis
พฤติกรรมเช่นwhich
ยกเว้นว่ามันเพียงเงยหน้าขึ้นมอง executables ใน$PATH
) ใน OpenBSD และ FreeBSD which
ก็เปลี่ยนเป็นหนึ่งเขียนใน C ที่ค้นหาคำสั่งใน$PATH
เท่านั้น
การใช้งาน
การใช้งานwhich
คำสั่งบน Unices ต่าง ๆ ที่มีรูปแบบและพฤติกรรมที่แตกต่างกัน
บน Linux (ข้างๆ builtin tcsh
และzsh
) เราพบการใช้งานหลายอย่าง ในระบบ Debian ล่าสุดเช่นมันเป็นสคริปต์เชลล์ POSIX $PATH
ง่ายที่จะมองหาคำสั่งใน
busybox
ยังมีwhich
คำสั่ง
มีสิ่งGNU
which
ที่น่าจะเป็นฟุ่มเฟือยที่สุด มันพยายามที่จะขยายสิ่งwhich
สคริปต์ csh ทำกับเปลือกหอยอื่น ๆ : คุณสามารถบอกว่าสิ่งที่นามแฝงและฟังก์ชั่นของคุณเพื่อที่จะสามารถให้คำตอบที่ดีกว่า (และผมเชื่อว่าบางลินุกซ์ตั้งชื่อแทนทั่วโลกบางรอบที่bash
จะทำอย่างนั้น) .
zsh
มีโอเปอเรเตอร์สองตัวที่จะขยายไปยังพา ธ ของไฟล์ประมวลผล: โอเปอเรเตอร์การ=
ขยายชื่อไฟล์และโมดิ:c
ฟายเออร์การขยายประวัติ (ใช้กับการขยายพารามิเตอร์ ):
$ print -r -- =ls
/bin/ls
$ cmd=ls; print -r -- $cmd:c
/bin/ls
zsh
ในzsh/parameters
โมดูลยังทำให้ตารางแฮชคำสั่งเป็นcommands
อาร์เรย์เชื่อมโยง:
$ print -r -- $commands[ls]
/bin/ls
whatis
ยูทิลิตี้ (ยกเว้นหนึ่งในระบบปฏิบัติการยูนิกซ์ V8 บอร์นเปลือกหรือแผน 9 rc
/ es
) ไม่ได้เกี่ยวข้องจริงๆมันเป็นเอกสารเท่านั้น (greps ฐานข้อมูล whatis ที่เป็นบทสรุปหน้าคน)
whereis
ถูกเพิ่มเข้ามาใน3BSD
เวลาเดียวกันราวกับwhich
ว่ามันถูกเขียนเข้าไปC
ไม่ใช่csh
และถูกใช้เพื่อค้นหาในเวลาเดียวกันไฟล์ที่เรียกใช้งานได้ man page และ source แต่ไม่ได้ขึ้นอยู่กับสภาพแวดล้อมปัจจุบัน ดังนั้นอีกครั้งที่ตอบสนองความต้องการที่แตกต่าง
ตอนนี้ที่ด้านหน้ามาตรฐาน POSIX จะระบุcommand -v
และ-V
คำสั่ง (ซึ่งเคยเป็นทางเลือกจนถึง POSIX.2008) UNIX ระบุtype
คำสั่ง (ไม่มีตัวเลือก) นั่นคือทั้งหมดที่ ( where
, which
, whence
ไม่ได้ระบุไว้ในมาตรฐานใด ๆ )
ถึงบางรุ่นtype
และcommand -v
เป็นทางเลือกในข้อกำหนดมาตรฐานฐาน Linux ซึ่งอธิบายว่าทำไมเช่นบางรุ่นเก่าของposh
(แต่ขึ้นอยู่กับpdksh
ว่ามีทั้งสอง) ไม่ได้มีทั้ง command -v
ถูกเพิ่มไปยังการใช้งานเชลล์เป้าหมายบางส่วน (เช่นใน Solaris)
สถานะวันนี้
สถานะปัจจุบันคือtype
และcommand -v
เป็นที่แพร่หลายในทุกเปลือกหอยบอร์นเหมือน ( แต่เท่าที่สังเกต @jarno ทราบข้อแม้ / ข้อผิดพลาดในbash
เมื่อไม่ได้อยู่ในโหมด POSIX หรือลูกหลานของ Almquist บางเปลือกด้านล่างในความเห็น) tcsh
เป็นเชลล์เดียวที่คุณต้องการใช้which
(เนื่องจากไม่มีtype
และมีwhich
อยู่ภายใน)
ในเปลือกหอยอื่น ๆ กว่าtcsh
และzsh
, which
อาจบอกคุณเส้นทางของการปฏิบัติการที่กำหนดตราบใดที่ไม่มีชื่อแทนหรือฟังก์ชั่นโดยใช้ชื่อเดียวกันว่าในใด ๆ ของเรา~/.cshrc
, ~/.bashrc
หรือแฟ้มเริ่มต้นเปลือกใด ๆ และคุณไม่ได้กำหนดไว้ใน$PATH
~/.cshrc
หากคุณมีนามแฝงหรือฟังก์ชั่นที่กำหนดไว้สำหรับมันมันอาจจะหรืออาจไม่บอกคุณเกี่ยวกับมันหรือบอกคุณสิ่งที่ผิด
หากคุณต้องการทราบเกี่ยวกับคำสั่งทั้งหมดด้วยชื่อที่กำหนดไม่มีอะไรที่สามารถพกพาได้ คุณต้องการใช้where
ในtcsh
หรือzsh
, type -a
ในbash
หรือzsh
, whence -a
ใน ksh93 และหอยอื่น ๆ ที่คุณสามารถใช้type
ร่วมกับwhich -a
ซึ่งอาจทำงาน
ข้อเสนอแนะ
รับชื่อพา ธ ไปที่ปฏิบัติการ
ตอนนี้เพื่อให้ได้ชื่อพา ธ ของไฟล์ที่เรียกใช้งานได้ในสคริปต์มีคำเตือนอยู่เล็กน้อย:
ls=$(command -v ls)
จะเป็นวิธีมาตรฐานในการทำ
มีปัญหาเล็กน้อยว่า:
- มันเป็นไปไม่ได้ที่จะรู้เส้นทางของการปฏิบัติการโดยไม่ต้องดำเนินการ ทั้งหมด
type
, which
, command -v
... การวิเคราะห์พฤติกรรมการใช้งานทั้งหมดเพื่อหาเส้นทาง พวกมันวนไปตาม$PATH
ส่วนประกอบต่างๆและค้นหาไฟล์ที่ไม่ใช่ไดเรกทอรีไฟล์แรกที่คุณได้รับอนุญาตให้ใช้งาน อย่างไรก็ตามขึ้นอยู่กับเชลล์เมื่อพูดถึงการเรียกใช้งานคำสั่งหลายคำสั่ง (Bourne, AT&T ksh, zsh, ash ... ) จะดำเนินการตามลำดับ$PATH
จนกว่าการexecve
เรียกของระบบจะไม่กลับมาพร้อมกับข้อผิดพลาด . ยกตัวอย่างเช่นถ้า$PATH
มี/foo:/bar
และคุณต้องการที่จะดำเนินการls
พวกเขาครั้งแรกที่จะพยายามที่จะดำเนินการหรือถ้าที่ล้มเหลว/foo/ls
/bar/ls
ตอนนี้การดำเนินการของ/foo/ls
อาจล้มเหลวเนื่องจากคุณไม่ได้รับอนุญาตให้ดำเนินการ แต่ด้วยเหตุผลอื่น ๆ อีกมากมายเช่นมันไม่สามารถใช้งานได้ command -v ls
จะรายงาน/foo/ls
หากคุณมีสิทธิ์ดำเนินการ/foo/ls
แต่การเรียกใช้ls
อาจทำงานได้จริง/bar/ls
หาก/foo/ls
ไม่ใช่ไฟล์ปฏิบัติการที่ถูกต้อง
- ถ้า
foo
เป็น builtin หรือฟังก์ชั่นหรือนามแฝงผลตอบแทนcommand -v foo
foo
ด้วยเปลือกหอยบางชอบash
, pdksh
หรือzsh
มันยังอาจจะกลับมาfoo
ถ้า$PATH
มีสตริงที่ว่างเปล่าและมีปฏิบัติการfoo
ไฟล์ในไดเรกทอรีปัจจุบัน มีบางสถานการณ์ที่คุณอาจต้องคำนึงถึงเรื่องนี้ โปรดทราบว่ารายการของบิลด์อินจะแตกต่างกันไปตามการใช้งานเชลล์ (ตัวอย่างเช่นmount
บางครั้งมีการติดตั้งไว้สำหรับ busybox sh
) และอินสแตนซ์bash
สามารถรับฟังก์ชั่นจากสภาพแวดล้อมได้
- หาก
$PATH
มีส่วนประกอบของเส้นทางสัมพันธ์ (โดยทั่วไป.
หรือสตริงว่างซึ่งทั้งสองอ้างถึงไดเรกทอรีปัจจุบัน แต่อาจเป็นอะไรก็ได้) ขึ้นอยู่กับเปลือกcommand -v cmd
อาจไม่ส่งออกเส้นทางที่แน่นอน เส้นทางที่คุณได้รับในเวลาที่คุณวิ่งcommand -v
จะไม่สามารถใช้ได้อีกต่อไปหลังจากที่คุณcd
อยู่ที่อื่น
- เกร็ดเล็กเกร็ดน้อย: เปลือกหอย ksh93 ถ้า
/opt/ast/bin
(ว่าที่เส้นทางที่แน่นอนอาจแตกต่างกันในระบบที่แตกต่างกันผมเชื่อว่า) อยู่ในตัวคุณ$PATH
, ksh93 จะทำให้ใช้ได้ builtins พิเศษไม่กี่ ( chmod
, cmp
, cat
... ) แต่command -v chmod
จะกลับมา/opt/ast/bin/chmod
แม้ว่าเส้นทางที่ doesn' ไม่มีตัวตน
การพิจารณาว่าคำสั่งมีอยู่จริงหรือไม่
ในการตรวจสอบว่าคำสั่งที่กำหนดมีอยู่เป็นมาตรฐานหรือไม่คุณสามารถทำได้:
if command -v given-command > /dev/null 2>&1; then
echo given-command is available
else
echo given-command is not available
fi
ที่หนึ่งอาจต้องการใช้ which
(t)csh
ในcsh
และtcsh
คุณไม่มีทางเลือกมากนัก ในtcsh
นั้นเป็นสิ่งที่ดีเป็นwhich
builtin ในcsh
นั้นจะเป็นwhich
คำสั่งระบบซึ่งอาจไม่ทำสิ่งที่คุณต้องการในบางกรณี
ค้นหาคำสั่งในเชลล์บางตัวเท่านั้น
กรณีที่มันอาจจะทำให้ความรู้สึกที่จะใช้which
คือถ้าคุณต้องการที่จะรู้เส้นทางของคำสั่งโดยไม่สนใจ builtins เปลือกที่มีศักยภาพหรือฟังก์ชั่นในbash
, csh
(ไม่tcsh
) dash
หรือBourne
เปลือกสคริปต์ที่เป็นเปลือกหอยที่ไม่ได้whence -p
(เหมือนksh
หรือzsh
) , command -ev
(ชอบyash
), whatis -p
( rc
, akanga
) หรือ builtin which
(ชอบtcsh
หรือzsh
) บนระบบที่which
มีให้ใช้งานและไม่ใช่csh
สคริปต์
หากตรงตามเงื่อนไขเหล่านั้นแล้ว:
echo=$(which echo)
จะให้เส้นทางของคุณเป็นครั้งแรกecho
ใน$PATH
(ยกเว้นในกรณีมุม) โดยไม่คำนึงถึงว่าจะecho
เกิดขึ้นเป็นเชลล์ builtin / alias / function หรือไม่
ในเชลล์อื่นคุณต้องการ:
- zsh :
echo==echo
หรือecho=$commands[echo]
หรือecho=${${:-echo}:c}
- ksh , zsh :
echo=$(whence -p echo)
- yash :
echo=$(command -ev echo)
- rc , akanga :
echo=`whatis -p echo`
(ระวังเส้นทางที่มีช่องว่าง)
- ปลา :
set echo (type -fp echo)
โปรดทราบว่าถ้าสิ่งที่คุณต้องการจะทำคือเรียกว่าecho
คำสั่งคุณไม่จำเป็นต้องได้รับเส้นทางของมันคุณก็สามารถทำได้:
env echo this is not echoed by the builtin echo
ตัวอย่างเช่น, with tcsh
, เพื่อป้องกัน builtin ไม่ให้which
ถูกใช้:
set Echo = "`env which echo`"
เมื่อคุณต้องการคำสั่งภายนอก
อีกกรณีที่คุณอาจต้องการใช้which
คือเมื่อคุณต้องการคำสั่งจากภายนอก POSIX ต้องการให้เชลล์บิวด์อินทั้งหมด (เช่นcommand
) พร้อมใช้งานเป็นคำสั่งภายนอก แต่น่าเสียดายที่ไม่ใช่ในกรณีของcommand
หลายระบบ ตัวอย่างเช่นมันหายากที่จะหาcommand
คำสั่งบนระบบปฏิบัติการที่ใช้ Linux ในขณะที่พวกเขาส่วนใหญ่มีwhich
คำสั่ง
กรณีที่คุณอาจต้องการคำสั่งภายนอกจะเป็นทุกที่ที่คุณจะเรียกใช้คำสั่งโดยไม่ต้องเรียกใช้ POSIX เชลล์
system("some command line")
, popen()
... ฟังก์ชั่นของ C หรือภาษาต่างๆไม่เรียกเปลือกจะแยกบรรทัดคำสั่งที่เพื่อsystem("command -v my-cmd")
ทำผลงานในพวกเขา ข้อยกเว้นสำหรับสิ่งที่จะperl
เพิ่มประสิทธิภาพเชลล์ถ้าไม่เห็นอักขระพิเศษของเชลล์ (นอกเหนือจากช่องว่าง) ซึ่งยังใช้กับผู้ให้บริการ backtick ด้วย:
$ perl -le 'print system "command -v emacs"'
-1
$ perl -le 'print system ":;command -v emacs"'
/usr/bin/emacs
0
$ perl -e 'print `command -v emacs`'
$ perl -e 'print `:;command -v emacs`'
/usr/bin/emacs
นอกเหนือจากที่กล่าวมา:;
ข้างต้นบังคับperl
ให้เรียกกระสุนที่นั่น โดยการใช้which
คุณจะไม่ต้องใช้เคล็ดลับนั้น
which
นั้นถือว่าเป็นบริบทเชลล์แบบโต้ตอบ คำถามนี้ติดแท็ก / พกพา ดังนั้นฉันจึงตีความคำถามในบริบทนี้ว่า "สิ่งที่จะใช้แทนwhich
การค้นหาสิ่งที่เรียกใช้งานได้ครั้งแรกของชื่อที่กำหนดใน$PATH
" คำตอบและเหตุผลส่วนใหญ่เกี่ยวกับการwhich
จัดการกับนามแฝงบิวด์อินและฟังก์ชั่นซึ่งในเชลล์สคริปแบบพกพาส่วนใหญ่ในโลกแห่งความจริงเป็นเพียงความสนใจด้านวิชาการ นามแฝงที่กำหนดไว้ในเครื่องจะไม่สืบทอดเมื่อเรียกใช้เชลล์สคริปต์ (เว้นแต่คุณจะส่งมาด้วย.
)