tutorial proyecto principiantes para node libro examples ejemplos crear javascript node.js terminal command-line-interface cd

javascript - proyecto - node js server



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

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

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''

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 ejecuto este archivo con ./bin/nodefile , se cierra, pero el directorio de trabajo del contexto del shell actual no ha cambiado. También probé 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.


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 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), lo que permite que el proceso haga todo lo que necesita 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 ./foo.js & , imagina que ejecutaste un script en segundo plano (a través de ./foo.js & ) y, a medida que se ejecutaba, comenzó a cambiar tu directorio de trabajo o a anular tu 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, puede 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.


No hay un método incorporado para que Node cambie la CWD del shell subyacente que ejecuta el proceso Node.

Puede cambiar el directorio de trabajo actual del proceso 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.


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.