EnScript para cambiar el directorio actual (cd, pwd) se muestra cómo ejecutar un script bash que cambia el directorio del terminal.
Pero, ¿cómo ejecuto un script perl que ejecuta un script bash que cambia el directorio del terminal?
Respuesta1
No puedes.
El script Perl se ejecuta en un proceso que es hijo de su sesión de shell. Este proceso hijo puede cambiar su propio directorio de trabajo todo lo que quiera, pero no puede cambiar el directorio de trabajo de su padre. Cuando se cierra el script Perl, el control regresa al proceso principal (la sesión de shell), que habrá permanecido en el mismo directorio de trabajo todo el tiempo, independientemente de lo que hizo el proceso secundario mientras se estaba ejecutando.
Respuesta2
no puedes hacer estodirectamente. La única forma de que un shell cambie su directorio actual es que el propio shell ejecute un cdcomando (o pushd,, popdetc.).
Pero puedes hacerlo indirectamente. Aquí hay un ejemplo simple que cambia el directorio actual a /tmp:
cd-tmp.pl:
#!/usr/bin/perl
print "cd /tmp\n";
En tu .bashrco .bash_profile:
cd-tmp() { eval $(cd-tmp.pl); }
Esto supone que cd-tmp.plestá en un directorio de su $PATH... o puede especificar la ruta completa en la función.
Cuando escribe cd-tmpen el símbolo del shell, invoca cd-tmp.pl, captura su salida y ejecuta esa salida como un comando de shell.
Un script Perl no puede hacer que un shell que llama cambie de directorio, pero puede proporcionarle un comando que el shell puede ejecutar por sí mismo.
Por supuesto, puede utilizar un directorio distinto de /tmp, incluido uno que se determine en función de otra información o que se cree sobre la marcha.
Un punto de aclaración: el directorio actual es una propiedad del proceso de shell actual, no del terminal.
ACTUALIZAR :
Me acabo de dar cuenta de que me perdí parte de tu pregunta; desea "un script perl que ejecute un script bash". Es bastante fácil modificar mi ejemplo para hacer eso, pero no tengo ideapor quénecesita el script Perl para ejecutar un script bash. No nos ha contado lo suficiente sobre lo que realmente está tratando de lograr.
Respuesta3
Hay varias maneras (TIMTOWTDI) de ejecutar comandos externos desde Perl. Como usar exec(), usar comillas invertidas (``), etc. Si puede ejecutar los comandos externos directamente desde su script Perl, entonces creo que no es necesario llamar a otro script Bash (pero también puede hacerlo). Siga el enlace a continuación para obtener más información. También tenga en cuenta que cualquier cambio realizado dentro del programa afecta solo al subshell y permanece efectivo solo en todo el programa, lo cual siempre es bueno, pero hay maneras de hacer que los cambios sean permanentes, es decir, afectarían también al shell principal.
http://www.perlhowto.com/executing_external_commands
ACTUALIZAR-
Algunas preguntas sobre "Cómo hacerlo de otras formas". Para requisitos inusuales debería haber soluciones inusuales (que funcionen). Pero la pregunta es ¿por qué usarías Perl para cambiar el directorio principal del shell? Así es como lo harías de todos modos
$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
Respuesta4
Una solución más es guardar primero el directorio que desea visitar en una variable de cadena:
por ejemplo:
$cd_path = "/var/tmp";
$cmd_to_run = "cd $cd_path ; ls -lrt";
system($cmd_to_run);


