¿Cómo ejecutar un script de shell en OS X haciendo doble clic?

233

Tengo un script de shell que tiene permiso de ejecución de usuario en OS X, pero cuando hago doble clic en él, se abre en un editor de texto. ¿Cómo puedo hacer que se ejecute haciendo doble clic en él?

c2h2
fuente

Respuestas:

266
  • Primero en la terminal, haga que el script sea ejecutable escribiendo:

    chmod a+x (yourscriptname)
  • Luego, en Finder, haga clic derecho en su archivo y seleccione "Abrir con" y luego "Otro ...".

  • Aquí selecciona la aplicación en la que desea que se ejecute el archivo, en este caso sería Terminal. Para poder seleccionar el terminal, debe cambiar de "Aplicaciones recomendadas" a "Todas las aplicaciones". (La aplicación Terminal.app se puede encontrar en la carpeta Utilidades)

  • TENGA EN CUENTA que, a menos que no desee asociar todos los archivos con esta extensión para que se ejecuten en el terminal, no debería tener marcada la opción "Abrir siempre con".

  • Después de hacer clic en Aceptar, debería poder ejecutar su script simplemente haciendo doble clic en él.
Lus
fuente
gracias lo tengo, no sabía asociarme con la terminal, pensé que necesitaba asociarme con / bin / sh
c2h2
22
No pude encontrar Terminal.app en la lista hasta que me di cuenta de que tenía que buscar en la carpeta "Utilidades". Esperemos que esto ahorre algo de tiempo a alguien.
Glenn Lawrence el
27
En OSX 10.8 y superior, un script ejecutable cuyos nombres no tienen sufijo o sufijo .commandes ejecutable de manera predeterminada desde Finder, sin la necesidad de indicarle a Finder cómo abrirlo.
mklement0
1
"Todas las aplicaciones" es la configuración que me faltaba ... probablemente lo que experimentó Cheruvim también. En cuanto al comentario de Glenn: simplemente puede usar la función de búsqueda integrada en la esquina superior derecha de la ventana; asegúrese de escribir el nombre completo de la aplicación, es decir, Terminal.app.
élder elder
3
No es la forma limpia de hacerlo. Cambie el nombre de su script a la .commandextensión del archivo.
Bachsau
227

¿Has intentado usar la .commandextensión de nombre de archivo?

Hagelin
fuente
3
Esto es mejor. En la respuesta @Lus, la carpeta de trabajo no es la misma que abre el script.
Rodrigo
66
¿Hay alguna manera de iniciar tareas "en segundo plano" sin una ventana de consola?
lapo
66
Tenga en cuenta que el directorio actual puede no ser el único en el que se encuentra su script. Eche un vistazo a esta pregunta para corregirlo: stackoverflow.com/questions/59895/…
Pavel Alexeev
14
Aún necesita tener permiso de ejecución ( chmod +x) pero la .commandextensión ya está vinculada con Terminal. Gran solución, gracias
NorTicUs
Aparentemente, el usuario no puede interactuar con el programa del terminal con este método, a menos que me equivoque.
Demis
153

A partir de OSX 10.10 (Yosemite) y desde al menos OS X 10.8 (Mountain Lion) , el comportamiento es el siguiente cuando abre (hace doble clic) scripts ejecutables desde Finder :

  • Scripts ejecutables [1] con NO sufijo o sufijo.command :
    • se ejecutan de forma predeterminada; no se requiere configuración :
      • Se abre una nueva ventana de Terminal en la que se ejecuta el script.
      • de manera predeterminada, la ventana permanecerá abierta después de que finalice el script para que pueda inspeccionar la salida (aunque en ese momento el shell que ejecutó el script ha salido y ya no puede interactuar con él ).
        Sin embargo, a través de la Terminal Preferences... > Profilespuede optar por cerrar automáticamente la ventana cuando salga el script.
    • Advertencia : la carpeta de trabajo es invariablemente la carpeta de inicio del usuario actual , NO la carpeta en la que se encuentra el script.
      • Para hacer que un script de shell cambie a la carpeta en la que se encuentra, coloque
        • cd -- "$(dirname "$BASH_SOURCE")" justo después de la línea shebang
        • o, si debe seguir cumpliendo POSIX, cd -- "$(dirname "$0")".
        • Para casos extremos, como encontrar el directorio de origen verdadero de un script con enlace simbólico , vea esta respuesta mía.
    • Si el script inesperadamente no es ejecutable :
      • Hazlo ejecutable ejecutando chmod +x <script>en Terminal; de lo contrario, verá los siguientes síntomas:
      • .command: Finder muestra un mensaje de error engañoso que sugiere que el problema se puede solucionar a través de File > Get Info, lo que no es cierto; utilice el chmod +xmétodo sugerido anteriormente.
      • sin sufijo:
        • con una línea shebang (p. ej. #!/bin/bash): el comportamiento es como si el sufijo fuera .sh- ver más abajo.
        • con ninguna línea de tinglado: se abre en el editor de texto predeterminado (que es edición de textos por defecto).
  • Scripts con sufijo.sh , ya sea ejecutable o no:
    • se abren para editar en TextEdit.appo, si está instalado, con Xcode.app.
  • Scripts con sufijo.scpt o .applescript(incluso si están marcados como ejecutables, que normalmente no es el caso):
    • abierto para editar en[Apple]Script Editor
    • Tenga en cuenta que los archivos de código fuente JXA parecen no tener un sufijo distinto (todavía).
  • Scripts con un sufijo personalizado (un sufijo aún no conocido por el sistema), ya sea ejecutable o no (de hecho, se aplica a cualquier tipo de archivo):
    • pedirá que para la aplicación de abrirlos con cuando primero abrirlos , y recuerda que la elección .

[1] Ejecutable significa: una secuencia de comandos con los bits de permiso ejecutable establecidos y el usuario llamante, en relación con la propiedad del archivo, por lo tanto, potencialmente se le permite ejecutarlo.
Si usa chmod a+xpara configurar todos los bits de permiso (lo cual es típico), cualquiera puede invocarlo (suponiendo que también se les permita leer el archivo en función de los bits de permiso de lectura y la propiedad del archivo).

mklement0
fuente
1
Es posible cerrar la ventana de Terminal abierta cuando el script sale con un simple osascriptque puede incluir dentro del .commandarchivo en lugar de jugar manualmente con el perfil.
l'L'l
@ I'L'I: ¿Te refieres a agregar un osascript -e '...'comando al final del script? ¿Cuál es el comando específico y se asegura de que la pestaña derecha esté cerrada incluso cuando el script no se está ejecutando en la pestaña frontal?
mklement0
55
@ mklement0: Sí, no lo he probado más de unos minutos, pero la idea básica es incluir en la última línea del script .command : osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... Puede que no funcione en todos los escenarios, aunque la redirección en el El final es realmente la clave: de lo contrario, el osascript puede adaptarse fácilmente (por ejemplo , es posible que la ventana deba cambiarse a tab si ese es el comportamiento predeterminado de su terminal, etc.).
l'L'l
¿Es posible no permitir que la ventana / pestaña Terminal se cierre después de .commandejecutar el archivo de script a pesar de la configuración del perfil?
CyberMew
@CyberMew: si puede modificar el script, agregue un comando que espere una pulsación de tecla al final; por ejemplo, si es un bashscript, agregue read -p 'Press Return to close this window.'como la última declaración.
mklement0
38

Alternativamente, puede crear una aplicación normal de Mac OS X a partir de su script usando Platypus

svth
fuente
Esta es una aplicación realmente genial. Pero tengo algún problema aquí. Tengo un script de Python que quiero convertir en un archivo .app. Mi script incluye una línea donde el usuario tiene que escribir alguna entrada (raw_input ()), cuando el .app alcanza esta línea de código, arroja un error EOF (final del archivo). ¿Qué puedo hacer al respecto?
1
No es una terminal interactiva. Ornitorrinco simplemente presenta la salida del script. No hay comunicación bidireccional.
svth
44
O cree una aplicación OS X con Automator utilizando la acción Ejecutar script de Shell.
Rangi Keen
15

La manera fácil es cambiar la extensión a .commando no extensión.

Pero eso abrirá la Terminal, y tendrá que cerrarla. Si no desea ver ningún resultado, puede usar Automator para crear una aplicación para Mac en la que puede hacer doble clic, agregar al dock, etc.

  1. AutomatorAplicación abierta
  2. Elija el tipo de "Aplicación"
  3. Escriba "ejecutar" en el cuadro de búsqueda de acciones
  4. Haga doble clic en "Ejecutar script de shell"
  5. Haga clic en el Runbotón en la esquina superior derecha para probarlo.
  6. File > Save para crear la aplicación.

ingrese la descripción de la imagen aquí

Wisbucky
fuente
Excelente ! ¿Cómo podemos automatizar este flujo de trabajo para que se ejecute diariamente a la 1 PM?
iAkshay
9

No es necesario usar aplicaciones de terceros como Platypus.

Simplemente cree un Apple Script con Script Editor y use el comando do shell script "shell commands"para llamadas directas a comandos o archivos ejecutables de script de shell, mantenga el archivo de script editable seguro en algún lugar y luego expórtelo para crear un script de aplicación. el script de la aplicación se puede iniciar haciendo doble clic o seleccionando en la carpeta de la barra.

Luc-Olivier
fuente
3
Aún mejor, use Automator y use la acción Ejecutar script de Shell directamente en lugar de pasar por Apple Script.
Rangi Keen
0

También puede establecer valores predeterminados por extensión de archivo usando RCDefaultApp:

http://www.rubicode.com/Software/RCDefaultApp/

potencialmente podría configurar .sh para que se abra en iTerm / Terminal, etc. necesitaría permisos de ejecución del usuario, por ejemplo

chmod u+x filename.sh

Panel de preferencias RCDefaultApp

Tomachi
fuente
0

chmod 774 filename

Nota : El archivo con el nombre 'nombre de archivo' que tiene el script bash no tiene extensión

Neo
fuente