instalar - zsh-autosuggestions
Cómo editar la variable de ruta en ZSH (3)
En mi .bash_profile tengo las siguientes líneas:
PATHDIRS="
/usr/local/mysql/bin
/usr/local/share/python
/opt/local/bin
/opt/local/sbin
$HOME/bin"
for dir in $PATHDIRS
do
if [ -d $dir ]; then
export PATH=$PATH:$dir
fi
done
Sin embargo, intenté copiar esto en mi .zshrc y no se está configurando $PATH
.
Primero puse sentencias echo
dentro de la función "si el directorio existe" y descubrí que la sentencia if se estaba evaluando como falsa, incluso para directorios que claramente existían.
Luego eliminé la verificación del directorio existente, y la $PATH
se estaba configurando incorrectamente de esta manera:
/usr/bin:/bin:/usr/sbin:/sbin:
/usr/local/bin
/opt/local/bin
/opt/local/sbin
/Volumes/Xshare/kburke/bin
/usr/local/Cellar/ruby/1.9.2-p290/bin
/Users/kevin/.gem/ruby/1.8/bin
/Users/kevin/bin
Ninguno de los programas en los directorios inferiores fue encontrado o ejecutado.
¿Qué estoy haciendo mal?
¿Aún no está seguro de cuál fue el problema (quizás nuevas líneas en $ PATHDIRS)? pero cambiando a la sintaxis de matriz zsh lo arregló:
PATHDIRS=(
/usr/local/mysql/bin
/usr/local/share/python
/usr/local/scala/scala-2.8.0.final/bin
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin
/opt/local/etc
/opt/local/bin
/opt/local/sbin
$HOME/.gem/ruby/1.8/bin
$HOME/bin)
y
path=($path $dir)
A diferencia de otros shells, zsh no realiza la división de palabras o el globo después de la sustitución de variables. Por lo tanto, $PATHDIRS
expande a una sola cadena que contiene exactamente el valor de la variable, y no a una lista de cadenas que contiene cada parte separada del valor delimitada por espacios en blanco.
Usar una matriz es la mejor manera de expresar esto (no solo en zsh, sino también en ksh y bash).
pathdirs=(
/usr/local/mysql/bin
…
~/bin
)
for dir in $pathdirs; do
if [ -d $dir ]; then
path+=$dir
fi
done
Debido a que probablemente no vaya a referirse a los pathdirs
más adelante, podría escribirlo en línea:
for dir in /
/usr/local/mysql/bin /
… /
~/bin
; do
if [[ -d $dir ]]; then path+=$dir; fi
done
Incluso hay una forma más corta de expresar esto: agregue todos los directorios que le gustan a la matriz de path
, luego seleccione los que existen.
path+=/usr/local/mysql/bin
…
path=($^path(N))
El calificador N
glob selecciona solo las coincidencias que existen. Agregue el -/
a la lista de calificadores (es decir, (-/N)
o (N-/)
) si le preocupa que uno de los elementos pueda ser algo más que un directorio o un enlace simbólico a uno (por ejemplo, un enlace simbólico roto) ). El indicador de expansión del parámetro ^
garantiza que el calificador global se aplique a cada elemento del arreglo por separado.
También puede usar el calificador N
para agregar un elemento solo si existe. Tenga en cuenta que necesita que se realicen globos, por lo que la path+=/usr/local/mysql/bin(N)
no funcionaría.
path+=(/usr/local/bin/mysql/bin(N-/))
Puedes poner
setopt shwordsplit
en su .zshrc
. Entonces zsh realizará la división del mundo como lo hacen todos los shells de Bourne. Que el valor predeterminado parezca ser noshwordsplit
es una característica errónea que causa que muchos se rasquen la cabeza. Me sorprendería si no fuera un FAQ. Veamos ... yup: http://zsh.sourceforge.net/FAQ/zshfaq03.html#l18 3.1: ¿Por qué $ var donde var = "foo bar" no hace lo que espero?