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

관련 정보