Desde que se trasladó a zsh
de bash
mi anterior AppleScript scripts ya no puede encontrar los ejecutables que están en mi ruta, a menos que utilice la ruta completa de los ejecutables.
¿Qué puedo hacer para seguir utilizando zsh
y dejar de tener que introducir la ruta completa del ejecutable en mi AppleScript scripts?
Siento que me falta alguna 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
ejemplo script no funcionaba:
do shell script "pbpaste | gsed 's/\\x2D/\\xE2\\x96\\xB8/g' | LANG=en_US.UTF-8 pbcopy"
trabajando con rutas completas para los ejecutivos:
do shell script "/usr/bin/pbpaste | /usr/local/bin/gsed 's/\\x2D/\\xE2\\x96\\xB8/g' | LANG=en_US.UTF-8 pbcopy"
¿Tendrá algo que ver con la ejecución de estos scripts bajo bash
primero. 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 se utiliza sólo un nombre de comando en lugar de una ruta completa, el shell utiliza una lista de directorios (conocida como su PATH) para tratar de encontrar la ruta completa del comando. Por razones de seguridad y portabilidad seguridad y portabilidad, do shell script ignora los archivos de configuración que un shell interactivo leería, por lo que no se obtienen las personalizaciones que en la Terminal. Utilice la ruta completa del comando, por ejemplo /sbin/ifconfig en lugar de sólo ifconfig. Para encontrar la ruta completa en Terminal, diga qué nombre de comando, por ejemplo, qué ifconfig; para ver la lista de lugares donde do shell script buscará, diga do shell script "echo $PATH".
Todavía no entiendo por qué todos estos scripts funcionaban sin la ruta completa cuando bash
era mi shell por defecto y están todos rotos ahora que zsh
es mi opción por defecto.
EDIT_2 ¡ESTO!
De dónde viene el entorno del shell - variables de entorno, ¿directorio de trabajo, etc.? do shell script hereda el entorno de su proceso padre, que es siempre el proceso que ejecuta el script. El entorno cubre el directorio de trabajo, cualquier variable de entorno y otros atributos - vea execve(2) para una lista completa. lista completa. Como se mencionó en Emisión de comandos, do shell script no lee los archivos de configuración que un shell interactivo ejecutado en Terminal lo haría.
Cualquier aplicación lanzada desde el Finder obtiene el mismo entorno por defecto por defecto: un directorio de trabajo de / y las variables de entorno HOME, LANG, PATH, SHELL y USER. La mayoría de las aplicaciones no cambian su entorno, pero confiar en esto es un riesgo de mantenimiento.
0 votos
Porque sea como sea que estés invocando estos scripts no establece la ruta que tú crees. ¿Cuál es la ruta mientras se ejecuta uno de estos? ¿Dónde se establece la ruta y cómo se invoca a estos scripts?
0 votos
El valor por defecto
PATH
pasa a la shell en undo shell script
comando es:/usr/bin:/bin:/usr/sbin:/sbin
-- Así que si el ejecutable no está dentro de esePATH
es necesario utilizar el nombre de ruta completamente calificado o necesitará anteponer el comando(s) con unexport PATH=\"...\";
donde...
representa elPATH
quieres usar . Por ejemplodo shell script "export PATH=\"...\"; pbpaste | gsed 's/\\x2D/\\xE2\\x96\\xB8/g' | LANG=en_US.UTF-8 pbcopy"
0 votos
Ya veo. Mirando la nota técnica de Apple TN2065 hay algo de información. Lo estoy invocando usando script Editor en la barra de menú del Finder. Mis rutas se establecen en ambos
.bash_profile
y.zprofile
. Supongo que estoy confundido porque esto no era un problema hasta que me mudé azsh
. ¿Los script script de Apple almacenan las rutas en los metadatos cuando se crean?0 votos
@user3439894 el shell puede almacenar las rutas de los comandos utilizados recientemente. Estaba reflexionando sobre eso. Me preguntaba si desde que ejecuté el script bajo bash y funcionó podría haber guardado las rutas,,, pero eso no tiene sentido. Las rutas no han cambiado. He añadido más en el post.
0 votos
Cada invocación de
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 guarda de uno a otro.0 votos
@user3439894 He añadido más información en el post original. Algo parece estar fuera de lugar.
do shell script
utilizash
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 no estaban/están en las rutas por defecto del sistema.0 votos
Ni una sola persona puede responder a la pregunta y, sin embargo, están encantados de marcarla. ¿Qué ha cambiado entre el paso de
bash
azsh
que provocaría que el mismo script no pudiera encontrar un exec? No puedo responder pero estoy dispuesto a marcarlo?0 votos
Cambiar tu shell interactivo preferido no tiene nada que ver. Tu ejemplo script sin duda encuentra pbpaste perfectamente pero no encuentra gsed. Además... ¿hay alguna razón por la que necesites usar GNU sed?
1 votos
El
do shell script
comando ejecuta una shell no interactivo y no de inicio de sesión usando /bin/sh para interpretar su(s) comando(s). Si ejecutado shell script "set"
verá con qué está trabajando.0 votos
@MarcWilson He respondido a tus preguntas en el tercer comentario
0 votos
@MarcWilson, sólo me refiero a la
do shell script
comando correr de script Editor o de un Ejecutar AppleScript acción en Automatizador .0 votos
¿Qué hay en
/etc/profile
y~/.profile
? También puede ejecutardo shell script "env"
para ver lo que se establece, SHELL debe apuntar a zsh. Puedes establecer tu ruta en ~/.profile y debería ser recogida.