Como remover espaços em branco/eols ASCII da variável no bash?

Como remover espaços em branco/eols ASCII da variável no bash?

Eu tentei o seguinte:

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'/}

E ainda

-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

Alguma sugestão?

Responder1

Você parece pensar que a primeira linha iniciará uma expansão no caminho. Isso não é verdade. A primeira linha é um comando completo.

export PATH= >> -

A linha acima, escrita com alguns espaços para melhor compreensão, definirá o PATHcomo uma string vazia e anexará a saída do comando ao arquivo -.

A linha a seguir é o próximo comando

$HOME/.cargo/bin:

Isso se expande para o nome de um diretório que provavelmente existe em seu sistema, mais os dois pontos. O resultado é

-bash:: /home/hydroper/.cargo/bin:Esse arquivo ou diretório não existe

Responder2

Parece que você quer 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 -sé o comando para juntar todas as linhas de um arquivo (com o separador fornecido com -d; -significafaça isso para stdin em vez de um arquivo real, -pode ser omitido em algumas implementações, mas isso não é padrão/portátil).

Para responder à sua pergunta sobre a remoção de espaços em branco, em ksh93/ mkshou :bashzsh

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

removeria todos os caracteres de espaçamento, incluindo os ASCII, incluindo o caractere de nova linha. A lista de caracteres correspondentes depende da localidade e do sistema (por exemplo, nem todos os sistemas incluem o espaço ininterrupto), mas todos os ASCII (TAB, LF, VT, FF, CR, SPC) são sempre incluídos.

Para inserir esse caractere de nova linha $PATHem primeiro lugar, você precisaria:

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

>>é um operador de redirecionamento de saída, você pode estar confundindo com os operadores <<ou <<-aqui-doc. Mas mesmo assim, <<e <<-deve redirecionar a entrada, você ainda precisará usá-lo em um comando que lê sua entrada como pasteno exemplo acima e usar a substituição de comando ( $(...)no exemplo acima) para que a saída desse comando seja passada como argumento para export.

Observe que você também pode fazer:

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 aspas duplas (e você precisa delas para $HOMEexpandi-las), você pode usar \no final da linha para quebrar um longológicolinha em váriosfísicos. $PATHserianãocontém caracteres de nova linha, a \<newline>sequência é removida.

Ou, fora das aspas, onde ~é expandido (inclusive depois de :quando nas atribuições) e \<newline>também removido:

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

(com bash, export PATH=... também funcionaria aqui, mas não em todos os outros shells).

Em zsh, você poderia fazer:

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

ou

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

como em zsh, a $pathmatriz éligadopara a $PATHvariável como em cshou tcsh.

informação relacionada