2015-06-25 7 views
0

Я почти ничего не знаю о скриптах bash. Мне нужно запустить некоторые скрипты (созданные другими людьми), которые я должен запускать из определенных каталогов. Как только скрипт перестает работать (1 час). Я меняю каталоги из приглашения, перехожу в другой каталог и запускаю другой скрипт (обычно тот же файл csh, но с разными параметрами). Я должен сделать это 25 раз. Мне было интересно, есть ли способ создать файл «sh», который мог бы автоматизировать процесс. Таким образом я могу получить некоторое время, запустив его в одночасье.перейдите в каталог, запустите скрипт, измените каталог, повторите

#! /bin/bash 

cd /dev/D/Folder1 

unzip file1.zip 

$ALR_SH/someonesscript.csh -DIR $PWD -otherfilter blah1 


cd /dev/D/Folder2 

unzip file2.zip 

$ALR_SH/someonesscript.csh -DIR $PWD -otherfilter blah2 

. 
. 
. 

and so on. 

Спасибо, и я сожалею, если это слишком расплывчато. На самом деле у меня нет доступа к папке, в которой хранится файл «csh», который я запускаю, поэтому я не знаю его особенностей и не могу поделиться им.

+1

Это самый простой, если вы заранее знаете, какие команды вы хотите исполнить, и точно такой порядок, в котором вы хотите их выполнить, вы можете просто перечислить их все, по одному в строке, в текстовом файле, положите линию shebang наверху, и вам хорошо идти. Очень похоже на то, что вы опубликовали. Ты это пробовал? –

+2

Короткий ответ да! Но вам нужно '#!/Bin/bash' (без пробела). Вам также необходимо подтвердить, что смена каталога прошла успешно. (т. е. 'cd/some/dir && {unzip file1.zip; $ ALR_SH ...;}' Также посмотрите на 'pushd' и' popd', чтобы перейти к исходному каталогу. –

+0

@JohnBollinger I я не пробовал это, потому что я помню, как читал на стеках, что смена каталогов была сложной. Я попробую сейчас ... ну через 1 час, потому что я просто запускал скрипт. – Amatya

ответ

1

Языки скриптов предназначены для того, чтобы делать именно то, что вы пытаетесь сделать. Это может быть так просто, как просто перечисление каждой команды, которую нужно выполнить, или вы можете воспользоваться некоторыми возможностями оболочки, чтобы упростить вашу работу. Когда вы работаете вещи «во время сна» всегда убедитесь, что для установки простого файл журнала, так что вы можете выяснить, что пошло не совсем верно, пока вы спали:

#!/bin/bash 

logfile=/path/to/log/file.txt  ## keep a simple logfile 

cd /dev/D/Folder1 &>/dev/null && { ## execute script on successful change into directory 

    printf "%s - excuting someonesscript in %s\n" "$(date '+%b %e %T')" "$PWD" >> "$logfile" 
    unzip file1.zip 
    $ALR_SH/someonesscript.csh -DIR $PWD -otherfilter blah1 && \ 
    printf "%s - script in %s succeeded\n" "$(date '+%b %e %T')" "$PWD" >> "$logfile" || \ 
    printf "%s - script in %s FAILED\n" "$(date '+%b %e %T')" "$PWD" >> "$logfile" 
} 

... 

and so on. 

Или вы можете использовать простые массивы и циклы, чтобы сократить повторение (вы даже можете поместить список каталогов в отдельный текстовый файл, если хотите). Корпуса чрезвычайно способны выполнять все, что необходимо для администрирования системы Linux.

Ниже только простой пример использования общего базового каталога и массив, содержащий каждый подкаталог, чтобы изменить и выполнить скрипт в . Примечание: всегда убедитесь, что вы предоставляете либо абсолютный путь или правильный относительный путь при смене директории (я бы рекомендовал абсолютные пути, пока вы не освоитесь с вприпрыжку вокруг использования относительных путей):

#!/bin/bash 

logfile=/path/to/log/file.txt  ## keep a simple logfile 
basedir=/dev/D      ## common base directory name 

dirarray=(Folder1     ## array of foldernames to change to 
      Folder2) 

for i in "${dirarray[@]}"; do  ## for each folder in dirarray 

    if cd "${basedir}/${i}" &>/dev/null; then ## if successful change to directory 

     ## execute commands and log success/failure 
     printf "%s - excuting someonesscript in %s\n" "$(date '+%b %e %T')" "$PWD" >> "$logfile" 
     unzip file1.zip 
     $ALR_SH/someonesscript.csh -DIR $PWD -otherfilter blah1 && \ 
     printf "%s - script in %s succeeded\n" "$(date '+%b %e %T')" "$PWD" >> "$logfile" || \ 
     printf "%s - script in %s FAILED\n" "$(date '+%b %e %T')" "$PWD" >> "$logfile" 

    else 

     ## log failure to change into directory 
     printf "%s - failed to change to directory '%s'\n" "$(date '+%b %e %T')" "$i" >> "$logfile" 

    fi 

done 

утром, просто проверить /path/to/log/file.txt, чтобы увидеть, как все прошло.

Jun 24 20:59:26 - excuting someonesscript in /home/david/scr/tmp/stack/dat/Folder1 
Jun 24 20:59:59 - script in /home/david/scr/tmp/stack/dat/Folder1 succeeded 
Jun 24 20:59:59 - failed to change to directory 'Folder2' 
Jun 24 21:01:21 - excuting someonesscript in /home/david/scr/tmp/stack/dat/Folder3 
Jun 24 21:01:21 - script in /home/david/scr/tmp/stack/dat/Folder3 succeeded 

Примечание: весь синтаксис $(date '+%b %e %T') просто сделать ваш файл_журнала выглядеть красиво. То есть:

+0

Это потрясающе! Спасибо! инструкции теперь и сообщите вам завтра утром, как это произошло. – Amatya

+0

Удачи. 'bash' - феноменально способный язык скриптов. Не самый быстрый, но он более чем достаточно быстрый, чтобы делать то, что вам нужно. Проведите время, изучая его, в частности, обработку строки [** String Manipulation **] (http://tldp.org/LDP/abs/html/string-manipulation.html), это не сэкономит вам время и значительно расширит как вы смотрите на сценарии. –

+0

Я получаю сообщение об ошибке с/dev/null. На самом деле для этой задачи в каталоге есть/home/blah/blah, поэтому я просто заменил &>/home/null (в вашем первом скрипте), и я получаю сообщение об ошибке «операция не применима» – Amatya

Смежные вопросы