จะทราบเส้นทางของซอฟต์แวร์เฉพาะได้อย่างไร


13

บริบท: ฉันพยายามทำให้แอปพลิเคชันเริ่มต้นโดยอัตโนมัติเมื่อฉันเข้าสู่ระบบ สำหรับสิ่งนี้ฉันต้องเลือกpathแอปพลิเคชัน

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือเส้นทางที่ฉันดูแล้ว:

  • /sbin
  • /usr/sbin
  • /usr/local/bin
  • /usr/share/

หากสิ่งนี้อาจช่วยได้แอปพลิเคชันที่ฉันพยายามค้นหาเรียกว่า " ScreenCloud " และฉันดาวน์โหลดจาก Ubuntu Software Center

แต่ฉันไม่พบมันมีวิธีใดบ้างที่ฉันจะทราบได้ว่ามีการติดตั้งซอฟต์แวร์เฉพาะหรือไม่ เพราะแม้ว่าฉันจะพบสิ่งนี้ฉันก็อยากจะหลีกเลี่ยงปัญหาเดียวกันในอนาคต


2
มันไม่ทำงานถ้าคุณเพียงแค่พิมพ์ screencloud ในบรรทัดคำสั่ง?
เกรแฮม

คุณได้รับมาจากสแน็ปสโตร์หรือจากศูนย์ซอฟต์แวร์อูบุนตูเพราะฉันไม่สามารถหามันได้จากคลังเก็บ apt ของ Ubuntu
mchid

2
@mchid ฉันไม่ได้ลิงค์ไปที่ OP แต่เป็นความคิดเห็นของคุณ: "เพราะฉันไม่สามารถหามันได้ในที่เก็บ Ubuntu apt" Screencloud สามารถติดตั้งได้จาก.debแพ็คเกจ แต่คุณต้องเพิ่ม PPA
WinEunuuchs2Unix

1
@mchid ผมรู้ว่าคำสั่งก็เปลี่ยนจากscreencloud.shไปและสงสัยว่ามันจะถูกย้ายออกจากscreencloud /optว่าเป็นส่วนหนึ่งของคำตอบของฉันคือการชี้ให้เห็นวิธีการtypeและwhichจะไม่พบscreencloudแต่locateจะ
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix ถูกต้อง screencloud.shยังคงมีอยู่จริง แต่ฉันไม่แน่ใจว่ามันแตกต่างจากscreencloudความจริงที่ว่า.shไฟล์เป็นสคริปต์และscreencloudไม่ใช่ ฉันไม่คุ้นเคยกับแอปพลิเคชันนี้จริงๆ ใต้/usr/bin/มี a screencloud, a screencloud.shและ a screencloud-ตามด้วยหมายเลขรุ่นเรียงลำดับว่าgimpเป็นอย่างไร
เย็น

คำตอบ:


16

ค้นหาเส้นทางของการปฏิบัติการ

วิธีที่ดีที่สุด

  • type executable

ลองอ่านคำถามนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับวิธีที่typeดีกว่า (ขอบคุณความคิดเห็น!)

ทางอื่น

  • whereis executable
  • which executable

คำสั่งเหล่านั้นค้นหาเฉพาะในตัวแปร PATH ( echo $PATH) ดังนั้นจึงไม่สามารถใช้งานได้ในบางกรณี (ฟังก์ชันในตัว, ชื่อแทนหรือฟังก์ชันทุบตีและอื่น ๆ )


3
อย่างไม่น่าเชื่อที่เพียงพอนี้ยังไม่ได้ถามคำถามเกี่ยวกับอูบุนตู เป็นคำถามที่ดี @Ced!
tatsu

แน่นอนฉันแทบจะไม่เชื่อเลย!
Biggybi

1
ฉันพบจากคำถามอื่นที่typeเป็นที่ต้องการมากกว่าwhichเพราะมันเป็น shell builtin และสามารถระบุได้ว่าคำสั่งนั้นเป็น alias หรือไม่ นั่นก็เป็นสิ่งใหม่สำหรับฉันเช่นกัน!
'19 น

1
ดูที่นี่สำหรับคำอธิบาย (ยาว) เกี่ยวกับสาเหตุtypeที่ต้องการ: ทำไมไม่ใช้ "อัน" จะใช้อะไรดี?
terdon

1
@mchid คะแนนในคำตอบทั้งหมดนำไปใช้ รวมถึงส่วน "Use Cases" ซึ่งชี้ให้เห็นว่าwhichมีประโยชน์อย่างแท้จริงในบริบทเฉพาะของเชลล์สคริปต์ อย่างไรก็ตามภายนอกบริบทนั้นtypeเป็นตัวเลือกที่ดีกว่า
terdon

1

ค้นหาตำแหน่งคำสั่งภายในหรือนอกเส้นทาง

สมมติว่าคุณต้องการค้นหาตำแหน่งของunameโปรแกรมที่แสดงข้อมูลระบบ หากคุณต้องการที่จะรู้ว่าสิ่งที่ไดเรกทอรีคำสั่งระดับบนสุดจะถูกเก็บไว้ในคุณมีตัวเลือกมากมาย:

$ which uname
/bin/uname

$ type -a uname
uname is /bin/uname

$ command -v uname
/bin/uname

$ locate uname
/bin/uname
    (... SNIP dozens of Windows files on C & D ...)
/usr/lib/klibc/bin/uname
/usr/lib/plainbox-provider-resource-generic/bin/uname_resource
/usr/share/man/man1/uname.1.gz
/usr/share/man/man2/oldolduname.2.gz
/usr/share/man/man2/olduname.2.gz
/usr/share/man/man2/uname.2.gz

หาข้อได้เปรียบ

ตัวเลือกสุดท้ายlocateส่งคืนไฟล์ทั้งหมดที่มีunameไม่เพียง แต่โปรแกรมที่รันจากพรอมต์คำสั่ง

ข้อดีของlocateมันคือจะหาคำสั่งที่ไม่ได้อยู่ในเส้นทางการค้นหาของคุณ type -a(ต้องการมากกว่าแบบง่าย ๆtype) และwhichจะพบเฉพาะคำสั่งในเส้นทางการค้นหาของคุณ echo $PATHหากต้องการดูการใช้เส้นทางการค้นหาของคุณ

ยกตัวอย่างเช่นคำตอบนี้ในวิธีการเริ่ม screencloud? :

ลอง...

/opt/screencloud/screencloud.sh

locate screencloudคำสั่งจะพบว่ามัน แต่which screencloudและtype -a screencloudจะไม่ได้เนื่องจาก:

  • ชื่อเต็มคือscreencloud.shและlocateคำสั่งค้นหาเฉพาะส่วนที่ตรงกัน
  • /opt/screencloudอาจไม่ได้อยู่ในเส้นทางการค้นหา whichและtypeค้นหาไฟล์ที่เรียกใช้งานได้ในพา ธ การค้นหาเท่านั้น

หมายเหตุ:นี่เป็นคำตอบที่เก่ากว่า โมเดิร์น ScreenCloud screencloudเรียกว่ามี

ค้นหาข้อได้เปรียบเหนือfindคำสั่งคือสามารถทำได้เร็วกว่าหลายร้อยหรือหลายพันเท่า นอกจากนี้การทำงานfindเริ่มต้นจากการที่จะทำให้เกิดข้อผิดพลาดได้รับอนุญาตจำนวนมากที่คุณจะไม่พบกับ/locate

ค้นหาข้อเสีย

หากคุณเพิ่งติดตั้งโปรแกรมวันนี้คุณจะต้องใช้sudo updatedbเพื่ออัปเดตฐานข้อมูลของ loc


1

ใช้คำสั่งต่อไปนี้เพื่อแสดงรายการ$PATHไดเรกทอรีทั้งหมดของคุณ:

echo $PATH | sed 's/:/\n/g'

ใช้คำสั่งต่อไปนี้เพื่อค้นหาพา ธ แบบเต็มสำหรับscreencloud:

for i in $(echo $PATH | sed 's/:/\n/g'); do find $i/screencloud* 2>@1; done

หากคุณใช้apt, apt-getหรือศูนย์อูบุนตูซอฟแวร์ที่จะติดตั้งแพคเกจคุณสามารถใช้คำสั่งต่อไปนี้เพื่อหาเส้นทางที่เต็มรูปแบบ:

dpkg -L screencloud | grep bin

สมมติว่าคุณใช้พื้นที่เก็บข้อมูลนี้คุณควรจะสามารถที่จะหาในscreencloud /usr/bin/

เส้นทางแบบเต็มคือ:

/usr/bin/screencloud

หรือ

/usr/bin/screencloud-*

อย่างไรก็ตามหากคุณใช้สแน็ปคราฟต์สโตร์ตามลิงก์ที่คุณระบุไว้ในคำถามของคุณเส้นทางจะอยู่ภายใต้ไดเรกทอรีต่อไปนี้:

/snap/bin

ข้อมูลเพิ่มเติม

นอกจากนี้โปรดจำไว้ว่า Ubuntu นั้นคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ดังนั้นคุณต้องใช้ตัวพิมพ์เล็กทั้งหมดโดยไม่มีตัวพิมพ์ใหญ่


ขอบคุณสำหรับคำตอบที่ละเอียดมากนี้คุณชนะการโหวตแล้ว :)
Ced Ced

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