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