Bash変数からASCIIスペース/ eolを削除する方法は?

Bash変数からASCIIスペース/ eolを削除する方法は?

私は以下を試しました:

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

まだ

-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

どんな提案がありますか?

答え1

最初の行がパス拡張を開始すると思うようです。これは本当ではありません。最初の行は完全なコマンドです。

export PATH= >> -

上記の行は、理解を深めるためにいくつかのスペースを使用して作成され、空の文字列に設定され、PATHコマンド出力をファイルに追加します-

次の行は次のコマンドです。

$HOME/.cargo/bin:

システムに存在できるディレクトリ名とコロンに展開されます。明らかにする

-bash: /home/hydroper/.cargo/bin:: 対応するファイルやディレクトリはありません。

答え2

似たようなものが欲しいようです。

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ファイル内のすべての行を連結するコマンドです(指定された-d区切り文字を使用して-表示されます)。実際のファイルではなく標準入力に対してこれを行います。-一部の実装では省略できますが、これは標準/移植可能ではありません。

ksh93mksh/またはbash空白の削除に関する質問に答えるには、次の手順を実行しますzsh

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

改行文字を含む ASCII 文字を含むすべての空白文字が削除されます。一致する文字のリストはロケールとシステムによって異なりますが(たとえば、すべてのシステムに改行防止スペースが含まれているわけではありません)、常にすべてのASCII文字(TAB、LF、VT、FF、CR、SPC)が含まれます。

$PATH改行文字を最初に入力するには、次の手順を実行する必要があります。

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

>><<または<<-here-doc演算子と混同する可能性がある出力リダイレクト演算子です。ただし、入力をリダイレクトしたい<<場合は、上記の例<<-のように入力を読み取るコマンドでそれを使用し、コマンドの置き換え(上記の例では)を使用してそのコマンドの出力をパラメータとして渡す必要があります。 。paste$(...)export

次のタスクも実行できます。

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

$HOME二重引用符で囲む(二重引用符を拡張するには二重引用符が必要です)、行末でを使用して長い\部分を分割できます。論理的複数行を作成する物理$PATH会議いいえ改行文字が含まれると、\<newline>シーケンスが削除されます。

または、引用符が~展開され(:割り当ての後ろを含む)、\<newline>削除される外部部分もあります。

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

(使用するとbashここでもexport PATH=... 機能しますが、他のすべてのシェルでは機能しません)。

では、zsh次のことができます。

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

または

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

のように配列は次のようになりますzsh$pathバンドルinまたは$PATHのような変数に。cshtcsh

関連情報