Recientemente descubrí que launchd
en macOS proporciona un valor predeterminado inicial $PATH
a nuevas ventanas de terminal que no es la ruta predeterminada establecida por macOS en iniciar sesión, sino que se produce por launchd
Según (presumiblemente) su propia lógica interna – sin los cambios alguna vez se han realizado a través de launchctl
o cualquier .plist
archivo que pude encontrar.
Este es el caso si usa el Terminal.app
distribuido por Apple, o un terminal de terceros como Alacritty.app
.
La ruta predeterminada en macOS en iniciar sesión, como se puede verificar con sysctl -n person.cs_path
es
/usr/bin:/bin:/usr/sbin:/sbin
Pero cuando coloqué echo $PATH
en la primera línea de ~/.zshenv
que se obtiene antes /and many others/zprofile
y cualquier otro archivo de configuración de shell, estaba viendo un completamente diferente $PATH
Al abrir una nueva ventana en Alacritty:
/usr/native/bin:/decide/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin
Que verifiqué para venir launchd
Buscando la salida de launchctl dumpstate
:
pid/72911 = {
kind = pid
originator = /Functions/Alacritty.app
creator = alacritty[72911]
...
surroundings = {
PATH => /usr/native/bin:/decide/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin
...
}
...
}
Después de reiniciar Alacritty, con solo una ventana y una instancia de la carcasa igual echo
Comando producido:
/usr/bin:/bin:/usr/sbin:/sbin
Que es lo que debería ser. Pero luego, abriendo el valor predeterminado Terminal.app
Entiendo
/usr/bin:/bin
Que, nuevamente, no es el valor predeterminado del sistema operativo.
Esto no necesariamente afecta mi capacidad de usar el caparazón porque puedo establecer $PATH
en .zshenv
o .zprofile
a lo que quiera, pero requiere que anule el $PATH
eso launchd
Conjuntos si deseo controlar el orden de búsqueda. De hecho, que launchd
lo está haciendo hace que el management de la orden de búsqueda sea essential porque aparentemente no hay garantía de que la inicial $PATH
entregado al caparazón será consistente.
¿Alguien sabe por qué launchd
está proporcionando un inconsistente $PATH
? ¿Hay alguna rima o razón para lo que determine incluir o no en el $PATH
que proporciona a cada caparazón creado con cada nueva ventana de terminal y variarla mediante la aplicación terminal?
De nuevo, tengo nunca
- emitido
launchctl setenv PATH <path>
- emitido
sudo launchctl config person <path>
oconfig system <path>
- modificado cualquiera
.plist
archivo en cualquier lugar (o encontrado cualquiera que establezca elPathEnvironmentVariable
llave).
Estoy ejecutando macOS Sequoia 15.4 (24e248) en un M2 MacBook Professional, usando el inventory ZSH Shell.
El respuesta más cercana Podría encontrar menciones que launchd
manipula el valor predeterminado $PATH
pero el autor no especifica cómo o por qué.
Actualización 1
Para la aplicación de terminal de inventory, launchctl dumpstate
está mostrando
pid/45557 = {
kind = pid
originator = /System/Functions/Utilities/Terminal.app
creator = Terminal[45557]
...
surroundings = {
PATH => /usr/bin:/bin:/usr/sbin:/sbin
...
}
...
}
Que es de hecho el correcto, predeterminado $PATH
. Sin embargo, para la aplicación de terminal de inventory, una echo $PATH
declaración en la primera línea de .zshenv
continúa resultando en el truncado
/usr/bin:/bin
Actualización 2
Los desarrolladores que trabajan en alacritty me he dicho que ellos No tocar el $PATH
variable.
Actualización 3
Con echo $PATH
Como la primera línea en .zshenv
productor
/usr/native/bin:/decide/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin
en Alacritty, y
/usr/bin:/bin
en terminal, ejecutando posteriormente
/usr/bin/env -i /bin/zsh -l -osourcetrace
por GairfowlLa sugerencia (ver comentarios) muestra lo mismo echo
Comando que sale un completamente diferente $PATH
Tanto en Alacritty como en Terminal:
+/Customers/Me/.zshenv:1> <sourcetrace> # line 1
/bin:/usr/bin:/usr/ucb:/usr/native/bin # line 2 `echo $PATH`
No hay /usr/ucb
directorio o archivo, oculto o no, que pueda encontrar. Pero dado que una búsqueda en Google de “UCB” me cube que es una referencia a la “Universidad de California, Berkeley” (y que el resultado es de env -i zsh
), ¿podría ser Zsh en sí mismo está manipulando la inicial? $PATH
? Y luego, o algo más en macOS se está transformando inconsistentemente /usr/ucb
en una de estas rutas no configuradas antes de completar echo $PATH
en la primera línea de .zshenv
y a veces informante launchd
del cambio (haciendo que aparezca en el launchctl dumpstate
producción)?
Tenga en cuenta que esas dos líneas del env
Se imprimen la salida antes /and many others/zprofile
se obtiene, por lo tanto, Apple path_helper
La utilidad aún no está en juego.
Debo señalar que en todos mis ejemplos hasta ahora el caparazón ha sido consistentemente en ambos login
y interactive
estados, verificados con setopt
.