¿Cómo puedo ejecutar secuencias de comandos desde el menú de secuencias de comandos de todo el sistema con un entorno normal? Parece que el entorno no se está configurando en absoluto.
Los scripts que se ejecutan desde el menú de scripts pueden buscar y ejecutar comandos desde el sistema base. Sin embargo, las utilidades instaladas por el usuario no se encuentran en la ruta. Además, /usr/bin/env foo
no encuentra comandos que estén instalados fuera del sistema base.
El menú Script del sistema aparece en el lado derecho de la barra de menú. Se habilita a través de Script Editor.app > Preferencias > Mostrar menú Script en la barra de menú. Muestra scripts ubicados en ~/Library/Scripts
y otras ubicaciones del sistema. El menú puede ejecutar AppleScript, JXA, bash, python y otros scripts (use shebang según sea necesario).
Los scripts que se ejecutan desde el menú Script no heredan el entorno bash del usuario. Saben que el shell es BASH y su nombre de USUARIO, pero no se produce ninguna inicialización. Ejecuté un pequeño script para volcarlo env
en un archivo de texto.
~/Library/Scripts/dump_env.sh (asegúrese de hacerlo ejecutable) :
#!/bin/bash
env > ~/env.txt
ps -ef >> ~/env.txt
Aquí están las entradas interesantes.
USER=mat
LOGNAME=mat
SHELL=/bin/bash
PATH=/usr/bin:/bin:/usr/sbin:/sbin
PWD=/
HOME=/Users/mat
_=/usr/bin/env
Es muy vainilla. No se incluye ninguna de las rutas personalizadas. Por ejemplo, los siguientes no están disponibles:
/usr/local/bin/svn # Subversion source control client
/opt/local/bin/python3 # python3 installed via MacPorts
~/bin
Los dos últimos normalmente se encuentran en mi .bash_profile. /usr/local/bin/
es la configuración por path_helper
la cual es llamado /etc/profile
(aunque aparentemente no para el menú Script).
Estoy ejecutando macOS 10.13 High Sierra, pero me interesa saber si otros obtienen resultados diferentes.
/usr/bin/env python3
logra esto, pero parece depender de la RUTA?Estoy buscando en launchctl
, que se puede usar para configurar el entorno para aplicaciones GUI. No estoy seguro si todavía funciona o si funcionará con el menú Script.
Agregué instrucciones de seguimiento a todos los archivos de entorno de bash: /profile
, /bashrc
, ~/.bash_profile
, ~/.bashrc
. Estas declaraciones exportan la variable de entorno para que pueda ver que el archivo se ha obtenido. Ninguno de estos se ejecuta para los scripts que se ejecutan desde el menú Script.
launchctl setenv KEY VALUE
establecerá una variable ambiental para todos los procesos lanzados posteriormente por los servicios de lanzamiento (launchd) en el espacio del usuario.
Esto funciona para Terminal.app, aplicaciones GUI y scripts en los que se hace doble clic en el Finder. Sin embargo, no funciona para el menú Script.
Agregué ps -ef
al script dump_env.sh. Esto me dice que el menú Script no está invocando a bash con argumentos que eliminarían el entorno (como -r o -p). El proceso padre es UserScriptService
.
Correr…
otool -tV /System/Library/Frameworks/Foundation.framework/Versions/C/XPCServices/com.apple.foundation.UserScriptService.xpc/Contents/MacOS/com.apple.foundation.UserScriptService.
… revela un símbolo llamado __NSUserScriptTaskServiceStart
. Esto suena terriblemente similar a NSUserScriptTask en la API de CoreFoundation. Del documento API:
La clase NSUserScriptTask puede ejecutar todos los scripts normalmente ejecutados por una de sus subclases...
https://developer.apple.com/documentation/foundation/nsuserscripttask?language=objc
Sospecho firmemente que esto es lo que usa el menú Script para ejecutar scripts. El documento API no dice nada sobre el entorno de tiempo de ejecución del script.
bash
puede iniciarse de tres maneras diferentes y la forma en que usa los archivos rc es diferente en cada caso.
Para dar una respuesta corta cuando se llama como shell de inicio de sesión, lee .profile
o .bash_profile
para configurar cosas como PATH
. Cuando se llama como un shell interactivo pero no como un shell de inicio de sesión, digamos que ejecuta bash
desde la línea de comando, luego lee ~/.bashrc
para configurar estas cosas.
Si se ejecuta desde un script de shell (o por launchctl
), entonces busca una variable de entorno BASH_ENV
y ejecuta el archivo nombrado en la variable.
Consulte https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html
Para responder a su pregunta, debe configurar todas las variables en .bashrc
, llámelo en su .bash_profile
archivo con la línea if [ -f ~/.bashrc ]; then source ~/.bashrc; fi
Finalmente, .bashrc
debe configurar la BASH_ENV
variableexport BASH_ENV='.bashrc'
Esto le daría un PATH
y así sucesivamente en todas partes.
Cuando pasa al zsh
shell, las cosas son ligeramente diferentes, lea http://zsh.sourceforge.net/Intro/intro_3.html
La mayoría de los administradores e ingenieros de Mac lo ignoran todo y codificamos la ruta a todo nuestro software en scripts. Ciertamente, nunca he visto un script de Apple que no tenga todas las rutas de herramientas codificadas.
BASH_ENV
y en qué lo estaba configurando? Sospecho que launchctl no respetará una tilde para casa, por ejemplo.~/Library/Launch Agents/bashenv.plist
que especifica launchctl setenv BASH_ENV /Users/mat/.bashrc
. También /bin/sh -c /Users/mat/.bashrc
por si acaso. • Necesito publicar otra actualización: mi suposición acerca de que NSUserScriptTask eliminaba el entorno era incorrecta. El env se pierde solo cuando se ejecutan scripts desde el menú Script en el NSStatusBar de todo el sistema. • Me pregunto si está arreglado en las ediciones más recientes de macOS. ¿Tiene unos minutos para intentar ejecutar el dump_env.sh
script en mi pregunta anterior desde el menú Script?
sin ladera
estera gessel
.bashrc
funciona bien para scripts bash. Estoy haciendo la transición de mis scripts a python, por lo que mi caso principal es que#!/usr/bin/env python3
funcione. Necesito el entorno para encontrar python3. Probé un script bash con un here-doc para python; funciona, pero eso rompe la coloración de la sintaxis del editor. Eso probablemente también rompa el depurador de python.sin ladera
bmike