Score:1

ฉันจะเรียกใช้แอปพลิเคชันจากที่ใดก็ได้ในเทอร์มินัลโดยไม่ต้องอยู่ในเส้นทางแบบเต็มได้อย่างไร

ธง vu

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

-$ cd home/myApps/app
-$./run.sh

ฉันต้องการเรียกใช้ run.sh จากที่ใดก็ได้ในเทอร์มินัลของฉันโดยไม่ต้องอยู่ในเส้นทางแบบเต็ม ฉันพยายามใช้ alais และเพิ่มโค้ดด้านล่างลงในไฟล์ bashrc

นามแฝง mylovleyapp=/home/myApps/app/run.sh

ปัญหาคือเมื่อใดก็ตามที่ฉันต้องการเรียกใช้แอปโดยใช้ mylovleyapp โปรแกรมจะส่งคืนข้อผิดพลาดเนื่องจาก run.sh ขึ้นอยู่กับไฟล์อื่นในโฟลเดอร์ myApps

ฉันจะประสบความสำเร็จได้อย่างไร

cocomac avatar
cn flag
สคริปต์น่าจะมีบรรทัดที่เป็น `./something` แต่นั่นสัมพันธ์กับไดเร็กทอรีปัจจุบัน _your_ ไม่ใช่ไดเร็กทอรีปัจจุบันของสคริปต์ เมื่อคุณเรียกใช้งานจากตำแหน่งที่สคริปต์อยู่ ทั้งสองจะเหมือนกัน ดังนั้นจึงไม่สำคัญ แต่เมื่อคุณเรียกใช้จากที่อื่น จะทำให้เกิดปัญหาดู [คำถาม Stack Overflow](https://stackoverflow.com/q/59895/16886597) เพื่อดูวิธีรับไดเรกทอรีปัจจุบันของสคริปต์จากภายในสคริปต์ อัปเดตสคริปต์ของคุณด้วยสิ่งนั้น และคุณก็พร้อมที่จะไป
Will avatar
id flag
@cocomac อาจใส่สิ่งนี้เป็นคำตอบ? ฉันคิดว่ามันน่าจะแก้ไขปัญหาได้ดีกว่าคำตอบของฉัน
cocomac avatar
cn flag
@ ฉันจะให้คำตอบในไม่กี่นาที
cocomac avatar
cn flag
@ ฉันจะทำให้มันเป็นคำตอบที่ถูกต้องหรือไม่
Score:2
ธง cn

เนื่องจาก OP ไม่มีสคริปต์ตัวอย่าง ฉันจะสร้างสคริปต์ขึ้นมา มันจะทำสิ่งหนึ่ง วิ่ง ในไดเรกทอรีของสคริปต์

ใช่ ฉันรู้ว่าคุณทำได้ ปราศจาก ./. แต่สำหรับตัวอย่างนี้ ฉันกำลังแสร้งทำเป็นว่าจำเป็น เพื่อแสดงสคริปต์ที่ใช้ไดเร็กทอรีปัจจุบันของสคริปต์

#!/usr/bin/env ทุบตี
ล./

บันทึกสคริปต์นั้นไว้ที่ใดที่หนึ่ง ฉันจะบันทึกเป็น /home/ubuntu/test/myscript. ทำให้มันปฏิบัติการได้ด้วย chmod +x /home/ubuntu/test/myscript. ตอนนี้ ซีดี ไปยังไดเร็กทอรีที่มีสคริปต์อยู่ (เช่น cd /home/ubuntu/ทดสอบ) และเรียกใช้สคริปต์ด้วย ./myscript:

ubuntu@computer:~/test$ ./myscript
myscript someRandomFile

จนถึงตอนนี้ดีมาก แต่ตอนนี้ให้เรียกใช้จากไดเร็กทอรีอื่น สำหรับตัวอย่างนี้ ฉันจะเรียกใช้จากไดเรกทอรีราก (/).

ubuntu@computer:~/test$ ซีดี /
ubuntu@computer:/$ /home/ubuntu/test/myscript
bin dev home lib lib64 สูญหาย + พบ mnt proc เรียกใช้ snap sys usr
บูต ฯลฯ init lib32 libx32 สื่อเลือก root sbin srv tmp var

อ๊ะ. เราต้องการให้พิมพ์ไฟล์ในตำแหน่งของสคริปต์ ไม่ใช่ตำแหน่งของผู้ใช้ ก่อนที่เราจะหาทางออกลองคิดดูว่า ทำไม มันทำสิ่งนี้สักครู่ คำตอบนั้นง่าย ./ มีความสัมพันธ์กับ ของผู้ใช้ ไดเร็กทอรีปัจจุบัน ไม่ใช่หนึ่งในสคริปต์

ในการรับไดเร็กทอรีของสคริปต์จากภายในสคริปต์ เราจะดูที่ คำถาม Stack Overflow นี้.

สาระสำคัญของมันคือง่าย: script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" จะได้รับไดเร็กทอรีปัจจุบันของสคริปต์และเก็บไว้ในตัวแปร script_dir.

มาอัพเดทสคริปต์กัน สคริปต์ของเราตอนนี้คือ:

#!/usr/bin/env ทุบตี
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
ls "$script_dir"

ลองรันดูว่ามันใช้ได้ไหม:

ubuntu@computer:/$ /home/ubuntu/test/myscript
myscript someRandomFile

มันได้ผล! มันพิมพ์ไฟล์ในไดเร็กทอรีของสคริปต์ แม้ว่าคุณจะไม่ได้อยู่ในไดเร็กทอรีเดียวกับสคริปต์ เสร็จแล้ว แนวคิดโดยรวมนั้นง่าย ในสคริปต์ ./ อ้างถึงไดเร็กทอรีของผู้ใช้ "$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" อ้างถึงไดเร็กทอรีที่สคริปต์อยู่ อัปเดตสคริปต์ของคุณตามนั้น และควรใช้งานได้

Score:1
ธง cn

มีหลายวิธีไปกรุงโรม

นามแฝง

หากคุณต้องการนามแฝง คุณสามารถทำดังนี้:

นามแฝง mylovleyapp='(cd home/myApps/app && ./run.sh)'

เครื่องมือจัดฟัน (...) ทำให้ทั้งสองคำสั่งทำงานในเชลล์ย่อย ดังนั้นไดเร็กทอรีปัจจุบันของคุณจะไม่เปลี่ยนแปลงเมื่อโปรแกรมสิ้นสุดลง

สคริปต์ตัวตัดคำใน PATH ของคุณ

คุณสามารถสร้างสคริปต์ตัวตัดคำและวางไว้ในโฟลเดอร์ที่อยู่ในการค้นหาของคุณแทน เส้นทาง, เช่น. ~/.local/bin หรือ ~/ถังขยะ หากคุณเป็นผู้ใช้รายเดียวที่ต้องการการเข้าถึง หรือ /usr/local/bin หากผู้ใช้ทั้งหมดจำเป็นต้องเข้าถึง จากนั้นสิ่งที่คุณต้องทำคือพิมพ์ชื่อสคริปต์เพื่อเปิดโปรแกรม

สคริปต์สามารถเป็นเพียงสิ่งที่คุณทำตามปกติเพื่อเริ่มโปรแกรม:

#!/usr/bin/env ทุบตี
cd home/myApps/app
./run.sh

บันทึกสคริปต์นั้นเช่น ~/.local/bin/mylovleyapp. ทำให้สคริปต์สามารถเรียกใช้งานได้:

chmod +x ~/.local/bin/mylovleyapp

ถ้า ~/.local/bin ไม่มีอยู่จริง และคุณต้องสร้างขึ้น จากนั้นออกจากระบบแล้วกลับเข้ามาใหม่เพื่อให้รวมไว้ในของคุณโดยอัตโนมัติ เส้นทาง. จากนี้ไปเพียงพิมพ์ แอพ mylovley ในเทอร์มินัลจะเรียกใช้แอปของคุณ

MindC3ll avatar
vu flag
ขอบคุณมากสำหรับคำตอบของคุณ! .. มันใช้งานได้อย่างมีเสน่ห์ .. ฉันสร้างสคริปต์ A wrapper ให้กับเส้นทางของฉันและนั่นก็สมบูรณ์แบบ
Score:1
ธง cn

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

เส้นทาง=.:$เส้นทาง

ตอนนี้คุณสามารถโทรหาแอปของคุณได้จากทุกที่โดยไม่ต้องพิมพ์เส้นทางแบบเต็ม หากคุณปิดเทอร์มินัล การตั้งค่านี้จะหายไป

หากต้องการตั้งค่าอย่างถาวร คุณต้องแก้ไขไฟล์ .bashrc และเพิ่ม :/home/myApps/app ต่อท้าย PATH ของคุณ บันทึกไฟล์ .bashrc ใหม่ จากนั้น:

ที่มา .bashrc
Score:0
ธง id

ดังนั้นคุณต้องเปลี่ยนไดเร็กทอรีการทำงานของคุณเป็นไดเร็กทอรีที่แอปพลิเคชันเป้าหมายอยู่ จากนั้นเรียกใช้แอปพลิเคชันเพื่อให้สามารถค้นหาไฟล์ที่อ้างอิงได้

ฉันคิดว่าคุณสามารถทำได้โดยให้คำสั่งแยกกันสองคำสั่งในนามแฝง: คำสั่งหนึ่งสำหรับเปลี่ยนไดเร็กทอรีและอีกคำสั่งหนึ่งเพื่อเรียกใช้งานโปรแกรม โดยคั่นด้วยเครื่องหมายอัฒภาค

ดังนั้นของคุณ .bashrc นอกจากนี้ควรอ่าน:

นามแฝง mylovleyapp='cd /home/myApps/app; ./run.sh'

นั่นถือว่าไฟล์ที่ขึ้นต่อกันอยู่ใน /home/myApps/app ... ถ้าไม่ใช่ คุณสามารถเปลี่ยนไดเร็กทอรีการทำงานเป็นไดเร็กทอรีที่มีไฟล์อ้างอิง จากนั้นเรียกใช้แอพโดยใช้พาธสัมบูรณ์เป็นองค์ประกอบที่สอง

MindC3ll avatar
vu flag
ไม่มีวิธีใดที่จะทำให้โฟลเดอร์เป็นสากล?
cocomac avatar
cn flag
@MindC3ll ใช่แล้ว ดู[ความคิดเห็นของฉัน](https://askubuntu.com/questions/1368492/how-i-can-run-application-from-anywhere-in-the-terminal-without-being-in-the-ful/1368496# ความคิดเห็น2351406_1368492). มันซับซ้อนกว่าคำตอบของ Will แต่จะหมายความว่าคุณสามารถเรียกใช้สคริปต์โดยไม่ต้อง `cd`-ing ไปยังไดเร็กทอรี

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา