
Я попробовал следующее:
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
; -
означаетсделайте это для stdin вместо реального файла, -
может быть опущен в некоторых реализациях, но это не является стандартным/переносимым).
Чтобы ответить на ваш вопрос об удалении пробелов, в ksh93
/ mksh
или :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"
>>
является оператором перенаправления вывода, вы можете путать с операторами <<
or <<-
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>
последовательность удаляется.
Или, за пределами кавычек, где ~
раскрывается (в том числе после :
when в назначениях) и \<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
массив естьсвязанныйк $PATH
переменной, как в csh
или tcsh
.