Desde que me mudé zsh
de bash
mis scripts AppleScript anteriores, ya no puedo encontrar los ejecutables que están en mi ruta, a menos que use la ruta completa a los ejecutables.
¿Qué puedo hacer para seguir usando zsh
y dejar de tener que ingresar la ruta completa al ejecutable en mis scripts de AppleScript?
Siento que me falta algo de configuración para zsh
o para AppleScript.
11/05/21_14:20:53 /Users/john
$ mypath
/Users/john/.pyenv/shims
/usr/local/sbin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/opt/X11/bin
/Library/Apple/usr/bin
el script de ejemplo no funcionaba:
do shell script "pbpaste | gsed 's/\\x2D/\\xE2\\x96\\xB8/g' | LANG=en_US.UTF-8 pbcopy"
trabajando con rutas completas a execs:
do shell script "/usr/bin/pbpaste | /usr/local/bin/gsed 's/\\x2D/\\xE2\\x96\\xB8/g' | LANG=en_US.UTF-8 pbcopy"
¿Tendría algo que ver con ejecutar estos scripts primero bash
? sh
sabe dónde están los ejecutables.
sh-3.2$ which gsed
/usr/local/bin/gsed
sh-3.2$ which pbpaste
/usr/bin/pbpaste
sh-3.2$
EDIT_1: De la nota técnica de Apple TN2065
En segundo lugar, cuando usa solo un nombre de comando en lugar de una ruta completa, el shell usa una lista de directorios (conocidos como su RUTA) para intentar encontrar la ruta completa al comando. Por razones de seguridad y portabilidad, do shell script ignora los archivos de configuración que leería un shell interactivo, por lo que no obtiene las personalizaciones que tendría en Terminal. Utilice la ruta completa del comando, por ejemplo, /sbin/ifconfig en lugar de solo ifconfig. Para encontrar la ruta completa en Terminal, diga qué nombre de comando, por ejemplo, qué ifconfig; para ver la lista de lugares en los que buscará el script de shell, diga "echo $PATH" del script de shell.
Todavía no entiendo por qué todos estos scripts funcionaron sin la ruta completa cuando bash
era mi shell predeterminado y están todos rotos ahora que zsh
es mi predeterminado.
¡EDITAR_2 ESTO!
¿De dónde proviene el entorno de shell: variables de entorno, directorio de trabajo, etc.? do shell script hereda el entorno de su proceso principal, que siempre es el proceso que ejecuta el script. El entorno cubre el directorio de trabajo, cualquier variable de entorno y varios otros atributos; consulte execve(2) para obtener una lista completa. Como se mencionó en Emisión de comandos, el script de shell no lee los archivos de configuración que haría un shell interactivo que se ejecuta en Terminal.
Cualquier aplicación iniciada desde el Finder obtiene el mismo entorno predeterminado: un directorio de trabajo de / y las variables de entorno INICIO, IDIOMA, RUTA, SHELL y USUARIO. La mayoría de las aplicaciones no cambian su entorno, pero confiar en esto es un riesgo de mantenimiento.
A menos que haya hecho algo muy creativo, el Editor de secuencias de comandos se utiliza sh
para ejecutar secuencias de comandos de shell. No utiliza su shell configurado.
Eso apunta a una copia de bash
por defecto.
Cuando bash
se invoca (como shell de inicio de sesión) como sh
, solo lee /etc/profile y ~/.profile. Pero no lee archivos de inicio de lo contrario. Por lo tanto, no está leyendo ninguna configuración de shell que crea que está proporcionando.
Así que deberías simplemente heredar del sistema. Tenga en cuenta que pbpaste
se puede encontrar ya que está en /usr/bin y la ruta predeterminada incluye /usr/bin.
Como eso no funciona, se ha cambiado algo más.
sh
no lee ningún archivo de inicio, simplemente hereda el entorno del sistema.zsh
. Claramente no funcionan ahora. Ese es el enigma y por qué publiqué. Seguiré trabajando en lo que cambió para causar esto.
marc wilson
usuario3439894
PATH
al shell en undo shell script
comando son:/usr/bin:/bin:/usr/sbin:/sbin
-- Entonces, si el ejecutable no está dentro de eso,PATH
debe usar el nombre de ruta completamente calificado o deberá anteponer el (los) comando (s) con unexport PATH=\"...\";
lugar que...
representa elPATH
que desea usar. P.ej:do shell script "export PATH=\"...\"; pbpaste | gsed 's/\\x2D/\\xE2\\x96\\xB8/g' | LANG=en_US.UTF-8 pbcopy"
John
.bash_profile
y.zprofile
. Supongo que estoy confundido porque esto no fue un problema hasta que me mudé azsh
. ¿Los scripts de Apple Script almacenan rutas en metadatos cuando se crean?usuario3439894
John
usuario3439894
do shell script
utiliza un nuevo proceso de shell, por lo que el estado, como los cambios en las variables y el directorio de trabajo, no se guardan de uno a otro.John
do shell script
usash
ysh
sabe dónde están los ejecutables. Como dije, estos scripts nunca requirieron la ruta completa para ejecutarse antes y algunos de los ejecutables estaban/no están en las rutas predeterminadas del sistema.John
bash
azsh
que haría que el mismo script no pudiera encontrar un ejecutivo? ¿No puede responder, pero está dispuesto a rebajarlo?marc wilson
usuario3439894
do shell script
comando ejecuta un shell no interactivo sin inicio de sesión usando /bin/sh para interpretar su(s) comando(s). Si corresdo shell script "set"
verás con qué estás trabajando.John
usuario3439894
do shell script
comando que se ejecuta desde el Editor de scripts o desde una acción Ejecutar AppleScript en Automator .ian
/etc/profile
y~/.profile
? También puede ejecutardo shell script "env"
para ver qué está configurado, SHELL debe apuntar a zsh. Puede configurar su ruta en ~/.profile y debería ser recogido.