Apri la finestra del terminale con le variabili di ambiente predefinite (incluso "PATH")

3

Sto provando a creare un file .command che aprirà una finestra di terminale con le variabili d'ambiente predefinite (incluso PATH ).

Ho provato questo:

#!/bin/bash

# Adding CMake to Path
export PATH=$PATH:/Users/Shared/CMake/CMake.app/Contents/bin/:

# Adding Ninja to Path
export PATH=$PATH:/Users/Shared/Ninja/:

# Adding GCC to Path
export PATH=$PATH:/usr/local/gcc-8.2/bin/:

echo Path Updated

Tuttavia quando faccio doppio clic su Finder ottengo questo:

Path Updated
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
Deleting expired sessions...none found.

[Process completed]

Ovviamente è sparito.

È un modo per avere un file che faccia quanto segue (Forse deve essere 2 file diversi, non lo so):

  1. Se cliccato dal finder si aprirà una nuova finestra di terminale con tutte le variabili definite / aggiornate (compreso il PATH ).
  2. Se eseguito da terminale aggiornerà lo stato terminale corrente.

Qualche idea?

    
posta Royi 04.09.2018 - 21:40
fonte

1 risposta

6

Devi avviare esplicitamente una shell bash interattiva alla fine dello script per mantenere la finestra aperta quando apri il file .command da Finder.

La seguente revisione del tuo script lo dimostra e semplifica anche altri aspetti del tuo codice:

#!/bin/bash

# Note: $PATH already exists as an exported variable, assigning to it
#       again preserves that status, so there's no need to call 'export' below.

# Adding CMake to Path
PATH+=:/Users/Shared/CMake/CMake.app/Contents/bin/

# Adding Ninja to Path
PATH+=:/Users/Shared/Ninja/

# Adding GCC to Path
PATH+=:/usr/local/gcc-8.2/bin/

cat <<EOF
Path updated to:

  $PATH

Starting interactive Bash shell...
EOF

# Start an interactive Bash shell that inherits this script's environment
# and keeps the window open.
# Using -l makes the interactive shell a login shell, which makes it
# load the same initialization files as shells created by Terminal.app,
# notably, ~/.bash_profile
# Be sure that ~/.bash_profile doesn't override $PATH.
exec bash -l

Questo file .command sarà anche da una finestra terminale esistente, ma tieni presente che entrerai in una shell child interattiva - exit ing da quella shell figlio ritorno a quello originale.

È possibile modificare lo script in modo tale che se lo si richiama da una finestra di terminale esistente (shell), modifica l'ambiente della shell direttamente , ma poi si deve source / . lo script su invocazione (ad es. . ./script.command ):

#!/bin/bash

# Note: $PATH already exists as an exported variable, assigning to it
#       again preserves that status, so there's no need to call 'export' below.

# Adding CMake to Path
PATH+=:/Users/Shared/CMake/CMake.app/Contents/bin/

# Adding Ninja to Path
PATH+=:/Users/Shared/Ninja/

# Adding GCC to Path
PATH+=:/usr/local/gcc-8.2/bin/

# Determine if this script is being sourced.
[[ $0 != "$BASH_SOURCE" ]] && sourced=1 || sourced=0

cat <<EOF
Path updated to:

  $PATH

EOF

if (( sourced )); then # sourced from the calling shell.
  # The calling shell's environment has been modified - nothing more to do.
  :
else # otherwise: launched from Finder or from a terminal without sourcing
  # A new interactive shell must be launched for the environment modifications
  # to take effect and, if launched from Finder, to keep the terminal window
  # open.
  echo "Starting new interactive Bash shell with modified environment..."
  # Using -l makes the interactive shell a login shell, which makes it
  # load the same initialization files as shells created by Terminal.app,
  # notably, ~/.bash_profile
  # Be sure that ~/.bash_profile doesn't override $PATH.
  exec bash -l
fi 
    
risposta data 04.09.2018 - 23:21
fonte

Leggi altre domande sui tag