ลองใช้ liners แบบง่าย ๆ ดังต่อไปนี้:
สำหรับ UNIX / OSX / Linux ทั้งหมด
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
ทุบตี
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
หมายเหตุ: ใช้เครื่องหมายขีดกลางสองตัว (-) ในคำสั่งเพื่อบ่งบอกถึงตัวเลือกการสิ้นสุดคำสั่งดังนั้นไฟล์ที่มีเครื่องหมายขีดคั่นหรืออักขระพิเศษอื่น ๆ จะไม่ทำให้คำสั่งหยุดทำงาน
หมายเหตุ: ในทุบตีใช้${BASH_SOURCE[0]}
ในความโปรดปรานของ$0
มิฉะนั้นเส้นทางที่สามารถทำลายเมื่อจัดหามัน ( source
/ .
)
สำหรับ Linux, Mac และ * BSD อื่น ๆ :
cd "$(dirname "$(realpath "$0")")";
หมายเหตุ: realpath
ควรติดตั้งในการกระจาย Linux ที่เป็นที่นิยมมากที่สุดโดยค่าเริ่มต้น (เช่น Ubuntu) แต่ในบางตัวอาจหายไปดังนั้นคุณต้องติดตั้ง
หมายเหตุ: หากคุณกำลังใช้ทุบตีใช้${BASH_SOURCE[0]}
ในความโปรดปรานของ$0
มิฉะนั้นเส้นทางที่สามารถทำลายเมื่อจัดหามัน ( source
/ .
)
มิฉะนั้นคุณสามารถลองสิ่งนั้น (จะใช้เครื่องมือที่มีอยู่ก่อน):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
สำหรับ Linux โดยเฉพาะ:
cd "$(dirname "$(readlink -f "$0")")"
ใช้ GNU readlink บน * BSD / Mac:
cd "$(dirname "$(greadlink -f "$0")")"
หมายเหตุ: คุณต้องcoreutils
ติดตั้ง (เช่น 1. ติดตั้งHomebrew , 2. brew install coreutils
)
ในทุบตี
ใน bash คุณสามารถใช้การขยายพารามิเตอร์เพื่อให้บรรลุเช่น:
cd "${0%/*}"
แต่จะไม่ทำงานหากสคริปต์ถูกเรียกใช้จากไดเรกทอรีเดียวกัน
หรือคุณสามารถกำหนดฟังก์ชั่นต่อไปนี้ใน bash:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
ฟังก์ชั่นนี้ใช้เวลา 1 ข้อโต้แย้ง หากอาร์กิวเมนต์มีเส้นทางที่แน่นอนอยู่แล้วให้พิมพ์ตามที่เป็นอยู่มิฉะนั้นพิมพ์$PWD
ตัวแปร + อาร์กิวเมนต์ชื่อไฟล์ (โดยไม่มี./
คำนำหน้า)
หรือนี่คือรุ่นที่นำมาจาก.bashrc
ไฟล์Debian :
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
ที่เกี่ยวข้อง:
ดูสิ่งนี้ด้วย:
ฉันจะดูพฤติกรรมของ readlink ของ GNU บน Mac ได้อย่างไร