Puncte:1

Scriptul Bash nu funcționează în Ubuntu în Windows 10

drapel ke

Este Ubuntu diferit de Linux pe un Mac? Îmi pare rău dacă aceasta este o întrebare de bază... Sunt nou în acest sens. Încerc să rulez un script bash care creează un script .sh din unele fișiere FASTQ. Acest lucru funcționează în terminalul unui Mac OS. Încerc să-l rulez pe laptopul meu Windows și ignoră evadarea mea de #s și afirmă doar că mai multe comenzi nu sunt găsite. Am incercat sa folosesc dos2unix și verificat de două ori cu pisică -Un fișier.sh dar nu a ajutat.

Codul pe care încerc să-l rulez preia toate fișierele fastq dintr-un folder și creează un fișier .sh pentru trimiterile de joburi SLURM folosind numele fișierului (necesar pentru clusterul de computere al universității mele și trebuie să fac peste 100 de scripturi de job). Deci versiunea Mac OS este următoarea:

pentru FILE în *fastq; #schimbați tipul fișierului când este necesar (de exemplu, fasta, fastq, fastq.gz)
face eco -e \
\#\!/bin/bash \
\n\#SBATCH --partition=nonpre \# Partiție \(coada de joburi\) \
\n\#SBATCH --requeue \# Returnează jobul în coadă dacă este preemptat \
\n\#SBATCH --job-name=samples \# Atribuiți un nume scurt jobului dvs. \
\n\#SBATCH --nodes=1 \# Numărul de noduri de care aveți nevoie \
\n\#SBATCH --ntasks=1 \# Total \# de sarcini pe toate nodurile \
\n\#SBATCH --cpus-per-task=64 \# Cores per task \(\>1 dacă sarcini multithread\) \
\n\#SBATCH --mem=180000 \# Memorie reală \(RAM\) necesară \(MB\) \
\n\#SBATCH --time=72:00:00 \# Limită de timp totală de rulare \(HH:MM:SS\) \
\n\#SBATCH --output=slurm.%N.${FILE}.out \# fișier de ieșire STDOUT \
\n\#SBATCH --error=slurm.%N.${FILE}.err \# Fișier de ieșire STDERR \(opțional\) \
\n \
\n\#ADĂUGAȚI Orice COD DORIȚI AICI CA PRESENTAREA DVS. DE LUCRARE SLURM \
\n \
\nsacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j \$SLURM_JOBID \#acest lucru va primi statistici de rulare a jobului de la SLURM\; utilizați-le pentru a ajuta la desemnarea memoriei trimiterilor viitoare \
> ${FILE}.sh; 
Terminat

Când rulez asta pe Windows, primesc:

Slurm_Generator.sh: linia 13: #!/bin/bash: Nu există un astfel de fișier sau director
Slurm_Generator.sh: linia 14: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 16: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 18: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 20: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 22: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 24: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 26: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 28: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 30: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 32: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 35: \n: comanda nu a fost găsită
Slurm_Generator.sh: linia 36: \n#ADD: comanda nu a fost găsită
Slurm_Generator.sh: linia 39: \n: comanda nu a fost găsită
Slurm_Generator.sh: linia 40: \nsacct: comanda nu a fost găsită

Orice ajutor ar fi apreciat și câteva explicații despre care este diferența dintre Ubuntu pe Windows și Terminalul pe Mac. Am încercat să cercetez acest lucru, dar continui să găsesc codul sugerat fără nicio explicație sau nu este problema mea în mod special. Mulțumesc!

Edit: Am încercat să alerg chmod +x script.sh și voi primi erorile de mai sus. Am greșit „echo”? Chiar și alergare: 'pentru FILE în *fastq; do ecou -e Buna ziua; Terminat' spune Comanda „bună ziua” nu a fost găsită

Editare: rularea „bash file.sh” produce următoarele: fișier bash.sh produce următoarele (pentru fiecare dintre cele 5 fișiere .fastq din directorul meu):

Slurm_Generator.sh: linia 8: #!/bin/bash: Nu există un astfel de fișier sau director
Slurm_Generator.sh: linia 9: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 11: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 13: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 15: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 17: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 19: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 21: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 23: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 25: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 27: \n#SBATCH: comanda nu a fost găsită
Slurm_Generator.sh: linia 30: \n: comanda nu a fost găsită
Slurm_Generator.sh: linia 31: \n#ADD: comanda nu a fost găsită
Slurm_Generator.sh: linia 34: \n: comanda nu a fost găsită
Slurm_Generator.sh: linia 35: \nsacct: comanda nu a fost găsită

Dacă fug pisică -Un fișier.sh văd o $ la sfârșitul fiecărei rânduri. Chiar dacă scap de acestea, obțin același rezultat ca mai sus. Alergare ls -al script.sh dat: -rwxrwxrwx 1 cerberus cerberus 1209 16 iunie 00:17 Slurm_Generator.sh

Editați | ×: Mi-am schimbat scriptul în:

#! /bin/bash
pentru FILE în *fastq; #schimbați tipul fișierului când este necesar (de exemplu, fasta, fastq, fastq.gz)
face eco -e \
"
#\!/bin/bash
#SBATCH --partition=nonpre # Partiție (coada de joburi)
#SBATCH --requeue # Returnează jobul în coadă dacă este preemptat
#SBATCH --job-name=samples # Atribuiți un nume scurt jobului dvs
#SBATCH --nodes=1 # Numărul de noduri de care aveți nevoie
#SBATCH --ntasks=1 # Nr. total de sarcini pe toate nodurile
#SBATCH --cpus-per-task=64 # nuclee per sarcină (>1 dacă sarcini multithread)
#SBATCH --mem=180000 # Memorie reală (RAM) necesară (MB)
#SBATCH --time=72:00:00 # Limită totală de timp de rulare (HH:MM:SS)
#SBATCH --output=slurm.%N.${FILE}.out # fișier de ieșire STDOUT
#SBATCH --error=slurm.%N.${FILE}.err # fișier de ieșire STDERR (opțional)

#ADĂUGAȚI Orice COD DORIȚI AICI CA PRESENTAREA DVS. DE LUCRARE SLURM \

sacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j \$SLURM_JOBID \#acest lucru va primi statistici de rulare a jobului de la SLURM\; folosiți-le pentru a ajuta la desemnarea memoriei viitoarei subm$" \
> ${FILE}.sh;
Terminat

Noua mea ieșire este următoarea (care este mult mai bună):

#\!/bin/bash
#SBATCH --partition=nonpre # Partiție (coada de joburi)
#SBATCH --requeue # Returnează jobul în coadă dacă este preemptat
#SBATCH --job-name=samples # Atribuiți un nume scurt jobului dvs
#SBATCH --nodes=1 # Numărul de noduri de care aveți nevoie
#SBATCH --ntasks=1 # Nr. total de sarcini pe toate nodurile
#SBATCH --cpus-per-task=64 # nuclee per sarcină (>1 dacă sarcini multithread)
#SBATCH --mem=180000 # Memorie reală (RAM) necesară (MB)
#SBATCH --time=72:00:00 # Limită totală de timp de rulare (HH:MM:SS)
#SBATCH --output=slurm.%N.Sample1.fastq.out # fișier de ieșire STDOUT
#SBATCH --error=slurm.%N.Sample1.fastq.er # fișier de ieșire STDERR (opțional)


#ADĂUGAȚI Orice COD DORIȚI AICI CA PREZENTAREA DVS. DE SLURM

sacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j $SLURM_JOBID \#acest lucru va primi statistici de rulare a jobului de la SLURM\; utilizați-le pentru a ajuta la desemnarea memoriei trimiterilor viitoare

Singura problemă cu care mă confrunt este că, în timp ce imprimă acest lucru pentru fiecare fișier .fastq, ceea ce vreau, fișierele .sh rezultate pe care le scrie sunt goale. Deci nu este recunoașterea > ${Fișier}.sh parte a scenariului.

Vă mulțumesc tuturor!

Karlom avatar
drapel de
Poate că `/bin/bash` nu se află în calea terminalului Ubuntu. Puteți verifica acest lucru prin comanda `env`. Încercați să adăugați `#! /bin/bash` până la începutul scriptului. Salvați-l și executați din nou.
waltinator avatar
drapel it
Lipiți întotdeauna scriptul în `https://shellcheck.net`, un verificator de sintaxă sau instalați `shellcheck` local. Utilizarea „shellcheck” este parte a procesului de dezvoltare.
Justin avatar
drapel ke
@Karlom Din păcate, asta nu a funcționat. Am încercat `#! /bin/bash` precum și `#! /bin/sh` și pot apela `bash` din calea mea.
Karlom avatar
drapel de
Cum încerci să rulezi scriptul? Ce eroare primesti? Poate că nu aveți permisiunea de a executa acel fișier anume? încercați `chmod +x file.sh` și dacă a fost bine, atunci rulați `bash file.sh` și dacă tot primiți o eroare, postați-o la întrebarea dvs.
Justin avatar
drapel ke
@Karlom Am încercat, dar a dat același rezultat. Am echo greșit? Există o sintaxă diferită în Ubuntu pentru Windows în comparație cu un Mac? Am încercat să-l folosesc repetând textul cu și fără ghilimele, dar se gândește doar că orice vine după `echo` este o comandă în loc de text.
Karlom avatar
drapel de
@Justin, Ubuntu ca mașină virtuală pe Windows nu este diferită de Ubuntu independent. Pentru a vedea ce este greșit, în terminalul shell Ubuntu, mergeți la directorul în care se află `file.sh`, apoi rulați `bash file.sh` și copiați aici eroarea pe care o primiți. De asemenea, este de ajutor dacă postați rezultatul `ls -al file.sh` în timp ce vă aflați în terminal în calea unde se află fișierul.sh.
Justin avatar
drapel ke
@Karlom Tocmai am postat rezultatele tuturor acestor lucruri; imi cer scuze daca ar fi trebuit sa le dau vreuna din aceste informatii!
Karlom avatar
drapel de
Scrpit spune `SBATCH: comanda nu a fost găsită`. Deci, se pare că încercați să rulați un script Windows pe Linux și nu poate găsi acea comandă. Vă rugăm să rețineți că rularea `dos2unix` nu face automat executabil scriptul Windows în Linux.
Justin avatar
drapel ke
Da, dar SBATCH ar trebui comentat, nu-i așa? folosind `echo -e` ar face astfel încât `\n` și `\#` să facă linii noi și, respectiv, să fie comentate, nu? Sau este greșită sintaxa mea? Funcționează bine când fac asta într-un terminal Mac. Pur și simplu nu îmi pot da seama unde este greșit scenariul meu.
Nate T avatar
drapel it
@Karlom Puteți verifica și cu „care bash”. În ubuntu, wsl sau nu, acest lucru ar trebui să fie suficient, aș crede.
Puncte:1
drapel cn

Folosiți heredoc în schimb:

pentru FILE în *fastq; #schimbați tipul fișierului când este necesar (de ex., fasta, fastq, fastq.gz)
do

cat <<-EOF > ${FIȘIER}.sh
#!/bin/bash

#SBATCH --partition=nonpre # Partiție (coada de joburi)
#SBATCH --requeue # Returnează jobul în coadă dacă este preemptat
#SBATCH --job-name=samples # Atribuiți un nume scurt jobului dvs
#SBATCH --nodes=1 # Numărul de noduri de care aveți nevoie
#SBATCH --ntasks=1 # Nr. total de sarcini pe toate nodurile
#SBATCH --cpus-per-task=64 # nuclee per sarcină (>1 dacă sarcini multithread)
#SBATCH --mem=180000 # Memorie reală (RAM) necesară (MB)
#SBATCH --time=72:00:00 # Limită totală de timp de rulare (HH:MM:SS)
#SBATCH --output=slurm.%N.${FILE}.out # fișier de ieșire STDOUT
#SBATCH --error=slurm.%N.${FILE}.err # fișier de ieșire STDERR (opțional)

#ADĂUGAȚI Orice COD DORIȚI AICI CA PREZENTAREA DVS. DE SLURM

nsacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j \$SLURM_JOBID #acest lucru va primi statistici de rulare a jobului de la SLURM; utilizați-le pentru a ajuta la desemnarea memoriei trimiterilor viitoare
EOF

Terminat
Puncte:0
drapel ke

Mi-am dat seama că trebuie să adaug un \ inainte de > ${Fișier}.sh. Deci raspunsul este:

#! /bin/bash
pentru FILE în *fastq; #schimbați tipul fișierului când este necesar (de exemplu, fasta, fastq, fastq.gz)
face eco -e \
"
#\!/bin/bash
#SBATCH --partition=nonpre # Partiție (coada de joburi)
#SBATCH --requeue # Returnează jobul în coadă dacă este preemptat
#SBATCH --job-name=samples # Atribuiți un nume scurt jobului dvs
#SBATCH --nodes=1 # Numărul de noduri de care aveți nevoie
#SBATCH --ntasks=1 # Nr. total de sarcini pe toate nodurile
#SBATCH --cpus-per-task=64 # nuclee per sarcină (>1 dacă sarcini multithread)
#SBATCH --mem=180000 # Memorie reală (RAM) necesară (MB)
#SBATCH --time=72:00:00 # Limită totală de timp de rulare (HH:MM:SS)
#SBATCH --output=slurm.%N.${FILE}.out # fișier de ieșire STDOUT
#SBATCH --error=slurm.%N.${FILE}.err # fișier de ieșire STDERR (opțional)

#ADĂUGAȚI Orice COD DORIȚI AICI CA PRESENTAREA DVS. DE LUCRARE SLURM \

sacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j \$SLURM_JOBID \#acest lucru va primi statistici de rulare a jobului de la SLURM\; folosiți-le pentru a ajuta la desemnarea memoriei viitoarei subm$" \
> ${FILE}.sh;
Terminat
NotTheDr01ds avatar
drapel vn
Mă bucur să aud că ai rezolvat. Vă rugăm să nu uitați să „Acceptați” răspunsul, astfel încât această întrebare să fie marcată ca rezolvată. Întrebările nerezolvate sunt eliminate automat luni sau ani mai târziu, în efortul de a încerca să solicite răspunsuri. Mulțumiri!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.