¿Qué significa export PATH = something: $ PATH?

27

Soy muy nuevo en Linux y pongo el siguiente comando al final del archivo .profileen mi carpeta de inicio:

export PATH="~/.composer/vendor/bin:$PATH"

Conozco un poco los problemas de las variables de entorno y sus valores de Windows, pero en este caso quiero entender qué hace este comando y cuáles son las partes que lo componen:

  1. ¿Qué es esta frase de "exportación" al principio? ¿Exporta los datos para que estén disponibles para Bash?

  2. ¿Cuál es el primero PATHy cuál es el segundo $PATH, y por qué necesitamos dos?

JohnDoea
fuente
Dejando de lado algunas diferencias técnicas entre los sistemas operativos, es equivalente a este proceso en Windows: windowsitpro.com/systems-management/…
Two-Bit Alchemist
1
"exportar" hace que el cambio sea visible para los nuevos programas lanzados por bash.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen: no, eso sucede independientemente de si usa el exportcomando, porque la PATHvariable ya está marcada como exportada. (¡Pruébelo en ambos sentidos si no me cree!)
David

Respuestas:

39

¿Qué es esta frase de "exportación" al principio?

exportes un comando (más precisamente, es un Bash incorporado , es decir, no es un presente ejecutable PATH, es un comando que Bash ha incorporado en sí mismo).

¿Exporta los datos para que estén disponibles para Bash?

exportestablece la variable de entorno en el lado izquierdo de la asignación al valor en el lado derecho de la asignación; dicha variable de entorno es visible para el proceso que la configura y para todos los subprocesos generados en el mismo entorno, es decir, en este caso para la instancia de Bash que las fuentes ~/.profiley para todos los subprocesos generados en el mismo entorno (que pueden incluir, por ejemplo, también otros shells , que a su vez podrá acceder a él).

¿Cuál es el primero PATHy cuál es el segundo $PATH, y por qué necesitamos dos?

La primera, PATHcomo se explicó anteriormente, es la variable de entorno que se establecerá usando export.

Como PATHnormalmente contiene algo cuando ~/.profilese obtiene (de forma predeterminada, contiene /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), simplemente configurando PATHa ~/.composer/vendor/binharía PATHsolo contener ~/.composer/vendor/bin.

Entonces, dado que las referencias a una variable en un comando son reemplazadas por (o "expandidas" a) el valor de la variable por Bash en el momento de la evaluación del comando , :$PATHse coloca al final del valor que se asignará para PATHque PATHtermine conteniendo ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( es decir, lo que PATHya contiene más ~/.composer/vendor/bin:al comienzo).

kos
fuente
Explicación fabulosa.
Choylton B. Higginbottom
16

https://help.ubuntu.com/community/EnvironmentVariables probablemente te ayudará. También man bashpuede ser muy útil para entender cómo funciona eso (al menos en Bash)

De todos modos, PATH=básicamente está configurando la PATHvariable, agregando algunas rutas nuevas para buscar, agregando al final rutas ya establecidas previamente, con $PATH(que es básicamente una referencia a la PATHvariable).

Entonces, digamos que PATHhasta ahora estaba configurado para algo como:

PATH="x:y:z"

y luego estableces

PATH="a:b:c:$PATH"

tu PATHdespués de eso será como:

a:b:c:x:y:z

Espero que tenga sentido.

Y además, exporta la nueva variable para que sea conocida en su entorno, incluidos también los procesos / subcapas secundarios.

Solo tenga en cuenta también que el orden de los directorios tal como se establece PATHpuede ser importante. Y algo así PATH="$PATH:a:b:c"te dará el resultado:

x:y:z:a:b:c

lo que afectará el orden de los directorios / rutas mientras busca un comando (si tiene su comando en más de uno de los directorios, se utilizará el primero encontrado, lo que a veces puede dar algunos resultados inesperados).

Jacek
fuente
2

Aquí está el comando para que todos puedan seguirlo a medida que avanzan por las viñetas. export PATH="~/.composer/vendor/bin:$PATH"

  • exportEl /bin/exportcomando shell incorporado (lo que significa que no hay , es una cosa de shell) básicamente hace que las variables de entorno estén disponibles para otros programas llamados desde bash(vea la pregunta vinculada en Lectura adicional) y las subcapas.
  • La asignación en shell tendrá expansión primero, luego la asignación tendrá lugar en segundo lugar. Entonces, lo que está dentro de las comillas dobles se expande primero y luego se guarda en la PATHvariable.
  • $PATHes la PATHasignación predeterminada (o al menos el aspecto de la variable hasta que este comando aparece en su .bashrco .profile), y expandirla.
  • ~/.composer/vendor/binse expandirá a /home/username/.composer/vendor/bin, donde .composerestá la carpeta oculta debido al punto inicial.
  • Ese corto ~/.composer/vendor/bin:$PATHahora se ha transformado en una larga lista de carpetas, separadas por :. Todo está encerrado entre comillas dobles para que incluyamos carpetas con espacios en su camino.
  • Finalmente todo se almacena en PATHcomandos variables y externos permitidos para usarlo

Ejemplo simple

Mi shell interactivo es en realidad mksh, que también tiene exportincorporado. Al usar exportpara establecer VAR, mi variable se puede pasar y usar por la cadena posterior de comandos / subprocesos, donde exporté esa misma variable

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

Lectura extra

Sergiy Kolodyazhnyy
fuente
3
No, la ~de ~/.composer/vendor/binque no se ampliará! La tilde solo se expande en algunos lugares especiales, como directamente después de la =señal. PATH="~/.foo:$PATH"resultados en ~/.foo:/other/path/dirs.... Pero ~se expandiría en PATH=~"/.foo:$PATH", lo que da como resultado /home/user/.foo:/other/path/dirs....
Volker Siegel
2

He leído aquí y en otros lugares de la web, hablé con un amigo sobre esto y decidí que como estudiante de primer año (tal vez más de un estudiante de primer año de Ubuntu que algunos aquí podrían pensar), debería mapear este comando: debería hacer un mapa y por lo tanto, aprenda qué es y dónde está:

Datos preliminares

Si por ahora no entendió algo en este capítulo, no se preocupe, será más claro a medida que continúe leyendo, pero para comprender este asunto, debe leer sobre las variables de entorno (EV), sus valores y propósito. . Ahora trataré de explicar el comando en palabras simples y en un método de mapeo, para los recién llegados como yo, y solo para los recién llegados. Intenté hacer lo mejor aquí ...

Cartografía

export PATH="~/.composer/vendor/bin:$PATH"

El valor original del EV "PATH" como viene con Ubuntu 15.10 es:

/usr/bin:/usr/sbin

En la nota del comando en sí, tenemos dos frases PATH. El último es $ PATH - El $ dice "imprime el valor o valores originales del EV a tu lado"; El EV al lado es el PATH EV.

Exportamos la variable de ruta en sí (también la pusimos a disposición para subprocesos, procesos de IE que se ejecutan en la CLI que no son en realidad el shell Bash, sino que se ejecutan dentro de ella (como Drush , que es la CLI de Drupal ).

Además de la exportación, también lo expandimos: la primera frase PATH (PATH =) nos usó para agregar un valor adicional (~ / .composer / vendor / bin :) al valor original (representado por $ PATH).

  • Los dos puntos (:) al final del nuevo valor que mencioné en el párrafo anterior, se utilizan para distinguir el nuevo valor del original.

  • Los "" son el área en la que residen los valores.

  • El ~ es la carpeta de inicio.


Espero que después de este mapeo que hice, el comando sea más claro para los estudiantes de primer año como yo.

JohnDoea
fuente
1

El exportcomando hace que las variables estén disponibles en subcapas. Es decir, sin ella, la variable PATHno sería visible en subcapas.

PATH se menciona dos veces:

  • Como variable se le asigna el valor, a la izquierda del =signo.
  • Como nombre de variable reemplazado por su valor a la derecha del =signo. Esto hace que el antiguo valor sea parte del nuevo valor.
rexkogitans
fuente
1
"Es decir, sin ella, la variable PATHno sería visible en subcapas". Esto es incorrecto; PATHes una variable de entorno (que no es lo mismo que una variable de shell ), por lo que se exporta automáticamente y el exportcomando no es necesario.
David
La familia de shell Bourne no distingue realmente entre variables de entorno y shell. ( sc.tamu.edu/help/general/unix/vars.html ) En mi sistema (Arch Linux), bash ni siquiera conoce el setenvcomando.
rexkogitans
1
Todavía hay una diferencia entre las variables de entorno que el núcleo conoce y las variables de shell que son internas de bash. Dado que se PATHorigina en el entorno, se exporta automáticamente, por lo que no necesita ejecutar exportpara que los cambios se propaguen a los procesos secundarios (al contrario de lo que dice la página que ha vinculado).
David
Las variables de entorno no son una propiedad del núcleo, sino del proceso. Dado que el proceso del que estamos hablando aquí es sh, bash (¿Ubuntu usa zsh?), Creo que podemos dejar que sean iguales a las variables de shell. Pero, por supuesto, las variables de shell no se pasan a ningún programa aleatorio como lo son las variables de entorno.
rexkogitans
Creo que estamos atascados en la semántica en este momento. Todo lo que intentaba decir era que en bash, PATH=fooy que export PATH=footenía un comportamiento idéntico.
David
0
export PATH="~/.composer/vendor/bin:$PATH"
  1. El exportes un comando buildin de bash, significa exportar variables para que sean variables de entorno. (podría escribir help exportpara inclinarse más

    (los caracteres que siguen el comando son parámetros, divididos por el espacio, por lo que en este caso, solo hay un parámetro)

  2. El PATHes el nombre de la variable, generalmente, predefinido varibale por bash, se nombrará en mayúsculas.

  3. los =medios asignan valor a esta variable.

  4. toda la cadena es el valor de la variable

  5. el $PATHes un tipo de Funciton de fiesta, llamada variable expantion, golpe del reemplazará el valor del existir PATHen la serie de parámetros, ANTES enviar la cadena de exportcomando

  6. el :en un carácter especial en la variable RUTA y subestimado por todas las aplicaciones que desean utilizar esta variable. Significa separador. por lo que tendrán muchos directorios en la variable PATH.

primavera amorosa
fuente