Во-первых, поскольку об этом больше никто не упоминал, ошибка не имеет ничего общего с cat
. У вас будет такая же ошибка с любой программой, например nl
, od
, tr
или даже несуществующая -команда какdog
unicorn
tribble
1 .
Настоящим ответом будет то, что вы должны говорить <<-
вместо <<
. Как говорит другой ответ почти (, но не совсем ), проблема в том, что когда вы используете <<
, оболочка ищет слово-разделитель(KHIK
в вашем примере )быть единственной вещью в строке, которая завершает «здесь документ». Не может быть FOOKHIKBAR
, FOO KHIK BAR
, KHIK FU
, или даже TabKHIK
. При использовании <<-
оболочка удаляет все вкладки (с ). с начала каждой строки в этом документе, поэтому TabKHIK
выглядит просто KHIK
.
Но не менее важным вопросом является то, чтоесли вы скажете
cat<> run_nvt$i.pbs
#!/bin/bash
#PBS -l nodes=1:ppn=16
#PBS -l walltime=120:00:00
#PBS -N GROMACS:TAUAT_P
#PBS -q blaze
#PBS -j oe
#PBS -V
cd \$PBS_O_WORKDIR
export I_MPI_DEVICE=rdma
/home/apps/ics/impi/latest/bin64/mpiexec.hydra /home/braf/md/gromacs-4.5.6/bin/mdrun_mpi -deffnm conf_nvt$i
KHIK
то вы получите
#!/bin/bash #PBS -l nodes=1:ppn=16 #PBS -l walltime=120:00:00 #PBS -N GROMACS:TAUAT_P #PBS -q blaze #PBS -j oe #PBS -V cd $PBS_O_WORKDIR export I_MPI_DEVICE=rdma /home/apps/ics/impi/latest/bin64/mpiexec.hydra /home/braf/md/gromacs-4.5.6/bin/mdrun_mpi -deffnm conf_nvt{value of $i}
в run_nvt$i.pbs
. И это нехорошо. Чтобы "шебанг"(#!
строка )работала правильно, #!
должно быть первыми двумя символами в строке. Если вы последуете совету другого ответа, ваш скрипт run_nvt$i.pbs
будет иметь шебанг что не чтят / признают, и он может работать с /bin/sh
или какой-либо другой оболочкой (, отличной отbash
)— см. подробности в этом ответе . (Поскольку первый не -пустой символ в первой строке – это #
, строка будет рассматриваться как комментарий. Это важный и часто -упускаемый из виду аспект работы шебангов.)
Не имеет отношения к сути вашего вопроса — вы всегда должны цитировать ссылки на переменные оболочки (например, "$i"
и"$PBS_O_WORKDIR"
)если у вас нет веской причины не делать этого, и вы уверены, что знаете, что делаете; см. Почему мой сценарий оболочки задыхается от пробелов или другие специальные символы? и Влияние на безопасность из-за того, что вы забыли заключить переменную в кавычки в оболочках bash/POSIX . И вам не нужно использовать "$PWD"
так часто, как вы думаете — обычно достаточно использовать.
. И (ИМНШО )это помогает удобочитаемости использовать пробелы везде, где это возможно. Поэтому я предлагаю вам изменить свой скрипт следующим образом:
#!/bin/bash
for i in {1..20}
do
cd "conf$i"
cp../nvt.mdp.
cp../topol.top.
grompp -v -f nvt.mdp -c conf$i.gro -p topol.top -o "conf_nvt$i.tpr" >> nvt.log
cat <<- KHIK >> "run_nvt$i.pbs"
#!/bin/bash
#PBS -l nodes=1:ppn=16
#PBS -l walltime=120:00:00
#PBS -N GROMACS:TAUAT_P
#PBS -q blaze
#PBS -j oe
#PBS -V
cd "\$PBS_O_WORKDIR"
export I_MPI_DEVICE=rdma
/home/apps/ics/impi/latest/bin64/mpiexec.hydra /home/braf/md/gromacs-4.5.6/bin/mdrun_mpi -deffnm "conf_nvt$i"
KHIK
cd..
done
Обратите внимание на пробелы до и после <<-
и дополнительные кавычки.
Один из стилей, который мне нравится, — делать отступы здесь:
︙
grompp -v -f nvt.mdp -c conf$i.gro -p topol.top -o "conf_nvt$i.tpr" >> nvt.log
cat <<- KHIK >> "run_nvt$i.pbs"
#!/bin/bash
#PBS -l nodes=1:ppn=16
#PBS -l walltime=120:00:00
#PBS -N GROMACS:TAUAT_P
#PBS -q blaze
#PBS -j oe
#PBS -V
cd "\$PBS_O_WORKDIR"
export I_MPI_DEVICE=rdma
/home/apps/ics/impi/latest/bin64/mpiexec.hydra /home/braf/md/gromacs-4.5.6/bin/mdrun_mpi -deffnm "conf_nvt$i"
KHIK
cd..
︙
Я считаю, что это облегчает беглый просмотр -чтения сценария, и посмотреть, какие строки являются командами, которые выполняются сейчас, и какие из них являются данными (например, ввод в скрипт, где они могут быть выполнены позже ).
П.С. Разве вы не хотите сделать chmod +x "run_nvt$i.pbs"
в какой-то момент?
__________
1 Сегодня я узнал, что существуют программы называютсяdog
и unicorn
.
Думаю, это помогло бы;
test -e /volume1/Daily/<file-name> && mv /volume1/Daily/<file-name> /volume1/Temp/<file-name>
Я решил, как показано ниже;
find "/volume1/Download/" -type f -printf "%f\n" | while read filename
do
if [ -f "/volume1/Daily/$filename" ] ; then
mv "/volume1/Download/$filename" "/volume1/Temp/"
else
echo "skip"
fi
done