Corrección de la configuración de ruta en el archivo ~ / .profile

11

Hay una línea en la ~/.profileque está

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

No estoy seguro de lo último i.

  • ¿Debo eliminarlo?
  • ¿No es un error de sintaxis?
Sonrisa
fuente
44
@dessert No estoy seguro de que sea un duplicado. Estoy de acuerdo en que ambos son sobre la $PATHvariable de entorno, pero no son duplicados en absoluto. A lo sumo, están relacionados. Esta pregunta es un problema en el ~/.profileque resulta ser un personaje adicional en la línea donde $PATHse asigna el entorno.
Dan
@Dan La respuesta más votada (!) En la pregunta duplicada explica cómo una PATH=línea ~/.profiledebería ser válida, que es la pregunta real aquí.
postre
1
@dessert lo que tiene el OP aquí es perfectamente válido, no es un problema de un formato no válido. Esto funciona, simplemente no hace nada útil.
terdon
2
Sí, uso el editor vi. Posiblemente puse accidentalmente la 'i' en el archivo como dijo el postre. Pero luego tuve que: wq para hacerlo efectivo. Creo que no lo hice, pero teniendo en cuenta mi nivel, podría haber hecho algo estúpido.
Sonríe el

Respuestas:

13

No, no es un error de sintaxis; es solo una letra que se agrega después de la expansión de $PATH, porque el shell elimina las comillas ...

$ PATH="$HOME/bin:$HOME/.local/bin:$PATH"i
$ echo $PATH
/home/zanna/bin:/home/zanna/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bini

Entonces, además de anteponer directorios locales, ha eliminado efectivamente lo existente /snap/binde mi RUTA y ha agregado lo inexistente /snap/bini.

Puede quitar el ipara reparar su RUTA.

Para ver el cambio, deberá cerrar sesión y volver a source ~/.profileiniciarla o ejecutarla en cualquier shell que esté utilizando (o iniciar el shell con bash -l), porque solo .profilese lee mediante shells de inicio de sesión .

Si no realizó este cambio usted .profilemismo, puede restaurar el archivo predeterminado ejecutando

mv ~/.profile{,.old}
cp /etc/skel/.profile ~/.profile

Esto cambia el nombre del antiguo .profile .profile.old(también puede eliminar el archivo si lo desea) y lo reemplaza con la versión predeterminada de su sistema /etc/skel.

Zanna
fuente
5

Creo que aquí no está claro qué significa la siguiente expresión:

PATH="$HOME/bin:$HOME/.local/bin:$PATH"i

La primera parte PATH=significa que asignamos un nuevo valor a la variable (entorno) $PATH.

La segunda parte es el nuevo valor de esa variable. En el caso actual, la variable $HOMEse expandirá con su valor actual y a ese valor se le agregará la cadena /bin:. Lo mismo ocurre con la siguiente parte de la cadena $HOME/.local/bin:. Finalmente, el valor actual (anterior) de la $PATHvariable se expandirá y agregará. El colon :desempeña un papel de delimitador en la PATHexpresión.

El objetivo final es escribir: PATH=<some additional paths>+<the the current value of $PATH>. Ponemos estas rutas adicionales delante de la cadena, porque queremos que el shell busque ejecutables primero en estas ubicaciones y solo luego en todo el sistema.

El personaje ies innecesario. Se agregará al nuevo valor de $PATHy hará un desastre, como @Zanna explica en su respuesta .

pa4080
fuente
5

Sí, es un error de sintaxis, el real .profiledebería verse así a menos que haya cambiado las cosas (esta es la versión 17.10, vea las notas a continuación):

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Esto podría verse diferente en versiones anteriores de Ubuntu donde la comprobación de si el bindirectorio de usuarios está presente no se incluyó en el .profile. La forma más fácil de comprobar cómo debería ser es echar un vistazo /etc/skel/.profile.

Entonces, para agregar lo que solicitó en su comentario, simplemente coloque esto al final de su archivo de perfil:

# Manual addition for swift development snapshot
export PATH="$PATH:/home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin"

Si alguna vez arruinas tu perfil por completo, hay una copia desde donde puedes obtener uno nuevo /etc/skel/.

Videonauth
fuente
1
Tengo una línea adicional "export PATH = $ PATH: /home/jeremy/swift-4.0-DEVELOPMENT-SNAPSHOT-2017-06-29-a-ubuntu16.04/usr/bin" porque lo instalé. ¿¿Está bien??
Sonríe el
3
Esta línea está bien, la incluí en mi ejemplo para mostrar dónde colocarla.
Videonauth
1
Tenga en cuenta que /etc/skel/.profileen 16.04 se ve diferente, sin una prueba de si "$HOME/bin"existe. Incluso si esa fuera una mejor variante (IMO), parece haber cambiado de nuevo en 17.10, por una razón o por error.
Gunnar Hjalmarsson
@GunnarHjalmarsson notará que en mi publicación, y sí, este es el skel / .profile de 17.10 en el que estoy corriendo.
Videonauth