¿Cómo eliminar espacios en blanco/eols ASCII de la variable en bash?

¿Cómo eliminar espacios en blanco/eols ASCII de la variable en bash?

Intenté lo siguiente:

export PATH=>>-
$HOME/.cargo/bin:
$HOME/.bkaradzic/bx/tools/bin/linux:
$HOME/.bkaradzic/bimg/tools/bin/linux:
$HOME/.dotnet:
$HOME/.android-ndk-r17b:
$PATH

export PATH=${PATH//$'\r'/}
export PATH=${PATH//$'\n'/}
export PATH=${PATH//$'\x20'/}

Y todavía

-bash: /home/hydroper/.cargo/bin:: No such file or directory
-bash: /home/hydroper/.bkaradzic/bx/tools/bin/linux:: No such file or directory
-bash: /home/hydroper/.bkaradzic/bimg/tools/bin/linux:: No such file or directory
-bash: /home/hydroper/.dotnet:: No such file or directory
-bash: /home/hydroper/.android-ndk-r17b:: No such file or directory

¿Alguna sugerencia?

Respuesta1

Parece pensar que la primera línea iniciará una expansión del camino. Esto no es verdad. La primera línea es un comando completo.

export PATH= >> -

La línea anterior, escrita con algunos espacios para una mejor comprensión, establecerá PATHuna cadena vacía y agregará la salida del comando al archivo -.

La siguiente línea es el siguiente comando.

$HOME/.cargo/bin:

Esto se expande al nombre de un directorio que probablemente exista en su sistema, más los dos puntos. El resultado es

-bash: /home/hydroper/.cargo/bin:: No existe tal archivo o directorio

Respuesta2

Parece que quieres algo como:

export PATH="$(paste -sd : - << EOF
$HOME/.cargo/bin
$HOME/.bkaradzic/bx/tools/bin/linux
$HOME/.bkaradzic/bimg/tools/bin/linux
$HOME/.dotnet
$HOME/.android-ndk-r17b
$PATH
EOF
)"

paste -ses el comando para unir todas las líneas de un archivo (con el separador provisto con -d; -significahazlo para stdin en lugar de un archivo real, -se puede omitir con algunas implementaciones, pero eso no es estándar/portátil).

Para responder a su pregunta sobre cómo eliminar espacios en blanco, en ksh93/ mksho bash:zsh

PATH=${PATH//[[:space:]]}

eliminaría todos los caracteres de espaciado, incluidos los ASCII, incluido el carácter de nueva línea. La lista de caracteres coincidentes depende de la configuración regional y del sistema (por ejemplo, no todos los sistemas incluyen el espacio sin separación), pero siempre se incluyen todos los caracteres ASCII (TAB, LF, VT, FF, CR, SPC).

Para incluir ese carácter de nueva línea $PATHen primer lugar, habrías necesitado:

export PATH="
$HOME/.cargo/bin:
$HOME/.bkaradzic/bx/tools/bin/linux:
$HOME/.bkaradzic/bimg/tools/bin/linux:
$HOME/.dotnet:
$HOME/.android-ndk-r17b:
$PATH"

>>es un operador de redirección de salida, es posible que se confunda con los operadores <<o <<-aquí-doc. Pero incluso entonces, <<y <<-son para redirigir la entrada, por lo que aún deberá usarlo en un comando que lea su entrada como pasteen el ejemplo anterior y usar la sustitución de comandos ( $(...)en el ejemplo anterior) para que se pase la salida de ese comando. como argumento para export.

Tenga en cuenta que también puede hacer:

export PATH="\
$HOME/.cargo/bin:\
$HOME/.bkaradzic/bx/tools/bin/linux:\
$HOME/.bkaradzic/bimg/tools/bin/linux:\
$HOME/.dotnet:\
$HOME/.android-ndk-r17b:\
$PATH"

Dentro de comillas dobles (y necesita las comillas dobles para $HOMEexpandirlas), puede usarlas \al final de la línea para separar un texto largo.lógicolínea en varioslos fisicos. $PATHharíanocontienen caracteres de nueva línea, la \<newline>secuencia se elimina.

O bien, comillas exteriores donde ~se expande (incluso después, :cuando en las tareas) y \<newline>también se eliminan:

PATH=\
~/.cargo/bin:\
~/.bkaradzic/bx/tools/bin/linux:\
~/.bkaradzic/bimg/tools/bin/linux:\
~/.dotnet:\
~/.android-ndk-r17b:\
$PATH
export PATH

(con bash, export PATH=... también funcionaría aquí, pero no en todos los demás shells).

En zsh, podrías hacer:

path=(
   ~/.cargo/bin
   ~/.bkaradzic/bx/tools/bin/linux
   ~/.bkaradzic/bimg/tools/bin/linux
   ~/.dotnet
   ~/.android-ndk-r17b
   $path
)

o

path[1,0]=(
   ~/.cargo/bin
   ~/.bkaradzic/bx/tools/bin/linux
   ~/.bkaradzic/bimg/tools/bin/linux
   ~/.dotnet
   ~/.android-ndk-r17b
)

como en zsh, la $pathmatriz esatadoa la $PATHvariable como en csho tcsh.

información relacionada