สวัสดี มีปัญหาน่าหงุดหงิด: บนเครื่อง Ubuntu 22.04 ของฉัน ฉันมีโค้ด Java/Maven ที่สามารถรันได้ด้วยตนเองจากบรรทัดคำสั่ง:
ฉัน@UbuntuV2:~/home/me/path/to/Java/Code$
me@UbuntuV2:~/home/me/path/to/Java/Code$ การทดสอบ mvn
[INFO] กำลังสแกนหาโครงการ...
[ข้อมูล]
[ข้อมูล] -------------------< MyCode.java >------------
...รหัสทำงานได้ดี...
ดีมาก แต่ฉันต้องเรียกใช้โค้ดเดียวกันนี้จากเชลล์สคริปต์:
#!/bin/bash
echo "เรียกใช้สคริปต์!"
ซีดี /home/me/path/to/Java/Code
การทดสอบเอ็มวีเอ็น
echo "สคริปต์เสร็จสิ้น"
สิ่งที่แปลกคือสคริปต์สามารถเรียกใช้โค้ด Java ได้ แต่โค้ดที่เรียกใช้สคริปต์มีข้อยกเว้น:
ฉัน@UbuntuV2:~/home/me$
me@UbuntuV2:~/home/me$ ./runScript.sh
เรียกใช้สคริปต์!
[INFO] กำลังสแกนหาโครงการ...
[ข้อมูล]
[ข้อมูล] -------------------< MyCode.java >------------
2022-03-02 12:29:44,899 ข้อผิดพลาดหลัก ไม่สามารถเข้าถึงไฟล์:/home/me/path/to/Java/Code/src/test/resources/log4j2.xml java.io.FileNotFoundException: /home/me/ path/to/Java/Code/src/test/resources/log4j2.xml (ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว)
ที่ java.base/java.io.FileInputStream.open0 (Native Method)
ที่ java.base/java.io.FileInputStream.open(FileInputStream.java:219)
ที่ java.base/java.io.FileInputStream.(FileInputStream.java:157)
...ฯลฯ...
มันแปลกมากใช่มั้ย? เมื่อรันผ่านเชลล์สคริปต์ โค้ด Java ไม่สามารถเข้าถึงไฟล์ "log4j2.xml" ได้ในทันที ("ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว") แต่มีไฟล์อยู่ในนั้น และรหัสก็ไม่มีปัญหาในการเปิดเมื่อฉันเรียกใช้รหัสด้วยตนเอง
เมื่อฉันเรียกใช้โค้ดด้วยตนเองจะแตกต่างกันอย่างไร ฉันใช้สมองของฉันพยายามคิดว่าอะไรจะแตกต่างไปจากนี้ ฉันได้ทำสิ่งต่อไปนี้ทั้งหมดแล้ว:
- ยืนยันผู้ใช้รายนั้น
ฉัน
รันโค้ดด้วยตนเองจาก bash shell เช่นเดียวกับสคริปต์
- เรียกใช้สคริปต์ในฐานะผู้ใช้
ฉัน
ผู้ใช้คนเดียวกับที่สามารถรันโค้ดได้ด้วยตนเอง
- ตรวจสอบว่าสคริปต์ทำงานเป็น
ฉัน
โดยการเพิ่มก ฉันเป็นใคร
คำสั่งในสคริปต์เพื่อตรวจสอบ
- ใช้
รหัสผ่าน
คำสั่งเพื่อตรวจสอบว่าสคริปต์รันโค้ดจากไดเร็กทอรีที่ถูกต้อง
- ตั้งค่าตัวแปร PATH ของสคริปต์ให้เป็น Path เดียวกันกับผู้ใช้
ฉัน
โดยใช้คำสั่ง ส่งออก PATH=$PATH:/usr/local/sbin:...
ในสคริปต์
- ใช้คำสั่ง visudo เพื่อให้แน่ใจว่าผู้ใช้นั้น
ฉัน
เข้าถึงไฟล์ทั้งหมดบน Ubuntu ได้ไม่จำกัด
- ทำให้แน่ใจว่าผู้ใช้
ฉัน
เป็นเจ้าของสคริปต์และมีสิทธิ์ดำเนินการ
- ตะโกนและด่าทออูบุนตูเป็นอย่างมาก
มีปัญหาอะไรอีก ฉันไม่ได้เขียนโค้ด Java ดังนั้นตัวโค้ดอาจอ้างถึงสิ่งนี้ log4j2.xml
ไฟล์ตามพาธสัมพัทธ์ ไม่ใช่พาธสัมบูรณ์...? แต่ถ้าเป็นกรณีนี้ เหตุใดรหัสจึงทำงานเมื่อเรียกใช้ด้วยตนเอง
ฉันรู้ว่านี่เป็นคำถามปลายเปิด แต่มีอะไรอีกบ้างที่อาจแตกต่างระหว่างสคริปต์และการเรียกใช้โค้ดนี้ในเวอร์ชันที่เริ่มต้นโดยมนุษย์ ฉันต้องขาดอะไรไปแน่ๆ...