Come viene calcolato esattamente il PERCORSO?

1

Ho letto una dozzina di risposte diverse e ho parlato con un gruppo di persone e ho difficoltà a capire come viene calcolato il PERCORSO in diversi scenari. In particolare sto pensando

  1. Come viene calcolato esattamente il PERCORSO per bash?
  2. Come viene calcolato esattamente per altre shell? (Presumo che sia dipendente dalla shell, ma qual è la comunanza tra tutte le shell?)
  3. Come viene calcolato esattamente per le app della GUI?
  4. Mi manca un altro modo di lanciare cose? I demoni fanno qualcosa di diverso? (Io non la penso così? Ma forse ...)

Inoltre ora sono su High Sierra ma vedo che alcune persone hanno detto che questo è cambiato a un certo punto?

Ho visto questa risposta e questo ma entrambi sembrano essere focalizzati esplicitamente su ciò che accade all'interno di bash.

    
posta George Mauer 31.08.2018 - 16:29
fonte

3 risposte

5

Ho intenzione di raggruppare insieme 1 & 2 perché tutte le shell leggono i file all'avvio.

PATH è ereditato dal suo processo genitore. Questo è un concetto chiave che devi capire.

Il PATH è prima codificato nel kernel:

sysctl user.cs_path
user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin

launchd che funge da init può essere configurato per cambiare questo PATH. Generalmente non è cambiato.

loginwindow.app imposterà un ambiente quando accedi al tuo computer. PATH verrà controllato che è stato impostato o sarà impostato sul percorso hard coded nel kernel o su un percorso modificato impostato da launchd. È come se il loginwindow.app chiamasse login -pf <username> .

A questo punto, un utente LaunchAgent o LaunchDaemon può modificare il PERCORSO.

Questo sarà il PERCORSO disponibile per le applicazioni GUI dal Finder. (Le prime versioni di OS X potevano usare ~ / .MacOSX / environment.plist per cambiare il PATH per le applicazioni GUI). Ora se questo sembra complicato, non lo è e più probabilmente, come me, il PERCORSO disponibile è /usr/bin:/bin:/usr/sbin:/sbin

Quando avvii Terminal.app, per prima cosa chiama login (login -pf) che attiva la tua shell come una shell di login. Vengono letti i file appropriati in / etc e la cartella HOME. Ora, PATH dovrebbe essere diverso da quello impostato da loginwindow.app. Ricorda che abbiamo parlato dell'eredità? Se si avvia un'applicazione GUI dalla sessione del terminale, il PATH disponibile per l'applicazione GUI sarà lo stesso impostato dalla shell.

Per quanto riguarda i daemon, di solito sono avviati dal loro percorso assoluto.

    
risposta data 31.08.2018 - 18:23
fonte
3

Dalla pagina man di PATH ( man path ):

The search path for commands. It is a colon-separated list of directories in which the shell looks for commands (see COMMAND EXECUTION below)....The default path is system-dependent, and is set by the administrator who installs bash. A common value is ''/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin''.

Quindi, da quello tranne dalla pagina man di bash, vediamo che il percorso bash è (inizialmente):

  • dipendenti dal sistema e non dipendenti dalla shell
  • impostato da colui che ha installato bash (in questo caso Apple)
  • ha un valore predefinito

Il percorso può (ovviamente) essere modificato. Esistono diversi luoghi in cui è possibile impostare la variabile d'ambiente PATH:

  • ~/.bashrc
  • ~/.bash_profile

In macOS, il file /etc/paths viene utilizzato per configurare i percorsi di ricerca:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Inoltre, il percorso è inizialmente configurato dall'utilità /usr/libexec/path_helper che creerà un percorso basato sul contenuto di /etc/paths.d

Viene chiamato da /etc/profile che imposta il profilo bash di sistema (i singoli sono impostati in ~/.profile )

Per quanto riguarda le app GUI, il percorso della shell non ha alcun effetto. L'unica volta che un'applicazione GUI (Cocoa, Quartz, Metal) ha qualcosa a che fare con PATH è quando apre una shell (interattiva o non interattiva). A quel punto utilizzerà l'ambiente PATH come impostato o apporterà le modifiche necessarie in fase di esecuzione.

Gusci diversi

Ciascuna shell ha un profilo di sistema diverso (come bash) che imposta il PATH iniziale (chiamando l'utilità path_helper )

  • Zsh = /etc/zprilfe
  • Ksh = /etc/profile
  • Csh = /etc/csh.login
risposta data 31.08.2018 - 16:50
fonte
0

Tutti: per favore comprendi che Apple ha cambiato il paradigma Paths nel tempo in Sierra (vedi link ), HighSierra e Mojave. Path_helper ora funziona in qualche modo in modo diverso, sembra perché ha bloccato per me le finestre terminali che posso liberare e che funzionano bene commentando

# if [ -x /usr/libexec/path_helper ]; then
#   eval '/usr/libexec/path_helper -s'
#  fi

in /etc/profile .

Ho degli script che risolvono il percorso perché ho diversi strumenti che funzionano (il nucleo di essi è installato da Homebrew, ma questo è solo circa 15 dei 25 che uso ogni giorno) e questi devono essere impostati per l'uso nelle applicazioni .app, negli script di avvio .sh e per l'avvio automatico nella sequenza di avvio protetta sotto Mojave. È confuso, ma di certo Mojave ha cambiato la struttura richiesta e ho bisogno di farlo da solo.

Ciò che questo significa per questa particolare domanda è che la domanda è pertinente in tutta la sua ampiezza e che deve essere risolta dagli sviluppatori che hanno sentito il dolore e hanno fissato i loro sistemi per Mojave, e provengono anche dai vari "mondi" come normali IDE, XCode, Eclipse, Bean, Intellij, ecc. Inoltre, quelli che dipendono dagli stack homebrew, dagli stack di mamp, ecc. E per coloro che stanno facendo docker, .node, vm, ecc. funzionano, e altri strumenti più profondi . Mentre Apple implementa una maggiore sicurezza, le nostre cose si romperanno, ma sono felice che Apple stia facendo il loro lavoro. Dobbiamo fare il nostro, quindi abbiamo bisogno di gente all'avanguardia per passare la nuova saggezza. Gli articoli di 6 o più mesi ci confonderanno.

    
risposta data 12.01.2019 - 03:26
fonte

Leggi altre domande sui tag