dirname
คำสั่งเป็นพื้นฐานที่สุดเพียงแค่การแยกเส้นทางถึงชื่อไฟล์ออกจาก$0
ตัวแปร (ชื่อสคริปต์):
dirname "$0"
แต่ดังที่ด้าน bชี้ให้เห็นเส้นทางที่ส่งกลับจะแตกต่างกันไปตามวิธีการเรียกใช้สคริปต์ pwd
ไม่ทำงานเนื่องจากจะบอกคุณว่าไดเรกทอรีปัจจุบันคืออะไรไม่ใช่ไดเรกทอรีที่สคริปต์ตั้งอยู่นอกจากนี้หากดำเนินการลิงก์สัญลักษณ์ไปยังสคริปต์คุณจะได้รับเส้นทาง (อาจสัมพันธ์กัน) ไป ตำแหน่งที่ลิงก์อยู่ไม่ใช่สคริปต์จริง
บางคนพูดถึงreadlink
คำสั่ง แต่ที่ง่ายที่สุดคุณสามารถใช้:
dirname "$(readlink -f "$0")"
readlink
จะแก้ไขพา ธ ของสคริปต์ไปยังพา ธ สัมบูรณ์จากรูทของระบบไฟล์ ดังนั้นเส้นทางใด ๆ ที่มีจุดเดียวหรือสองจุดตัวหนอนและ / หรือลิงก์สัญลักษณ์จะได้รับการแก้ไขเป็นเส้นทางแบบเต็ม
นี่เป็นสคริปต์ที่แสดงให้เห็นถึงสิ่งเหล่านี้whatdir.sh
:
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
ใช้สคริปต์นี้ในบ้าน dir ของฉันโดยใช้เส้นทางญาติ:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
อีกครั้ง แต่ใช้เส้นทางแบบเต็มไปยังสคริปต์:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
ตอนนี้เปลี่ยนไดเรกทอรี:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
และสุดท้ายใช้ลิงก์สัญลักษณ์เพื่อรันสคริปต์:
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- และลบออกได้โดยไม่ต้องแทนคำสั่งDIR="${DIR%x}"
-