windows unix shell command-prompt shebang

Use shebang/hashbang en el símbolo del sistema de Windows



unix shell (6)

Actualmente estoy usando el script de servicio para servir directorios con Node.js en Windows 7. Funciona bien en el shell de MSYS o usando sh , ya que he puesto node.exe y el script de servicio en mi ~ / bin (que está en mi RUTA), y escribir solo "servir" funciona debido a su directiva Shebang ( #! ) que le dice al shell que lo ejecute con el nodo.

Sin embargo, el símbolo del sistema de Windows no parece admitir archivos normales sin una extensión * .bat o * .exe, ni la directiva shebang. ¿Hay alguna clave de registro u otros hacks que pueda obtener para forzar este comportamiento fuera del cmd.exe incorporado?

Sé que solo podría escribir un archivo por lotes simple para ejecutarlo con un nodo, pero me preguntaba si podría hacerse en una fasion integrada, ¿no tengo que escribir un script para cada script como este?

Actualización: En realidad, estaba pensando, ¿es posible escribir un controlador predeterminado para todos los ''archivos no encontrados'', etc. que podría intentar ejecutar automáticamente dentro de sh -c ?

Gracias.


No, no hay manera de "forzar" la línea de comandos para hacer esto.

Windows simplemente no fue diseñado como Unix / Linux.

¿Hay una extensión de shell que hace algo similar?

No es de lo que he oído hablar, pero eso debería preguntarse en el Superusuario, no aquí.



Esta es una forma sencilla de forzar las ventanas para que admitan shebang, sin embargo, tiene una advertencia con respecto a la denominación de archivos. Copie el siguiente texto en un archivo por lotes y siga la idea general en los comentarios REM.

@echo off REM This batch file adds a cheesy shebang support for windows REM Caveat is that you must use a specific extension for your script files and associate that extension in Windows with this batch program. REM Suggested extension is .wss (Windows Shebang Script) REM One method to still easily determine script type visually is to use double extensions. e.g. script.pl.wss setlocal enableextensions disabledelayedexpansion if [%1] == [] goto usage for /f "usebackq delims=" %%a IN (%1) do ( set shebang=%%a goto decode_shebang ) :decode_shebang set parser=%shebang:~2% if NOT "#!%parser%" == "%shebang%" goto not_shebang :execute_script "%parser%" %* set exit_stat=%errorlevel% echo script return status: %exit_stat% goto finale :not_shebang echo ERROR script first line %shebang% is not a valid shebang echo maybe %1 is not a shebanged script goto finale :usage echo usage: %0 ''script with #! shebang'' [scripts args]+ echo This batch file will inspect the shebang and extract the echo script parser/interpreter which it will call to run the script :finale pause exit /B %exit_stat%


La línea de comandos no admite shebang, sin embargo, existen muchas técnicas híbridas para diferentes idiomas que permite combinar la sintaxis de lotes y otros lenguajes en un archivo. Si su pregunta concierne a node.js, aquí hay un híbrido batch-node.js (guárdelo con extensión .bat o .cmd ):

0</* :{ @echo off node %~f0 %* exit /b %errorlevel% :} */0; console.log(" ---Self called node.js script--- "); console.log(''Press any key to exit''); process.stdin.setRawMode(true); process.stdin.resume(); process.stdin.on(''data'', process.exit.bind(process, 0));

Se puede hacer con muchos otros lenguajes como Ruby, Perl, Python, PHP y etc.


No hay forma de ejecutar un archivo aleatorio, a menos que sea un archivo binario ejecutable real. La función Windows CreateProcess () simplemente no está diseñada para ello. Los únicos archivos que puede ejecutar son aquellos con MZ magic o con extensiones de la lista %PATHEXT% .

Sin embargo, CMD tiene un soporte limitado para intérpretes personalizados a través de la cláusula EXTPROC . La limitación es que el intérprete también debe admitir y omitir esta cláusula en su ejecución.


Sí, esto es posible utilizando la variable de entorno PATHEXT . Que también se usa, por ejemplo, para registrar scripts .vbs o .wsh para que se ejecuten "directamente".

Primero necesita extender la variable PATHEXT para que contenga la extensión de ese script de servicio (en el siguiente asumo que la extensión es .foo, ya que no conozco Node.js)

Los valores por defecto son algo como esto:

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

Debe cambiarlo (a través del Panel de control) para verse así:

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.FOO

El uso del panel de control (Panel de control -> Sistema -> Configuración avanzada del sistema -> Variables de entorno es necesario para mantener el valor de la variable PATHEXT).

Luego debe registrar el "intérprete" correcto con esa extensión utilizando los comandos FTYPE y ASSOC :

ASSOC .foo=FooScript FTYPE FooScript=foorunner.exe %1 %*

(El ejemplo anterior se toma descaradamente de la ayuda proporcionada por ftype /? )

ASSOC y FTYPE escribirán directamente en el registro, por lo que necesitará una cuenta administrativa para ejecutarlos.