นี่คือทั้งหมดที่คุณไม่เคยคิดว่าคุณจะไม่อยากรู้เกี่ยวกับมัน:
สรุป
ในการรับชื่อพา ธ ของไฟล์เรียกทำงานในสคริปต์เชลล์แบบบอร์น (มีคำเตือนอยู่บ้างเล็กน้อยดูด้านล่าง):
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อย่าง (ตัวแก้ไขบรรทัดนามแฝง ... ) ที่ด้านบนของบอร์นเชลล์ . มันเพิ่มwhencebuiltin ของตัวเอง(นอกเหนือจาก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มีtypebuiltin ซึ่งส่งคืน 0 ถึง OSF / 1 v3.x เสมอ bashไม่ได้เพิ่มwhenceแต่เพิ่ม-pตัวเลือกในการtypeพิมพ์เส้นทาง ( type -pจะเหมือนwhence -p) และ-aจะรายงานทุกคำสั่งที่ตรงกัน tcshทำwhichbuiltin และเพิ่มwhereคำสั่งทำตัวเหมือน'sbash มีพวกเขาทั้งหมดtype -azsh
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นั้นเป็นสิ่งที่ดีเป็นwhichbuiltin ใน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จัดการกับนามแฝงบิวด์อินและฟังก์ชั่นซึ่งในเชลล์สคริปแบบพกพาส่วนใหญ่ในโลกแห่งความจริงเป็นเพียงความสนใจด้านวิชาการ นามแฝงที่กำหนดไว้ในเครื่องจะไม่สืบทอดเมื่อเรียกใช้เชลล์สคริปต์ (เว้นแต่คุณจะส่งมาด้วย.)