Pregunta Cambiar el directorio de trabajo en mi contexto de shell actual al ejecutar la secuencia de comandos Node


Estoy intentando cambiar el directorio de trabajo de mi script Node.js cuando se ejecuta desde un script bin. Tengo algo como lo siguiente:

#!/usr/bin/env node
process.chdir('/Users')

Cuando luego ejecuto este archivo con ./bin/nodefile, sale, pero el directorio de trabajo del contexto de shell actual no ha cambiado. También he intentado shelljs, pero eso tampoco funciona.

¿Cuál es la mejor manera de hacer esto? Entiendo que está funcionando, pero es solo en un proceso separado.


74
2017-11-06 03:50


origen


Respuestas:


La forma correcta de cambiar directorios es en realidad con process.chdir(directory). Aquí hay un ejemplo de documentación:

console.log('Starting directory: ' + process.cwd());
try {
  process.chdir('/tmp');
  console.log('New directory: ' + process.cwd());
}
catch (err) {
  console.log('chdir: ' + err);
}

Esto también se puede probar en el REPL de Node.js:

[monitor@s2 ~]$ node
> process.cwd()
'/home/monitor'
> process.chdir('../');
undefined
> process.cwd();
'/home'

102
2017-11-06 03:52



No hay un método incorporado para que Node cambie el CWD del carcasa subyacente ejecutando el proceso Nodo.

poder cambiar el directorio de trabajo actual de Proceso del nodo a través del comando process.chdir().

var process = require('process');
process.chdir('../');

Cuando existe el proceso Nodo, se encontrará de nuevo en el CWD en el que comenzó el proceso.


19
2017-09-30 16:35



Lo que estás tratando de hacer no es posible. La razón de esto es que en un sistema POSIX (Linux, OSX, etc.), un proceso hijo no puede modificar el entorno de un proceso principal. Esto incluye la modificación del directorio de trabajo del proceso principal y las variables de entorno.

Cuando está en la línea de comandos y va a ejecutar su secuencia de comandos de nodo, su proceso actual (bash, zsh, lo que sea) genera un nuevo proceso que tiene su propio entorno, generalmente una copia de su entorno actual (es posible cambiar esto a través de llamadas al sistema, pero eso está más allá del alcance de esta respuesta), permitiendo que el proceso haga lo que sea necesario hacer en completo aislamiento. Cuando el subproceso finaliza, el control se devuelve al proceso de su caparazón, donde el entorno no se ha visto afectado.

Hay muchas razones para esto, pero para empezar, imagine que ejecutó un script en segundo plano (a través de ./foo.js &) y mientras se ejecutaba, comenzó a cambiar su directorio de trabajo o reemplazar su PATH. Eso sería una pesadilla.

Si necesita realizar algunas acciones que requieran cambiar su directorio de trabajo de su caparazón, necesitará escribir una función en su caparazón. Por ejemplo, si está ejecutando Bash, podría poner esto en su ~/.bash_profile:

do_cool_thing() {
  cd "/Users"
  echo "Hey, I'm in $PWD"
}

y luego esta cosa genial es factible:

$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users

Si necesita hacer cosas más complejas además, siempre puede llamar a su script nodejs desde esa función.

Esta es la única forma en que puede lograr lo que está tratando de hacer.


8
2018-06-03 22:30



Respuesta corta: no (¿fácil?), Pero puede hacer algo que sirva a su propósito.

He hecho una herramienta similar (un pequeño comando que, dada la descripción de un proyecto, establece el entorno, las rutas, los directorios, etc.). Lo que hago es configurar todo y luego generar un caparazón con:

spawn('bash', ['-i'], {
  cwd: new_cwd,
  env: new_env,
  stdio: 'inherit'
});

Después de la ejecución, estará en un shell con el nuevo directorio (y, en mi caso, entorno). Por supuesto, puedes cambiar bash por el armazón que prefieras. Las principales diferencias con lo que originalmente solicitó son:

  • Hay un proceso adicional, entonces ...
  • tienes que escribir 'exit' para volver, y luego ...
  • después de existir, todos los cambios se deshacen.

Sin embargo, para mí, esas diferencias son deseables.


4
2018-01-06 13:44