Score:1

สคริปต์ Bash ไม่ทำงานใน Ubuntu ใน Windows 10

ธง ke

Ubuntu แตกต่างจาก Linux บน Mac หรือไม่ ขออภัยหากนี่เป็นคำถามพื้นฐาน...ฉันยังใหม่กับสิ่งนี้ ฉันกำลังพยายามเรียกใช้สคริปต์ทุบตีที่สร้างสคริปต์ .sh จากไฟล์ FASTQ บางไฟล์ ใช้งานได้ในเทอร์มินัลบน Mac OS ฉันกำลังพยายามรันบนแล็ปท็อป Windows ของฉัน และมันไม่สนใจการ Escape ของ #s และแจ้งว่าไม่พบคำสั่งหลายคำสั่ง ฉันได้ลองใช้ ดอส2ยูนิกซ์ และตรวจสอบซ้ำกับ cat -A file.sh แต่มันไม่ได้ช่วย

โค้ดที่ฉันพยายามรันใช้ไฟล์ fastq ทั้งหมดในโฟลเดอร์ และสร้างไฟล์ .sh สำหรับการส่งงาน SLURM โดยใช้ชื่อไฟล์ (จำเป็นสำหรับคลัสเตอร์คอมพิวเตอร์ของมหาวิทยาลัยของฉัน และฉันต้องสร้างสคริปต์งานมากกว่า 100 รายการ) ดังนั้นเวอร์ชันของ Mac OS จะเป็นดังนี้:

สำหรับ FILE ใน *fastq; #เปลี่ยนประเภทไฟล์เมื่อจำเป็น (เช่น fasta, fastq, fastq.gz)
ทำ echo -e \
\#\!/bin/ทุบตี \
\n\#SBATCH --partition=nonpre \# พาร์ติชั่น \(คิวงาน\) \
\n\#SBATCH --requeue \# กลับสู่คิวหากว่าง \
\n\#SBATCH --job-name=samples \# กำหนดชื่อย่อให้กับงานของคุณ \
\n\#SBATCH --nodes=1 \# จำนวนโหนดที่คุณต้องการ \
\n\#SBATCH --ntasks=1 \# รวม \# ของงานในทุกโหนด \
\n\#SBATCH --cpus-per-task=64 \# แกนต่องาน \(\>1 ถ้างานมัลติเธรด\) \
\n\#SBATCH --mem=180000 \# หน่วยความจำจริง \(RAM\) จำเป็น \(MB\) \
\n\#SBATCH --time=72:00:00 \# ขีดจำกัดเวลารันทั้งหมด \(HH:MM:SS\) \
\n\#SBATCH --output=slurm.%N.${FILE}.out \# ไฟล์เอาต์พุต STDOUT \
\n\#SBATCH --error=slurm.%N.${FILE}.err \# ไฟล์เอาต์พุต STDERR \(ทางเลือก\) \
\n \
\n\#เพิ่มรหัสใดก็ได้ที่คุณต้องการที่นี่เป็นการส่งงานแบบสลึมสลือ \
\n \
\nsacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j \$SLURM_JOBID \#นี่จะรับสถิติการเรียกใช้งานจาก SLURM\; ใช้สิ่งเหล่านี้เพื่อช่วยกำหนดความทรงจำของการส่งในอนาคต \
> ${FILE}.sh; 
เสร็จแล้ว

เมื่อรันสิ่งนี้บน Windows ฉันจะได้รับ:

Slurm_Generator.sh: บรรทัดที่ 13: #!/bin/bash: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
Slurm_Generator.sh: บรรทัดที่ 14: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 16: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 18: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 20: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 22: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 24: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 26: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 28: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 30: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 32: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 35: \n: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 36: \n#ADD: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 39: \n: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 40: \nsacct: ไม่พบคำสั่ง

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมและคำอธิบายเกี่ยวกับความแตกต่างระหว่าง Ubuntu บน Windows กับ Terminal บน Mac ฉันได้ลองค้นคว้าสิ่งนี้แล้ว แต่ฉันยังคงค้นหาโค้ดที่แนะนำโดยไม่มีคำอธิบายหรือไม่ใช่ปัญหาของฉันโดยเฉพาะ ขอขอบคุณ!

แก้ไข: ฉันพยายามวิ่ง chmod +x script.sh และฉันจะได้รับข้อผิดพลาดข้างต้น ฉันเรียกใช้ 'echo' ผิดหรือไม่ แม้จะวิ่ง: 'สำหรับไฟล์ใน *fastq; ทำ เสียงสะท้อน -e สวัสดี; เสร็จแล้ว' พูดว่า ไม่พบคำสั่ง 'สวัสดี'

แก้ไข: การรัน 'bash file.sh' ให้ผลลัพธ์ต่อไปนี้: ทุบตี file.sh ให้ผลต่อไปนี้ (สำหรับแต่ละไฟล์ .fastq 5 ไฟล์ในไดเรคทอยของฉัน):

Slurm_Generator.sh: บรรทัดที่ 8: #!/bin/bash: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว
Slurm_Generator.sh: บรรทัดที่ 9: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 11: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 13: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 15: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 17: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 19: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 21: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 23: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 25: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 27: \n#SBATCH: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 30: \n: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 31: \n#ADD: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 34: \n: ไม่พบคำสั่ง
Slurm_Generator.sh: บรรทัดที่ 35: \nsacct: ไม่พบคำสั่ง

ถ้าฉันวิ่ง cat -A file.sh ฉันเห็นก $ ในตอนท้ายของแต่ละบรรทัด แม้ว่าฉันจะกำจัดสิ่งเหล่านี้ออกไป ฉันก็ยังได้รับผลลัพธ์เช่นเดียวกับข้างต้น วิ่ง ls -al script.sh ให้: -rwxrwxrwx 1 cerberus cerberus 1209 16 มิ.ย. 00:17 Slurm_Generator.sh

แก้ไข: ฉันเปลี่ยนสคริปต์เป็น:

#! /ถัง/ทุบตี
สำหรับ FILE ใน *fastq; #เปลี่ยนประเภทไฟล์เมื่อจำเป็น (เช่น fasta, fastq, fastq.gz)
ทำ echo -e \
"
#\!/bin/bash
#SBATCH --partition=nonpre # พาร์ติชัน (คิวงาน)
#SBATCH --requeue # ส่งคืนงานไปยังคิวหากมีการจองไว้
#SBATCH --job-name=samples # กำหนดชื่อย่อให้กับงานของคุณ
#SBATCH --nodes=1 # จำนวนโหนดที่คุณต้องการ
#SBATCH --ntasks=1 # รวม # ของงานในทุกโหนด
#SBATCH --cpus-per-task=64 # Cores ต่องาน (>1 ถ้างานมัลติเธรด)
#SBATCH --mem=180000 # ต้องการหน่วยความจำจริง (RAM) (MB)
#SBATCH --time=72:00:00 # ขีดจำกัดเวลารันทั้งหมด (HH:MM:SS)
#SBATCH --output=slurm.%N.${FILE}.out # ไฟล์เอาต์พุต STDOUT
#SBATCH --error=slurm.%N.${FILE}.err # ไฟล์เอาต์พุต STDERR (ทางเลือก)

#เพิ่มรหัสใดก็ได้ที่คุณต้องการที่นี่เพื่อส่งงาน SLURM \

sacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j \$SLURM_JOBID \#นี่จะรับสถิติการเรียกใช้งานจาก SLURM\; ใช้สิ่งเหล่านี้เพื่อช่วยกำหนดหน่วยความจำของ subm$ ในอนาคต" \
> ${FILE}.sh;
เสร็จแล้ว

ผลลัพธ์ใหม่ของฉันมีดังต่อไปนี้ (ซึ่งดีกว่ามาก):

#\!/bin/bash
#SBATCH --partition=nonpre # พาร์ติชัน (คิวงาน)
#SBATCH --requeue # ส่งคืนงานไปยังคิวหากมีการจองไว้
#SBATCH --job-name=samples # กำหนดชื่อย่อให้กับงานของคุณ
#SBATCH --nodes=1 # จำนวนโหนดที่คุณต้องการ
#SBATCH --ntasks=1 # รวม # ของงานในทุกโหนด
#SBATCH --cpus-per-task=64 # Cores ต่องาน (>1 ถ้างานมัลติเธรด)
#SBATCH --mem=180000 # ต้องการหน่วยความจำจริง (RAM) (MB)
#SBATCH --time=72:00:00 # ขีดจำกัดเวลารันทั้งหมด (HH:MM:SS)
#SBATCH --output=slurm.%N.Sample1.fastq.out # ไฟล์เอาต์พุต STDOUT
#SBATCH --error=slurm.%N.Sample1.fastq.er # ไฟล์เอาต์พุต STDERR (ทางเลือก)


#เพิ่มรหัสใดก็ได้ที่คุณต้องการที่นี่เพื่อส่งงาน SLURM

sacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j $SLURM_JOBID \#สิ่งนี้จะได้รับสถิติการเรียกใช้งานจาก SLURM\; ใช้สิ่งเหล่านี้เพื่อช่วยกำหนดหน่วยความจำของการส่งในอนาคต

ปัญหาเดียวที่ฉันพบคือในขณะที่พิมพ์สิ่งนี้สำหรับไฟล์ .fastq แต่ละไฟล์ ซึ่งเป็นสิ่งที่ฉันต้องการ ผลลัพธ์ไฟล์ .sh ที่เขียนออกมาจะว่างเปล่า ดังนั้นจึงไม่รู้จัก > ${ไฟล์}.sh ส่วนหนึ่งของสคริปต์

ขอบคุณทุกคน!

Karlom avatar
de flag
บางที `/bin/bash` ไม่ได้อยู่ในเส้นทางเทอร์มินัล Ubuntu ของคุณ คุณสามารถตรวจสอบได้โดยคำสั่ง `env` ลองเพิ่ม `#! /bin/bash` ไปที่จุดเริ่มต้นของสคริปต์ บันทึกและดำเนินการอีกครั้ง
waltinator avatar
it flag
วางสคริปต์ของคุณใน `https://shellcheck.net` ซึ่งเป็นตัวตรวจสอบไวยากรณ์เสมอ หรือติดตั้ง `shellcheck` ในเครื่อง ใช้ 'shellcheck' เป็นส่วนหนึ่งของกระบวนการพัฒนาของคุณ
Justin avatar
ke flag
@Karlom น่าเสียดายที่ไม่ได้ผล ฉันพยายาม `#! /bin/bash` เช่นเดียวกับ `#! /bin/sh` และฉันสามารถเรียก `bash` จากเส้นทางของฉันได้
Karlom avatar
de flag
คุณพยายามเรียกใช้สคริปต์อย่างไร คุณได้รับข้อผิดพลาดอะไร บางทีคุณอาจไม่ได้รับอนุญาตให้เรียกใช้ไฟล์นั้น ลอง `chmod +x file.sh` และถ้าเป็นปกติให้เรียกใช้ `bash file.sh` และหากคุณยังพบข้อผิดพลาด ให้โพสต์คำถามนั้นลงในคำถามของคุณ
Justin avatar
ke flag
@Karlom ฉันลองแล้ว แต่ผลลัพธ์ก็เหมือนเดิม ฉันใช้เสียงสะท้อนผิดหรือไม่ มีไวยากรณ์ที่แตกต่างกันใน Ubuntu สำหรับ Windows เมื่อเทียบกับ Mac หรือไม่ ฉันได้ลองใช้มันโดยสะท้อนข้อความที่มีและไม่มีเครื่องหมายคำพูด แต่มันแค่คิดว่าอะไรก็ตามที่อยู่หลัง `echo` เป็นคำสั่งแทนข้อความ
Karlom avatar
de flag
@จัสติน อูบุนตูในฐานะเครื่องเสมือนบน Windows ไม่แตกต่างจากอูบุนตูแบบสแตนด์อะโลน หากต้องการดูว่ามีอะไรผิดปกติ ในเทอร์มินัลเชลล์ของ Ubuntu ให้ไปที่ไดเร็กทอรีซึ่งเป็นที่ตั้งของ `file.sh` จากนั้นเรียกใช้ `bash file.sh` และคัดลอกข้อผิดพลาดที่คุณได้รับที่นี่ นอกจากนี้ยังช่วยได้หากคุณโพสต์เอาต์พุตของ `ls -al file.sh` ในขณะที่คุณอยู่ในเทอร์มินัลในพาธที่มี file.sh อยู่
Justin avatar
ke flag
@Karlom ฉันเพิ่งโพสต์ผลลัพธ์ทั้งหมดนั้น ขออภัยหากนี่เป็นข้อมูลที่ฉันควรได้รับแล้ว!
Karlom avatar
de flag
สคริปต์ระบุว่า `SBATCH: ไม่พบคำสั่ง' เห็นได้ชัดว่าคุณกำลังพยายามเรียกใช้สคริปต์ Windows บน Linux และไม่พบคำสั่งนั้น โปรดทราบว่าการเรียกใช้ 'dos2unix' ไม่ได้ทำให้สคริปต์ Windows ของคุณทำงานโดยอัตโนมัติใน Linux
Justin avatar
ke flag
ใช่ แต่ SBATCH ควรแสดงความคิดเห็นใช่ไหม การใช้ `echo -e` จะทำให้ `\n` และ `\#` ขึ้นบรรทัดใหม่และแสดงความคิดเห็นตามลำดับ ใช่ไหม หรือไวยากรณ์ของฉันผิด? มันใช้งานได้ดีเมื่อฉันทำสิ่งนี้ใน Mac Terminal ฉันไม่สามารถเข้าใจได้ว่าสคริปต์ของฉันผิดตรงไหน
Nate T avatar
it flag
@Karlom คุณยังสามารถตรวจสอบได้ด้วย ` which bash ' ใน ubuntu, wsl หรือไม่ ฉันคิดว่าน่าจะเพียงพอแล้ว
Score:1
ธง cn

ใช้ heredoc แทน:

สำหรับ FILE ใน *fastq; #เปลี่ยนประเภทไฟล์เมื่อจำเป็น (เช่น fasta, fastq, fastq.gz)
ทำ

แมว <<-EOF > ${FILE}.sh
#!/bin/bash

#SBATCH --partition=nonpre # พาร์ติชัน (คิวงาน)
#SBATCH --requeue # ส่งคืนงานไปยังคิวหากมีการจองไว้
#SBATCH --job-name=samples # กำหนดชื่อย่อให้กับงานของคุณ
#SBATCH --nodes=1 # จำนวนโหนดที่คุณต้องการ
#SBATCH --ntasks=1 # รวม # ของงานในทุกโหนด
#SBATCH --cpus-per-task=64 # Cores ต่องาน (>1 ถ้างานมัลติเธรด)
#SBATCH --mem=180000 # ต้องการหน่วยความจำจริง (RAM) (MB)
#SBATCH --time=72:00:00 # ขีดจำกัดเวลารันทั้งหมด (HH:MM:SS)
#SBATCH --output=slurm.%N.${FILE}.out # ไฟล์เอาต์พุต STDOUT
#SBATCH --error=slurm.%N.${FILE}.err # ไฟล์เอาต์พุต STDERR (ทางเลือก)

#เพิ่มรหัสใดก็ได้ที่คุณต้องการที่นี่เพื่อส่งงาน SLURM

nsacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j \$SLURM_JOBID #สิ่งนี้จะได้รับสถิติการเรียกใช้งานจาก SLURM; ใช้สิ่งเหล่านี้เพื่อช่วยกำหนดหน่วยความจำของการส่งในอนาคต
อฟ

เสร็จแล้ว
Score:0
ธง ke

ฉันรู้ว่าฉันต้องเพิ่ม \ ก่อนที่ > ${ไฟล์}.sh. ดังนั้นคำตอบคือ:

#! /ถัง/ทุบตี
สำหรับ FILE ใน *fastq; #เปลี่ยนประเภทไฟล์เมื่อจำเป็น (เช่น fasta, fastq, fastq.gz)
ทำ echo -e \
"
#\!/bin/bash
#SBATCH --partition=nonpre # พาร์ติชัน (คิวงาน)
#SBATCH --requeue # ส่งคืนงานไปยังคิวหากมีการจองไว้
#SBATCH --job-name=samples # กำหนดชื่อย่อให้กับงานของคุณ
#SBATCH --nodes=1 # จำนวนโหนดที่คุณต้องการ
#SBATCH --ntasks=1 # รวม # ของงานในทุกโหนด
#SBATCH --cpus-per-task=64 # Cores ต่องาน (>1 ถ้างานมัลติเธรด)
#SBATCH --mem=180000 # ต้องการหน่วยความจำจริง (RAM) (MB)
#SBATCH --time=72:00:00 # ขีดจำกัดเวลารันทั้งหมด (HH:MM:SS)
#SBATCH --output=slurm.%N.${FILE}.out # ไฟล์เอาต์พุต STDOUT
#SBATCH --error=slurm.%N.${FILE}.err # ไฟล์เอาต์พุต STDERR (ทางเลือก)

#เพิ่มรหัสใดก็ได้ที่คุณต้องการที่นี่เพื่อส่งงาน SLURM \

sacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j \$SLURM_JOBID \#นี่จะรับสถิติการเรียกใช้งานจาก SLURM\; ใช้สิ่งเหล่านี้เพื่อช่วยกำหนดหน่วยความจำของ subm$ ในอนาคต" \
> ${FILE}.sh;
เสร็จแล้ว
NotTheDr01ds avatar
vn flag
ดีใจที่ได้ยินว่าคุณแก้ปัญหาได้แล้ว โปรดอย่าลืม "ยอมรับ" คำตอบของคุณ เพื่อให้คำถามนี้ได้รับการทำเครื่องหมายว่าแก้ไขแล้ว คำถามที่ไม่ได้รับคำตอบจะถูกกระแทกอัตโนมัติหลายเดือนหรือหลายปีให้หลังเพื่อพยายามหาคำตอบ ขอบคุณ!

โพสต์คำตอบ

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