Проблема с запуском сценария .sh в удаленном месте

#python #linux #bash #shell

Вопрос:

У меня есть код на python, скажем так test.py. Мне нужно запустить его с помощью Slurm в удаленном месте. Вот почему я пытаюсь создать файл .sh.

В замазке я делаю это:

 touch main.sh
echo #!/bin/bash > main.sh
....
echo #SBATCH --gres=gpu:1 >> main.sh
....
echo python3 train.py >> main.sh
 

Затем я делаю его исполняемым с помощью

 chmod u x main.sh
 

И я пытаюсь запустить его с помощью

 bash main.sh
 

Но я получаю эту ошибку:

 sbatch: error: This does not look like a batch script.  The first
sbatch: error: line must start with #! followed by the path to an interpreter.
sbatch: error: For instance: #!/bin/sh
 

Как я пытаюсь проверить

 file main.sh
 

Я получаю

 main.sh: ASCII text
 

Я новичок в bash. Поэтому я не могу понять, в чем проблема. Кто-нибудь может помочь?

Комментарии:

1. # является маркером комментария оболочки, поэтому команда echo #!/bin/bash > main.sh обрабатывается как echo с комментарием #!/bin/bash > main.sh … и, конечно же, часть комментариев игнорируется. Поэтому вам нужно процитировать или избежать # . В зависимости от того, какую оболочку вы используете и в каком режиме она находится, ! также может быть специальный символ (даже в двойных кавычках!). Поэтому безопаснее всего просто заключать всю строку в одинарные кавычки.

2. @KhabbabZakaria: В зависимости от того, как вы настраиваете свой bash, echo #!/bin/bash при вызове в командной строке будет записываться #!/bin/bash в stdout, в то время как при вызове в сценарии (или по-другому настроенном) тот же оператор просто выведет символ новой строки. Google для интерактивных комментариев , чтобы получить больше информации по этой теме.

Ответ №1:

Единственная разница в том, что я использовал одинарные кавычки

 touch main.sh
echo '#!/bin/bash' > main.sh
echo '#SBATCH --gres=gpu:1' >> main.sh
echo 'python3 --version' >> main.sh

echo 'python3 /home/Desktop/train.py' >> main.sh
 

Если train.py находится в другом каталоге, вам нужно будет указать местоположение