Выполнение команды оболочки из perl-скрипта

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

Пытался сделать так:

my $fld="/home/user/work/folder";
my $cdm="cd $fld";
system($cdm);

При выполнении скрипта получаю сообщение, что нет такой папки.

Подскажите, с чем это может быть связано? Папка точно существует.


Ответы (2 шт):

Автор решения: hobo-mts

my $cdm="cd $fld"; system($cdm); это исполняется не в вашем процессе. есть chdir(). cd -- внутренняя команда оболочки, поэтому ваш system() скорее всего вызовет bash -c $cdm. bash изменит каталог у себя, но у вашего процесса останется прежний.

→ Ссылка
Автор решения: Alexander Prokoshev

По прочтении perldoc -f system оказалось, что перловый system() делает не то же самое, что сишный, и поведение его зависит от передаваемого аргумента.

В случае автора вопроса шелл не запускается, а делается fork()+exec("cd") по каждому элементу $PATH. exec("cd") обламывается, т.к. такой программы в пути действительно нет. Выдаётся сообщение Can't exec "cd": Нет такого файла или каталога at ./test.pl line 4, неверно интерпретированное автором как сообщение об отсутствии целевого каталога.

→ Ссылка