Рейтинг:1

Сценарий Bash не работает в Ubuntu в Windows 10

флаг ke

Отличается ли Ubuntu от Linux на Mac? Извините, если это основной вопрос... Я новичок в этом. Я пытаюсь запустить сценарий bash, который создает сценарий .sh из некоторых файлов FASTQ. Это работает в терминале на Mac OS. Я пытаюсь запустить его на своем ноутбуке с Windows, и он игнорирует экранирование #s и просто заявляет, что несколько команд не найдены. я пытался использовать dos2unix и дважды проверил с кот -A файл.sh но это не помогло.

Код, который я пытаюсь запустить, берет все файлы fastq в папке и создает файл .sh для отправки заданий SLURM, используя их имя файла (необходим для компьютерного кластера моего университета, и мне нужно создать более 100 сценариев заданий). Итак, версия Mac OS выглядит следующим образом:

для ФАЙЛА в *fastq; # изменить тип файла при необходимости (например, fasta, fastq, fastq.gz)
сделать эхо -е \
\#\!/бин/баш \
\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 \# Реальная память \(ОЗУ\) требуется \(МБ\) \
\n\#SBATCH --time=72:00:00 \# Общее ограничение времени выполнения \(ЧЧ:ММ:СС\) \
\n\#SBATCH --output=slurm.%N.${FILE}.out \# Выходной файл STDOUT \
\n\#SBATCH --error=slurm.%N.${FILE}.err \# Выходной файл STDERR \(необязательно\) \
\n\
\n\#ДОБАВЬТЕ ЛЮБОЙ КОД, КОТОРЫЙ ВЫ ХОТИТЕ ЗДЕСЬ, В КАЧЕСТВЕ ЗАЯВКИ НА РАБОТУ SLURM \
\n\
\nsacct --format=JobID,JobName,NTasks,NNodes,NCPUS,MaxRSS,AveRSS,AveCPU,Elapsed,ExitCode -j \$SLURM_JOBID \#получит статистику выполнения задания из SLURM\; используйте их, чтобы обозначить память будущих представлений \
> ${ФАЙЛ}.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 и терминалом в Mac. Я пытался исследовать это, но я продолжаю находить предлагаемый код без объяснения причин или это не особенно моя проблема. Спасибо!

Изменить: я пытался запустить chmod +x script.sh и я получу вышеуказанные ошибки. Я неправильно запускаю «эхо»? Даже бег: 'для ФАЙЛА в *fastq; делать эхо -е Привет; сделано' говорит Команда «привет» не найдена

Редактировать: Запуск «bash file.sh» дает следующее: Баш-файл.sh дает следующее (для каждого из 5 файлов .fastq в моем каталоге):

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: команда не найдена

Если я побегу кот -A файл.sh я вижу $ в конце каждой строки. Даже если я избавлюсь от них, я получу тот же результат, что и выше. Бег ls -al script.sh дано: -rwxrwxrwx 1 цербер цербер 1209 16 июня 00:17 Slurm_Generator.sh

Редактировать: Я изменил свой сценарий на:

#! /бин/баш
для ФАЙЛА в *fastq; # изменить тип файла при необходимости (например, fasta, fastq, fastq.gz)
сделать эхо -е \
"
#\!/бин/баш
#SBATCH --partition=nonpre # Раздел (очередь заданий)
#SBATCH --requeue # Вернуть задание в очередь, если оно было вытеснено
#SBATCH --job-name=samples # Назначьте короткое имя вашей работе
#SBATCH --nodes=1 # Необходимое количество узлов
#SBATCH --ntasks=1 # Всего # задач на всех узлах
#SBATCH --cpus-per-task=64 # Количество ядер на задачу (>1 для многопоточных задач)
#SBATCH --mem=180000 # Требуемая реальная память (ОЗУ) (МБ)
#SBATCH --time=72:00:00 # Общее ограничение времени выполнения (ЧЧ:ММ:СС)
#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$" \
> ${ФАЙЛ}.sh;
сделано

Мой новый вывод выглядит следующим образом (что намного лучше):

#\!/бин/баш
#SBATCH --partition=nonpre # Раздел (очередь заданий)
#SBATCH --requeue # Вернуть задание в очередь, если оно было вытеснено
#SBATCH --job-name=samples # Назначьте короткое имя вашей работе
#SBATCH --nodes=1 # Необходимое количество узлов
#SBATCH --ntasks=1 # Всего # задач на всех узлах
#SBATCH --cpus-per-task=64 # Количество ядер на задачу (>1 для многопоточных задач)
#SBATCH --mem=180000 # Требуемая реальная память (ОЗУ) (МБ)
#SBATCH --time=72:00:00 # Общее ограничение времени выполнения (ЧЧ:ММ:СС)
#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
Возможно, `/bin/bash` не указан в вашем пути к терминалу Ubuntu. Вы можете проверить это с помощью команды `env`. Попробуйте добавить `#! /bin/bash` в самое начало скрипта. Сохраните его и выполните снова.
waltinator avatar
флаг it
Всегда вставляйте свой скрипт в `https://shellcheck.net`, средство проверки синтаксиса или устанавливайте `shellcheck` локально. Сделайте использование `shellcheck` частью вашего процесса разработки.
Justin avatar
флаг ke
@Karlom К сожалению, это не сработало. Я пробовал `#! /bin/bash`, а также `#! /bin/sh`, и я могу вызывать `bash` со своего пути.
Karlom avatar
флаг de
Как вы пытаетесь запустить скрипт? Какая у вас ошибка? Возможно, у вас нет разрешения на выполнение этого конкретного файла? попробуйте `chmod +x file.sh`, и если все в порядке, запустите `bash file.sh`, и если вы все еще получаете сообщение об ошибке, отправьте это на свой вопрос.
Justin avatar
флаг ke
@Karlom Я пытался, но результат тот же. Я неправильно запускаю эхо? Есть ли другой синтаксис в Ubuntu для Windows по сравнению с Mac? Я пытался использовать его, повторяя текст с кавычками и без них, но он просто думает, что все, что идет после `echo`, является командой, а не текстом.
Karlom avatar
флаг de
@Justin, Ubuntu как виртуальная машина в Windows ничем не отличается от автономной Ubuntu. Чтобы увидеть, что не так, в терминале оболочки Ubuntu перейдите в каталог, в котором находится «file.sh», затем запустите «bash file.sh» и скопируйте сюда полученную ошибку. Также полезно, если вы опубликуете вывод `ls -al file.sh`, пока вы находитесь в терминале, по пути, где находится file.sh.
Justin avatar
флаг ke
@Karlom Я только что опубликовал результаты всего этого; извините, если это информация, которую я должен был уже дать!
Karlom avatar
флаг de
Скрипт говорит "SBATCH: команда не найдена". Итак, очевидно, вы пытаетесь запустить сценарий Windows в Linux, и он не может найти эту команду. Обратите внимание, что запуск `dos2unix` не делает ваш сценарий Windows автоматически исполняемым в Linux.
Justin avatar
флаг ke
Да, но SBATCH нужно закомментировать, не так ли? использование `echo -e` приведет к тому, что `\n` и `\#` создадут новые строки и будут закомментированы соответственно, верно? Или мой синтаксис неверен? Он отлично работает, когда я делаю это в терминале Mac. Я просто не могу понять, где мой сценарий неверен.
Nate T avatar
флаг it
@Karlom Вы также можете проверить «какой bash». Я думаю, в Ubuntu, wsl или нет, этого должно быть достаточно.
Рейтинг:1
флаг cn

Вместо этого используйте heredoc:

для ФАЙЛА в *fastq; # изменить тип файла при необходимости (например, fasta, fastq, fastq.gz)
делать

кошка <<-EOF > ${ФАЙЛ}.sh
#!/бин/баш

#SBATCH --partition=nonpre # Раздел (очередь заданий)
#SBATCH --requeue # Вернуть задание в очередь, если оно было вытеснено
#SBATCH --job-name=samples # Назначьте короткое имя вашей работе
#SBATCH --nodes=1 # Необходимое количество узлов
#SBATCH --ntasks=1 # Всего # задач на всех узлах
#SBATCH --cpus-per-task=64 # Количество ядер на задачу (>1 для многопоточных задач)
#SBATCH --mem=180000 # Требуемая реальная память (ОЗУ) (МБ)
#SBATCH --time=72:00:00 # Общее ограничение времени выполнения (ЧЧ:ММ:СС)
#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; используйте их, чтобы обозначить память будущих представлений
EOF

сделано
Рейтинг:0
флаг ke

Я понял, что мне нужно добавить \ перед > ${Файл}.sh. Итак, ответ:

#! /бин/баш
для ФАЙЛА в *fastq; # изменить тип файла при необходимости (например, fasta, fastq, fastq.gz)
сделать эхо -е \
"
#\!/бин/баш
#SBATCH --partition=nonpre # Раздел (очередь заданий)
#SBATCH --requeue # Вернуть задание в очередь, если оно было вытеснено
#SBATCH --job-name=samples # Назначьте короткое имя вашей работе
#SBATCH --nodes=1 # Необходимое количество узлов
#SBATCH --ntasks=1 # Всего # задач на всех узлах
#SBATCH --cpus-per-task=64 # Количество ядер на задачу (>1 для многопоточных задач)
#SBATCH --mem=180000 # Требуемая реальная память (ОЗУ) (МБ)
#SBATCH --time=72:00:00 # Общее ограничение времени выполнения (ЧЧ:ММ:СС)
#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$" \
> ${ФАЙЛ}.sh;
сделано
NotTheDr01ds avatar
флаг vn
Приятно слышать, что вы решили эту проблему. Пожалуйста, не забудьте «Принять» ваш ответ, чтобы этот вопрос был помечен как решенный. Через месяцы или годы спустя на нерешенные вопросы автоматически натыкаются, чтобы попытаться получить ответы. Спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.