เนื่องจาก 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 )" อ้างถึงไดเร็กทอรีที่สคริปต์อยู่ อัปเดตสคริปต์ของคุณตามนั้น และควรใช้งานได้