bash script source: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว


9

ฉันมีสคริปต์ที่เริ่มต้นเช่นนี้

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

แต่เมื่อฉันเรียกใช้มันกลับมา line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

แต่มีไฟล์อยู่และเมื่อฉันรันsource ~/myProjects/valkyrie/cluster.confมันก็ทำงานได้ดี ความคิดใด ๆ ฉันตั้งค่าVALKYRIEตัวแปรไว้ที่อื่นดังนั้นรหัสยากในเส้นทางไม่ใช่ตัวเลือก


ฉันไม่แน่ใจ 100% ว่าสิ่งนี้จะช่วยได้หรือไม่ แต่คุณสามารถลองอ้างอิงตัวแปรได้อย่างเต็มที่ในกรณีที่มีช่องว่างใน ~ ดังนั้น, source "${VALKYRIE}/cluster.conf".
Sparhawk

ไม่ช่วยไม่ได้
Khoi

1
ฉันคิดว่ามันเป็นเรื่องเกี่ยวกับ~การขยายตัวไม่ถูกต้อง เมื่อฉันเรียกใช้สคริปต์ของคุณด้วยเส้นทางปลอมโดยเจตนาข้อผิดพลาดจะไม่พูด~แต่จะขยายเส้นทาง คุณสามารถลองแทนที่~สคริปต์ของคุณด้วยเส้นทางที่แน่นอนได้หรือไม่? echo ~ยังพยายามทำงานต่อไปในสคริปต์
Sparhawk

2
คุณสามารถลอง$HOMEแทน~ได้
Sparhawk

3
@ Khoi นั่นอธิบายได้ ~/.pam_environmentไม่ได้เป็นสคริปต์เปลือกจึงไม่ได้ทำสิ่งที่พบที่คุณคาดหวังจากเปลือกเช่นการขยายตัวหนอนและการขยายตัวพารามิเตอร์ดังนั้นค่า~มิได้$HOMEจะถูกแทนที่ หากคุณย้ายบรรทัดนั้นไปที่~/.profileแทนและเพิ่มexport ไว้ด้านหน้ามันควรจะทำงานได้
geirha

คำตอบ:


8

~ดูเหมือนจะไม่ขยายอย่างเหมาะสม เมื่อฉันเรียกใช้สคริปต์ของคุณด้วยเส้นทางปลอมโดยเจตนาข้อผิดพลาดจะไม่พูด~แต่จะขยายเส้นทาง (เช่น/home/sparhawk/fakepathไม่ใช่~/fakepathคุณสามารถลองใช้$HOMEแทน~หรือใช้เส้นทางแบบเต็มในสคริปต์แทนได้

(ฉันไม่แน่ใจว่าทำไม~ระบบของคุณไม่ทำงานเนื่องจากสคริปต์ของคุณทำงานได้ดีสำหรับฉัน)


เมื่อคุณดูคำสั่งที่ bash ดำเนินการขยาย ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ) คุณจะเห็นว่าการขยายตัวหนอนเกิดขึ้นก่อนการขยายตัวของตัวแปร นั่นเป็นเหตุผลที่$HOMEดีกว่า~ในตัวแปร
เกล็นแจ็คแมน

@glennjackman ฉันไม่แน่ใจว่าฉันเข้าใจ เรื่องสำคัญสำหรับตัวแปรกับจะทำไม~?
Sparhawk

1
มันไม่ได้เป็น "ลำดับความสำคัญ" มันเป็นสิ่งที่มาก่อน พิจารณาx="~/.bashrc"; ls $x- ตามลำดับการขยายคำสั่ง "ls" bash จะค้นหาเครื่องหมายตัวหนอนและไม่พบสิ่งใด ในที่สุดก็ทุบตีเห็นตัวแปรและขยายมัน ทุบตีไม่ได้กลับไปหาตัวหนอนอีกครั้ง ณ จุดนี้มันเป็นเพียงตัวละครธรรมดา และไม่มีไฟล์ในไดเรกทอรีปัจจุบันที่เริ่มต้นด้วยเครื่องหมายตัวหนอน
เกล็นแจ็คแมน

อ่าโอเค. ฉันคิดว่าฉันได้รับมัน ฉันสงสัยอยู่เสมอว่าทำไมคำสั่งนั้นจึงล้มเหลวและx=~/".bashrc"; ls $xทำงานได้ ขอบคุณสำหรับข้อมูล.
Sparhawk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.