2013-07-09 3 views
0

Я пишу код в Perl со встроенным скриптом в нем:Shell Программирование в Perl

#!/usr/bin/perl 

use strict; 
use warnings; 

our sub main { 

    my $n; 
    my $n2=0; 


    $n=chdir("/home/directory/"); 

    if($n){ 
     print "change directory successful $n \n"; 

     $n2 = system("cd", "section"); 
     system("ls"); 
     print "$n2 \n"; 
    } 
    else { 
     print "no success $n \n"; 
    } 
    print "$n\n"; 
} 

main(); 

Но это не работает. Когда я делаю это. Ls не показывает новые файлы. Любой знает, как это сделать. Я знаю, что могу использовать chdir(), но это не единственная проблема, так как у меня есть другие команды, которые я создал, которые являются просто командами оболочки, собранными вместе. Так кто-нибудь знает, как точно использовать cli в perl, так что мой компилятор будет поддерживать сценарий оболочки в одном процессе, а не создавать новый процесс для каждой системы ... Я действительно не знаю, что делать.

Редакции были использованы для улучшения вопроса. Пожалуйста, не возражайте, если вопрос будет ясен. правки: хорошая точка, сделанная толпой, что система - это единственный процесс, так что он умирает каждый раз. Но, что я пытаюсь сделать, это создать perl-скрипт, который следует алгоритму, который решает поток управления скриптом оболочки. Итак, как мне заставить все эти команды оболочки следовать одному и тому же процессу?

+0

Мне непонятно, что вы пытаетесь сделать. Какой компилятор вы хотите использовать и какой компилятор использует ваш скрипт, если вы его не измените? – mob

+0

Вы будете более точно о том, что вы пытаетесь сделать. Почему вы не можете использовать собственный 'chdir' perl? – kjprice

+0

Я отредактировал его ... Можете ли вы, пожалуйста, прочитать еще раз ... спасибо :) – ban

ответ

1

system("cd", "section"); пытается выполнить программу cd, но на вашем компьютере такой программы нет.

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

Похоже, вы пытаетесь выполнить программу Perl с помощью сценария оболочки. Это требует воссоздания оболочки в Perl. (Более конкретные цели могут иметь более простые решения.)


То, что я пытаюсь сделать, это создать скрипт на языке Perl, который следует алгоритм, который решает поток управления сценария оболочки.

Минимальное изменение:

Создать скрипт, который запрашивает инструкции/команды. Попросите свой скрипт Perl запустить сценарий оболочки с помощью Expect и передать ему ответы/команды.

+0

вот что я пошел после ожидания ... но все равно большое вам спасибо, дает мне уверенность в том, что это сработает. – ban

2

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

Чтобы сделать то, что вы хотите сделать (*), объедините свои команды в один системный вызов.

$n2 = system("cd section; ls"); 

Вы можете использовать расширенные функции цитирования Perl, чтобы при необходимости передавать более длинные последовательности команд.

$n2 = system q{cd section 
if ls foo ; then 
    echo we found foo in section 
    ./process foo 
else 
    echo we did not find foo\! 
    ./create_foo > foo 
fi}; 

$ n2 = система < < "EOSH"; cd раздел ./process bar>/tmp/log cd ../sekshun ./process foo >>/tmp/log if grep -q Ошибка/tmp/log; то эхо были ошибки ... фи EOSH

(*), конечно, есть простые способы сделать это полностью на Perl, но давайте предположим, что ОП в конечном счете потребуется некоторая функция доступна только во внешней программе

+0

Спасибо, но это не поможет. То, что я пытаюсь сделать, это создать скрипт perl, который следует алгоритму, который решает поток управления скриптом оболочки. Итак, как мне заставить все эти команды оболочки следовать одному и тому же процессу? – ban

+0

Да, но тогда я мог бы написать весь скрипт в оболочке, но мне нужен алгоритм в perl, и все команды оболочки должны следовать одному и тому же процессу ... нет ли способа сделать это? Я могу прочитать что-то обширное и сделать это, если у вас есть ресурс, описывающий поток управления системой в perl – ban

+0

Сэр, пожалуйста, вам кажется, что я единственная надежда ... – ban

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