Como remover whitespace / eols ASCII da variável no bash?

1

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?

    
por yugioh 25.08.2018 / 20:34

2 respostas

4

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, irá definir o PATH para uma string vazia, e acrescentar a saída do comando ao arquivo - .

A seguinte linha é 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: : Nenhum arquivo ou diretório desse tipo

    
por 25.08.2018 / 21:39
3

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

Para responder à sua pergunta sobre a remoção de espaço em branco, em ksh93 / mksh , bash ou zsh :

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

removeria todos os caracteres de espaçamento, incluindo os caracteres 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 sem interrupção), mas todos os ASCII (TAB, LF, VT, FF, CR, SPC) são sempre incluídos. / p>

Para obter esse caractere de nova linha em $PATH , 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 confuso com os operadores << ou <<- here-doc. Mas, mesmo assim, << e <<- devem redirecionar a entrada, então você ainda precisará usá-la em um comando que leia sua entrada como paste no exemplo acima e use a substituição de comando ( $(...) no exemplo acima) para que a saída desse comando seja passada como argumento para export .

Note 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 das aspas duplas para os $HOME a serem expandidos), você pode usar \ no final da linha para quebrar uma linha lógica longa em vários físicos . $PATH não conterá caracteres de nova linha e, em seguida, a sequência \<newline> será removida.

Ou, cotações externas em que ~ é expandido (inclusive após : quando em 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 todas as outras camadas).

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 matriz $path está vinculada à variável $PATH , como em csh ou tcsh .

    
por 26.08.2018 / 09:40

Tags