Score:1

เหตุใดโค้ด Java จึงทำงานได้ดีด้วยตนเอง แต่ไม่ใช่จากเชลล์สคริปต์

ธง no

สวัสดี มีปัญหาน่าหงุดหงิด: บนเครื่อง 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 ไฟล์ตามพาธสัมพัทธ์ ไม่ใช่พาธสัมบูรณ์...? แต่ถ้าเป็นกรณีนี้ เหตุใดรหัสจึงทำงานเมื่อเรียกใช้ด้วยตนเอง

ฉันรู้ว่านี่เป็นคำถามปลายเปิด แต่มีอะไรอีกบ้างที่อาจแตกต่างระหว่างสคริปต์และการเรียกใช้โค้ดนี้ในเวอร์ชันที่เริ่มต้นโดยมนุษย์ ฉันต้องขาดอะไรไปแน่ๆ...

guiverc avatar
cn flag
Ubuntu 22.04 ยังไม่มีอยู่; ขณะนี้เป็น *การพัฒนา* ปล่อย Ubuntu *jammy* และยังคงอยู่จนกว่าจะถึงสถานะ RC ซึ่งคาดว่าจะไม่เกิดขึ้นจนกว่าจะถึงวันที่ 14 เมษายน 2022 และไม่อยู่ในหัวข้อนี้จนกว่าจะวางจำหน่ายในวันที่ 21 เมษายน 2022 https://discourse .ubuntu.com/t/jammy-jellyfish-release-schedule/23906 โปรดดู https://askubuntu.com/help/on-topic สำหรับปัญหาการสนับสนุนกับ Ubuntu *jammy* คุณจะต้องใช้ไซต์ #ubuntu-next หรือ #ubuntu+1 (IRC, UF ฯลฯ)
guiverc avatar
cn flag
หากคุณต้องการรายงานจุดบกพร่อง ก่อนอื่นขอขอบคุณที่ช่วยทดสอบรุ่น แต่โปรดดู https://help.ubuntu.com/community/ReportingBugs และใช้ไซต์ #ubuntu+1 เช่น IRC, https://ubuntuforums org/ ฯลฯ *ไซต์นี้ไม่ถูกติดตามสำหรับปัญหา ubuntu+1 หรือ #ubuntu-next* อย่าลืม *jammy* ยังอยู่ใน *alpha*
Pete avatar
no flag
@guiverc ขอบคุณ Guiverc! คุณคิดว่านี่อาจเป็นข้อผิดพลาดหรือไม่? >อึก
guiverc avatar
cn flag
ฉันไม่รู้; ฉันเพิ่งสแกนข้อความของคุณเมื่อเห็นว่าไม่ตรงประเด็น อย่างไรก็ตามปัญหาเกี่ยวกับ Ubuntu-next (Ubuntu+1) นั้นเสร็จสิ้นในบางไซต์ ซึ่งอนุญาตให้ทดสอบปัญหาเพื่อยืนยัน ข้อบกพร่องที่ยื่นมาเพื่อให้สามารถแก้ไขได้ - นี่ไม่ใช่ไซต์ Ubuntu+1/Ubuntu-Next ไซต์นี้สนับสนุนเฉพาะผลิตภัณฑ์ *มาตรฐาน* เช่น เผยแพร่และไม่ใช่ ESM/EOL หรือ *การพัฒนา*
hr flag
ความเป็นไปได้ * อย่างหนึ่ง* คือ `mvn` นั้นถูกตั้งชื่อแทนบางสิ่งในเชลล์แบบโต้ตอบของคุณ (โดยค่าเริ่มต้น นามแฝงจะไม่ถูกขยายภายในสคริปต์)
fuzzy drawings avatar
tj flag
ตรวจสอบผลลัพธ์ของ `find "$HOME" -type f -name 'log4j2.xml'` เพื่อดูว่าเส้นทางของคุณถูกต้องหรือไม่
Score:2
ธง tj

ฉันคิดว่าอาจมีปัญหากับเส้นทางที่คุณอยู่ ซีดีในสคริปต์

ดูที่พรอมต์คำสั่งของคุณเมื่อ การทดสอบเอ็มวีเอ็น ทำงาน:

ฉัน @ UbuntuV2:~/home/me/path/to/Java/Code$ การทดสอบ mvn

การนำ ~ บ่งชี้ $บ้าน นำหน้าเส้นทางที่แสดง ซึ่งหมายความว่าเส้นทางแบบเต็มเป็นจริง /home/me/home/me/path/to/Java/Code. นี่ไม่ใช่สถานที่เดียวกับ /home/me/path/to/Java/Code ในสคริปต์ของคุณ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา