Abrir ventana de terminal con variables de entorno predefinidas (incluyendo 'PATH')

3

Estoy intentando crear un archivo .command que abrirá una ventana de terminal con variables de entorno predefinidas (incluido PATH ).

He intentado esto:

#!/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

Sin embargo, cuando hago doble clic en Finder obtengo esto:

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

[Process completed]

Es decir, se ha ido.

Es la forma de tener un archivo que haga lo siguiente (quizás tenga que ser 2 archivos diferentes, no sé):

  1. Si se hace clic desde el buscador, se abrirá una nueva ventana de terminal con todas las variables definidas / actualizadas (incluido el PATH ).
  2. Si se ejecuta desde el terminal, se actualizará el estado actual del terminal.

¿Alguna idea?

    
pregunta Royi 04.09.2018 - 21:40

1 respuesta

6

Debe iniciar explícitamente un shell interactivo bash al final de su secuencia de comandos para mantener la ventana abierta cuando abra el archivo .command desde el Finder.

La siguiente revisión de su script lo demuestra y también agiliza otros aspectos de su código:

#!/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

Este archivo .command también se abrirá desde una ventana terminal existente, pero tenga en cuenta que ingresará un shell secundario interactivo - exit ing desde ese shell secundario regresa a ti al original.

Es posible modificar su secuencia de comandos de modo que si lo invoca desde una ventana de terminal (shell) existente, modifique el entorno de la shell directamente , pero luego tendrá que source / . el script en la invocación (por ejemplo, . ./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 
    
respondido por el mklement0 04.09.2018 - 23:21

Lea otras preguntas en las etiquetas