Как убедиться, что файлы в папке A также находятся в папке B

Во-первых, поскольку об этом больше никто не упоминал, ошибка не имеет ничего общего с cat. У вас будет такая же ошибка с любой программой, например nl, od, trили даже несуществующая -команда какdogunicorntribble1 .

Настоящим ответом будет то, что вы должны говорить <<-вместо <<. Как говорит другой ответ почти (, но не совсем ), проблема в том, что когда вы используете <<, оболочка ищет слово-разделитель(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.

0
10.04.2020, 19:03
2 ответа

Думаю, это помогло бы;

test -e /volume1/Daily/<file-name> && mv /volume1/Daily/<file-name> /volume1/Temp/<file-name>  
0
19.03.2021, 02:30

Я решил, как показано ниже;

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
0
19.03.2021, 02:30

Теги

Похожие вопросы