GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué intérprete de Shell ejecuta un script sin Shebang?

Supongamos que el shell predeterminado para mi cuenta es zsh, pero abrí la terminal, encendí bash y ejecuté un script llamado prac002.sh , ¿qué intérprete de shell se usaría para ejecutar el script, zsh o bash? Considere el siguiente ejemplo:

[email protected] ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf
[sudo] password for papagolf: 
papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh
# papagolf's default shell is zsh

[email protected] ~/My Files/My Programs/Learning/Shell % bash
# I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.)

[email protected]:~/My Files/My Programs/Learning/Shell$ ./prac002.sh 
Enter username : Rex
Rex
# Which interpreter did it just use?

**EDITAR:** Aquí está el contenido del guión

[email protected] ~/My Files/My Programs/Learning/Shell % cat ./prac002.sh 
read -p "Enter username : " uname
echo $uname

Respuesta aceptada:

Porque el script no comienza con un #! shebang línea que indica qué intérprete usar, POSIX dice que:

Si execl() falla debido a un error equivalente al error [ENOEXEC] definido en el volumen Interfaces del sistema de POSIX.1-2008, el shell debe ejecutar un comando equivalente a tener un shell invocado con el nombre de ruta resultante de la búsqueda como su primer operando , con los argumentos restantes pasados ​​al nuevo shell, excepto que el valor de "$0" en el nuevo shell se puede establecer en el nombre del comando. Si el archivo ejecutable no es un archivo de texto, el shell puede omitir la ejecución de este comando. En este caso, escribirá un mensaje de error y devolverá un estado de salida de 126.

Esa redacción es un poco ambigua, y diferentes capas tienen diferentes interpretaciones.

En este caso, Bash ejecutará el script usándose a sí mismo . Por otro lado, si lo ejecutara desde zsh, zsh usaría sh (sea lo que sea que esté en su sistema) en su lugar.

Puede verificar ese comportamiento para este caso agregando estas líneas al script:

echo $BASH_VERSION
echo $ZSH_VERSION

Notarás que, desde Bash, la primera línea muestra tu versión, mientras que la segunda nunca dice nada, sin importar qué shell uses.

  • Si su /bin/sh es, digamos, dash , entonces ninguna línea generará nada cuando el script se ejecute desde zsh o dash.
  • Si su /bin/sh es un enlace a Bash, verá la salida de la primera línea en todos los casos.
  • Si /bin/sh es una versión diferente de Bash de lo que estaba usando directamente, verá un resultado diferente cuando ejecute el script desde bash directamente y desde zsh.
Relacionado:¿Recorrer archivos con espacios en los nombres?

El ps -p $$ El comando de la respuesta de rools también mostrará información útil sobre el comando que usó el shell para ejecutar el script.


Linux
  1. Bash script:mal intérprete

  2. ¿Es posible hacer que un script bash shell interactúe con otro programa de línea de comandos?

  3. nombre base con espacios en un script bash?

  4. Cómo incluir un archivo en un script de shell bash

  5. Shell script cambia de directorio con variable

Automatice el procesamiento de imágenes con este script Bash

Cómo escribir un script Bash con ejemplos

Bash Shebang

Shell Scripting Parte I:Primeros pasos con bash scripting

¿Qué es Shebang en Linux Shell Scripting?

Tutorial de introducción a Bash Scripting con 5 ejemplos prácticos