ค้นหาไฟล์ในพา ธ ที่ไม่มี“ อันไหน”?


12

ฉันสามารถเรียกใช้สคริปต์ได้ (อย่างใด):

$ assemble.sh file
... [output]

แต่whichหาไม่เจอ:

$ which assemble.sh
which: no assemble.sh in (/s/std/bin:/usr/afsws/bin:/opt/SUNWspro/bin:/usr/ccs/bin:/usr/ucb:/bin:/usr/bin:/usr/stat/bin:/usr/X11R6/bin:.
  1. เป็นไปได้อย่างไร?
  2. ฉันจะหาไฟล์นี้ได้จากที่ไหน?

ฉันใช้ทุบตี


อยู่assemble.shในไดเรกทอรีปัจจุบันของคุณหรือไม่
Keith

3
อาจจะเป็นคำถามโง่ แต่มันคือนามแฝง (เช่นไม่ assemble.sh ปรากฏขึ้นเมื่อคุณพิมพ์คำสั่ง alias ?
เจมส์ McLeod

@JamesMcLeod เดาได้เลย! มันเป็นกรณีของฉันสำหรับ acme.sh ( github.com/Neilpang/acme.sh ) หลังจากติดตั้งแล้วนามแฝง acme.sh ถูกสร้างขึ้นและฉันสงสัยว่า acme.sh ถูกเรียกแม้ว่าจะไม่ได้อยู่ใน PATH var ก็ตาม
rlib

คำตอบ:


17

ใช้คำสั่งนี้: type assemble.sh

มันทำงานได้ในหลากหลายเชลล์และแสดงเฉพาะผลลัพธ์แรกเท่านั้น


9
หรือเพียงแค่type assemble.shเป็นแบบพกพา (และแสดงเฉพาะนัดแรกในขณะที่type -aเป็น ksh / bash สร้างเพื่อแสดงการแข่งขันทั้งหมด)
Gilles 'หยุดความชั่วร้าย'

6

หรือแยกเส้นทางและใช้มันในการค้นหา - คู่แรกควรเป็นคำตอบ

find ${PATH//:/ } -maxdepth 1 -name assemble.sh -print -quit

type แน่นอนง่ายขึ้น


2
สิ่งนี้มีประโยชน์พอสมควร ฉันไม่ทราบว่าฉันสามารถแยก $ PATH เป็นส่วนประกอบย่อยและค้นหาแต่ละรายการด้วยfind
Ehtesh Choudhury

1
ไม่ได้ลอง แต่ฉันคิดว่านี่อาจจะมีช่องว่างในส่วนประกอบของ PATH
เมื่อ

4

คุณอาจใช้ bash แต่ไวยากรณ์ของwhichผลลัพธ์แสดงว่าคุณใช้ตัวwhichเขียนเก่าใน csh PATH แสดงให้เห็นถึงเครื่องหมายคำพูดในวงเล็บและไดเรกทอรีใน PATH มีรายการที่ชอบ/opt/SUNWspro/binและ/usr/ccs/binมีเหตุผลใน Solaris เท่านั้น นั่นเป็นที่สอดคล้องกัน: Solaris ใช้ whichcsh

นี่คือการคาดเดาของฉัน: คุณมี PATH หนึ่งสำหรับทุบตีและอีกอันสำหรับ csh นี่อาจเป็นปัญหาของระบบ ตามที่ฉันจำได้ Solaris จะเก็บไฟล์ / etc / profile และ / etc / cshrc ไว้สำหรับการตั้งค่า PATH ทั่วทั้งระบบ ไฟล์เริ่มต้นสองไฟล์นั้นอาจตั้งค่าตัวแปร PATH ที่แตกต่างกันสำหรับเชลล์ที่แตกต่างกัน ทำ "echo $ PATH" ภายใต้ bash และดูว่ามันเห็นด้วยกับwhichคำสั่งที่พิมพ์ออกมาเป็นสตริง PATH หรือไม่


4
command -v assemble.sh

ข้อมูล

พิมพ์คำอธิบายของ COMMAND คล้ายกับ `type 'builtin

นอกจากนี้ยังจะเป็นประโยชน์ถ้าคุณต้องการที่จะหาได้ในรุ่นที่ปรับเปลี่ยนเส้นทางASSEMBLE=$(PATH=/usr/bin:/usr/local/opt/coreutils/libexec/gnubin command -v assemble.sh)
nhed

0

คุณสามารถใช้locate assemble.shเพื่อค้นหาตำแหน่งของไฟล์


ไม่นี่แสดงตำแหน่งที่ตั้งของไฟล์ที่อ่านได้ทั้งหมด (โลก -) ที่มีชื่อassemble.shซึ่งไม่เกี่ยวข้องที่นี่
Gilles 'หยุดความชั่วร้าย'

มันไม่ได้เกี่ยวข้องเลย แม้ว่าเขาจะมีไฟล์หลายไฟล์ที่เรียกว่าอย่างนั้นlocateก็จะให้ตำแหน่งที่เขาต้องการ assemble.shไม่ใช่ชื่อไฟล์ทั่วไปดังนั้นเขาน่าจะหาไฟล์ได้ง่าย (ซึ่งเป็นสิ่งที่ OP ร้องขอ)
โก้

1
คุณไม่จำเป็นต้องแสดงผลลัพธ์updatedbก่อนlocateหรือไม่
เกล็นแจ็คแมน

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