Скрипт Perl, выполните команду cd на терминале

Скрипт Perl, выполните команду cd на терминале

ВСкрипт для смены текущего каталога (cd, pwd) показано, как запустить bash-скрипт, который изменяет каталог терминала.

Но как запустить скрипт Perl, который запускает скрипт Bash, меняющий каталог терминала?

решение1

Ты не можешь.

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

решение2

Ты не можешь этого сделать.напрямую. Единственный способ для оболочки изменить свой текущий каталог — это выполнить cdкоманду (или pushd, popd, и т. д.).

Но вы можете сделать это косвенно. Вот простой пример, который меняет текущий каталог на /tmp:

cd-tmp.pl:

#!/usr/bin/perl

print "cd /tmp\n";

В вашем .bashrcили .bash_profile:

cd-tmp() { eval $(cd-tmp.pl); }

Предполагается, что он cd-tmp.plнаходится в каталоге в вашем $PATH-- или вы можете указать полный путь в функции.

Когда вы вводите текст cd-tmpв командной строке оболочки, она вызывается cd-tmp.pl, захватывает ее вывод и выполняет этот вывод как команду оболочки.

Скрипт Perl не может заставить вызывающую оболочку сменить каталог, но он может предоставить ей команду, которую оболочка затем может выполнить сама.

Конечно, вы можете использовать и другой каталог, помимо /tmp, в том числе тот, который определяется на основе другой информации или создается «на лету».

Одно уточнение: текущий каталог является свойством текущего процесса оболочки, а не терминала.

ОБНОВЛЯТЬ :

Я только что понял, что пропустил часть вашего вопроса; вы хотите "скрипт perl, который запускает скрипт bash". Достаточно легко изменить мой пример, чтобы сделать это, но я понятия не имеюпочемувам нужен скрипт Perl для запуска скрипта bash. Вы не рассказали нам достаточно о том, чего вы на самом деле пытаетесь достичь.

решение3

Есть несколько способов (ТИМТОВТДИ) выполнения внешних команд из Perl. Например, использование exec(), использование обратных кавычек (``) и т. д. Если вы можете запускать внешние команды прямо из своего скрипта Perl, то, я думаю, нет необходимости вызывать другой скрипт Bash (но вы можете сделать и это). Перейдите по ссылке ниже, чтобы узнать больше. Также обратите внимание, что любые изменения, внесенные в программу, влияют только на подоболочку и остаются эффективными только во всей программе, что всегда хорошо, но есть способы сделать изменения постоянными, то есть они повлияют и на родительскую оболочку.

http://www.perlhowto.com/executing_external_commands

ОБНОВЛЯТЬ-

Несколько вопросов по теме "Как сделать это другими способами". Для необычных требований должны быть необычные решения (которые работают). Но вопрос в том, зачем вам использовать Perl для смены родительского каталога оболочки? Вот как вы это сделаете в любом случае

$cat test.pl
 print "Hello world\n";
 print "cd ..";
$pwd
 /home/user/perlcode
$eval `perl test.pl|tee -a test.pl.log|grep cd`
$pwd
 /home/user

решение4

Еще одно решение — сначала сохранить каталог, который вы хотите посетить, в строковой переменной:
Например:

$cd_path = "/var/tmp";
$cmd_to_run = "cd $cd_path ; ls -lrt";
system($cmd_to_run);

Связанный контент