2016-07-19 5 views
0

Я создал переменную $ date в скрипте Main.pl, которую я хотел бы передать скрипту Annotator.pl. Я использую shell-скрипт для выполнения Annotator.pl. Я не могу понять, как передать $ date в Annotator.pl. Когда я запускаю my $date = $ARGV[0]; в Annotator.pl, я получаю имя текущего каталога, однако $date = $ARGV[1]; ничего не возвращает.Передача переменной между скриптами

См. Приведенный ниже код. Дата важна, потому что она должна быть точной, и я не могу понять, как передать ее Annotator.pl. Спасибо за вашу помощь.

Main.pl Сценарий:

#!/usr/bin/perl -w 
    use strict; 
    use warnings; 

    my $sec; my $min; my $hour; my $mday; my $mon; my $year; my $wday; my $yday; my $isdst; 
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); 
    $mon=$mon+1; $year = 1900+$year; 
    if (length($mon)==1) {$mon="0".$mon;} 
    if (length($mday)==1) {$mday="0".$mday;} 
    if (length($hour)==1) {$hour="0".$hour;} 
    if (length($min)==1) {$min="0".$min;} 
    if (length($sec)==1) {$sec="0".$sec;} 

    my $date = "$mon"."_"."$mday"."_"."$year"."-".$hour.$min.$sec; 

    my $cmd5 = `perl MDL_unzip_annotate.sh /data/test_all_runs pVCF $date`; print "$cmd5"; 

Shell скрипт: MDL_unzip_annotate.sh, который выполняет Annotator.pl

home="/data/test_all_runs" #location of the run directory from which the program is launched 
    scripts="/data/test_scripts" 

    datapath=$1 #this is called in Main.pl as [test_all_runs] 
    process=$2 #the process 

    if [[ "$process" == "pVCF" ]];then 
      cd $datapath 
      folders="$(ls)" 
      cd $scripts 
     for ff in $folders; do 
      dname=$ff 
       echo $dname 
       if [ ! -f $dname ];then 

        cmd2="perl Annotator.pl $dname" 
        echo $cmd2 

        cmd2=`perl Annotator.pl $dname` 
        echo $cmd2 
       fi 
      done  
    done   

    fi 

Annotator.pl сценарий:

#!perl 
    use strict; 
    use warnings; 

    my $date = $ARGV[1]; print "the date is######## ".$date."\n"; 
+0

'perl MDL_unzip_annotate.sh/data/test_all_runs pVCF $ date' является чрезвычайно опасным - объединение вашей команды в строку означает, что вы вызываете' system() ', которая запускает' sh -c' с этой строкой в ​​качестве аргумент, что означает, что вы уязвимы для атак оболочки. Не делай этого. –

+0

Я новичок ... попробуйте передать $ date в Annotator.pl. Спасибо – user3781528

+0

Подумайте, что произойдет, если вы заселяете свой год с пользовательского ввода, а не по местному времени - если пользователь запускает программу с '1994 $ (rm -rf $ HOME)' в качестве года, вы не хотите, чтобы система на самом деле вызывать 'rm', но это то, что произойдет, если эта строка будет передана в оболочку, а буквальное цитирование легко обойти. –

ответ

1

Вместо использования оболочки script Я буду использовать следующий код, чтобы записать имя папки в определенном каталоге:

opendir my $dir, "/data/test_all_runs" or die "Cannot open directory: $!"; 
my @run_folder = readdir $dir; 
closedir $dir; 
my $last_one = pop @run_folder; print "The folder is".$last_one."\n"; 

Спасибо за ваши предложения.

+0

Отлично :) Обратите внимание: 'readdir' возвращает файлы без какого-либо пути. Таким образом, чтобы получить работоспособные списки, вы должны добавить путь по мере необходимости. Например, '@filenames = map {" $ path/$ _ "} readdir $ dir'. Или вы можете 'chdir $ dirname', а затем работать с голыми именами.Но тогда _do not_ забыл, что рабочий каталог вашего скрипта - '$ dirname'. – zdim

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