5

¿Cómo puedo obtener el nombre del script de manera confiable en Chicken Scheme?

Parece que -ss come el nombre del script, por lo que no es visible a menos que use dot slash para ejecutar mis scripts.

scriptedmain.scm:

#!/usr/bin/env csi -q 

(display (command-line-arguments)) 
(display "\n") 
(exit) 

Trace:

$ ./scriptedmain.scm 
(-q ./scriptedmain.scm) 
wonko:Desktop andrew$ csi -ss scriptedmain.scm 
() 

Respuesta

6

Esta es una respuesta tardía, por lo que puede no ser útil para el póster original. Sin embargo, para cualquier otra persona que pueden venir a través de esta pregunta, la respuesta sencilla es utilizar el parámetro:

(program-name) 

Esto debería devolver el nombre correcto para todas las situaciones. Docs here.

+0

Mejor tarde que nunca. Gracias amigo! – mcandre

+0

Mi última versión funciona para todos los casos excepto compilado. Por alguna razón, simplemente se sienta allí. – mcandre

+0

@mcandre: No estoy seguro de lo que quiere decir con "todos los casos excepto compilados". Miré su ejemplo scriptedmain.scm a continuación - con nombre de programa, y ​​funciona como un script interpretado, o como un ejecutable nativo compilado. Por cierto, no me molestaría con ese andamio (bash -> csi). No es realmente necesario #!/Usr/bin/env chicken-scheme #!/Usr/bin/csi -s –

1

(argv) debe hacer el trabajo. Ejemplo:

#!/usr/local/bin/csi -script 

(display (argv)) (newline) (exit) 

impresiones (/usr/local/bin/csi -script ./test.scm)

+0

Casi! Debe agregar código para el caso especial donde el script se compila con csc; entonces el programa es (list-ref (argv) 0). – mcandre

+0

Con "script" me refiero a "no compilado". Existen otras soluciones para distinguir entre programas interpretados y compilados. – knivil

1

scriptedmain.scm se ejecutará (principal) e imprimir el nombre del programa en los siguientes casos:

Ejecutar del intérprete:

csi -ss scriptedmain.scm 

Run del intérprete que usa shebangs:

./scriptedmain.scm 

compilar:

csc -o scriptedmain scriptedmain.scm 
./scriptedmain 

Agregado a GitHub.

#!/bin/sh 
#| 
exec csi -ss $0 ${1+"[email protected]"} 
exit 
|# 

(define (main) 
    (display (format "Program: ~a\n" (program-name))) 
    (exit)) 

(if (not (equal? (program-name) "csi")) 
    (main)) 
Cuestiones relacionadas