curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

首先安装一个正常的docker engine 不要安装apt库里那个
然后新建一个rust容器
services:
rust:
image: rust:alpine3.20
container_name: rust
restart: unless-stopped
volumes:
- ./:/workpalce
command: ash
tty: true
stdin_open: true
然后进入容器 docker exec -it rust ash
输入命令 sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#http://mirrors4.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories
更换alpine源
根据帮助文件更换Cargo源
最后开始写你的代码
另外给你一个经验之谈 无论你用什么编程工具 用包管理器安装应该是你最终不得不选择的一个备用方案 而不是首选
https://www.rust-lang.org/zh-CN/tools/install
https://course.rs/first-try/installation.html
一条命令装完:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
所有工具都安装在 ~/.cargo/bin
目录中,您可以在这里找到包括 rustc
、cargo
和 rustup
在内的 Rust 工具链。
guyuming@guyuming-acer:/rfm1$ sudo make clean
请输入密码:
验证成功
cleaning
Cleaning reedline_wrapper...
/bin/sh: 1: cargo: not found
make: *** [Makefile:130:clean] 错误 127
guyuming@guyuming-acer:/rfm1$ make clean
cleaning
Cleaning reedline_wrapper...
error: failed to remove file /home/guyuming/rfm1/reedline_wrapper/target/debug/incremental/reedline_wrapper-0o3cjxhsyo096/s-h9atb19yqj-054sef7-e8umut05sm10vbpblxl3nybaw/47udyheaeadr79x556f8346ol.oCaused by:
Permission denied (os error 13)
make: *** [Makefile:130:clean] 错误 101
guyuming@guyuming-acer:~/rfm1$ sudo su
root@guyuming-acer:/home/guyuming/rfm1# make clean
cleaning
Cleaning reedline_wrapper...
Removed 431 files, 170.8MiB total
root@guyuming-acer:/home/guyuming/rfm1#
这是为啥?sudo 就不行
guyuming@guyuming-acer:/rfm1$ sudo make clean
请输入密码:
验证成功
cleaning
Cleaning reedline_wrapper...
/bin/sh: 1: cargo: not found
make: *** [Makefile:130:clean] 错误 127
guyuming@guyuming-acer:/rfm1$ make clean
cleaning
Cleaning reedline_wrapper...
error: failed to remove file /home/guyuming/rfm1/reedline_wrapper/target/debug/incremental/reedline_wrapper-0o3cjxhsyo096/s-h9atb19yqj-054sef7-e8umut05sm10vbpblxl3nybaw/47udyheaeadr79x556f8346ol.oCaused by:
Permission denied (os error 13)
make: *** [Makefile:130:clean] 错误 101
guyuming@guyuming-acer:~/rfm1$ sudo su
root@guyuming-acer:/home/guyuming/rfm1# make clean
cleaning
Cleaning reedline_wrapper...
Removed 431 files, 170.8MiB total
root@guyuming-acer:/home/guyuming/rfm1#
这是为啥?sudo 就不行
不是,你操作了什么?为什么要这么操作?
我安装完cargo后要手动改一下环境路径,输入安装指令安装cargo
时它应该会提醒手动改路径的
我问了deepseek,回答如下,然后我相应改了Makefile, make install 不依赖all规则,sudo make install 就不再执行编译了,make clean 也就无需 sudo 了
为啥 sudo su 以后cargo 就能找到,而sudo 执行命令就找不到cargo
这个问题涉及到 Linux 的 sudo
和 sudo su
的环境变量(PATH)差异,具体原因如下:
1. sudo
和 sudo su
的环境变量差异
sudo
:
当直接使用sudo command
时,出于安全考虑,sudo
会重置环境变量(包括PATH
),只保留一些基本的、安全的路径(如/usr/bin
、/bin
等)。
如果cargo
安装在用户目录(如~/.cargo/bin
),这个路径 不会 包含在sudo
的默认PATH
里,因此会报错cargo: not found
。sudo su
:
当运行sudo su
切换到 root 时,默认会加载 root 用户的完整环境(包括 root 的PATH
)。
如果cargo
是通过系统包管理器(如apt
)安装的,或者 root 用户手动配置了PATH
(比如在~/.bashrc
或/etc/environment
中添加了~/.cargo/bin
),那么cargo
就能被找到。
2. 如何验证?
(1) 查看 sudo
和 sudo su
的 PATH
bash
复制
下载
# 查看 sudo 的 PATH
sudo sh -c 'echo $PATH'
# 查看 sudo su 的 PATH
sudo su -c 'echo $PATH'
你会发现 sudo
的 PATH
比 sudo su
的 PATH
更短,可能缺少 ~/.cargo/bin
。
(2) 检查 cargo
的安装位置
bash
复制
下载
which cargo # 普通用户的 cargo 路径(通常是 ~/.cargo/bin/cargo)
sudo which cargo # sudo 找不到 cargo
sudo su -c 'which cargo' # 如果是 root 用户安装的,可能会找到
3. 解决方案
(1) 让 sudo
也能找到 cargo
-
方法 1:使用
sudo -E
(保留当前用户的环境变量)
bash复制
下载
sudo -E make clean
但这种方法可能不安全,因为会继承普通用户的所有环境变量。
-
方法 2:修改
sudo
的secure_path
编辑/etc/sudoers
(使用visudo
):
bash复制
下载
sudo visudo
找到
Defaults secure_path="..."
,并在其中添加~/.cargo/bin
(例如):
text复制
下载
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/YOUR_USER/.cargo/bin"
然后保存退出。
(2) 用 sudo env PATH=$PATH make clean
临时让 sudo
使用当前用户的 PATH
:
bash
复制
下载
sudo env PATH=$PATH make clean
这样 sudo
就能找到 cargo
了。
(3) 用 cargo clean
代替 make clean
(推荐)
如果 make clean
只是调用 cargo clean
,你可以直接用:
bash
复制
下载
cargo clean
避免 sudo
权限问题。
4. 为什么 make clean
需要 sudo
?
通常 cargo clean
不需要 sudo
,但你的报错:
text
复制
下载
error: failed to remove file ... Permission denied (os error 13)
说明 target/
目录的权限可能被错误地修改过(比如之前用 sudo
编译过)。
正确的做法是修复权限,而不是依赖 sudo
:
bash
复制
下载
# 递归修改 target/ 目录的权限,让当前用户可读写
sudo chown -R $USER:$USER reedline_wrapper/target/
之后就可以用普通用户运行 make clean
或 cargo clean
,不再需要 sudo
。
总结
sudo
找不到cargo
是因为它默认使用受限的PATH
,而sudo su
会加载完整的 root 环境。- 最佳实践:
- 不要用
sudo
运行cargo
(Rust 工具链应该以普通用户运行)。 - 修复
target/
目录的权限,避免Permission denied
。 - 如果必须用
sudo
,可以用sudo env PATH=$PATH make clean
临时继承当前PATH
- 不要用

cargo有单独的软件包,就叫cargo,你可以尝试使用apt install cargo
当然了,楼上说的是对的,没事别用包管理器的开发环境。但是楼上那个官方rust在国内的速度极其感人,每个库都要从中心仓库或者github拉,基本上一个你也拉不下来。
建议使用镜像https://rsproxy.cn/

cargo: /usr/bin/cargo
我问了deepseek,回答如下,然后我相应改了Makefile, make install 不依赖all规则,sudo make install 就不再执行编译了,make clean 也就无需 sudo 了
为啥 sudo su 以后cargo 就能找到,而sudo 执行命令就找不到cargo
这个问题涉及到 Linux 的 sudo
和 sudo su
的环境变量(PATH)差异,具体原因如下:
1. sudo
和 sudo su
的环境变量差异
sudo
:
当直接使用sudo command
时,出于安全考虑,sudo
会重置环境变量(包括PATH
),只保留一些基本的、安全的路径(如/usr/bin
、/bin
等)。
如果cargo
安装在用户目录(如~/.cargo/bin
),这个路径 不会 包含在sudo
的默认PATH
里,因此会报错cargo: not found
。sudo su
:
当运行sudo su
切换到 root 时,默认会加载 root 用户的完整环境(包括 root 的PATH
)。
如果cargo
是通过系统包管理器(如apt
)安装的,或者 root 用户手动配置了PATH
(比如在~/.bashrc
或/etc/environment
中添加了~/.cargo/bin
),那么cargo
就能被找到。
2. 如何验证?
(1) 查看 sudo
和 sudo su
的 PATH
bash
复制
下载
# 查看 sudo 的 PATH
sudo sh -c 'echo $PATH'
# 查看 sudo su 的 PATH
sudo su -c 'echo $PATH'
你会发现 sudo
的 PATH
比 sudo su
的 PATH
更短,可能缺少 ~/.cargo/bin
。
(2) 检查 cargo
的安装位置
bash
复制
下载
which cargo # 普通用户的 cargo 路径(通常是 ~/.cargo/bin/cargo)
sudo which cargo # sudo 找不到 cargo
sudo su -c 'which cargo' # 如果是 root 用户安装的,可能会找到
3. 解决方案
(1) 让 sudo
也能找到 cargo
-
方法 1:使用
sudo -E
(保留当前用户的环境变量)
bash复制
下载
sudo -E make clean
但这种方法可能不安全,因为会继承普通用户的所有环境变量。
-
方法 2:修改
sudo
的secure_path
编辑/etc/sudoers
(使用visudo
):
bash复制
下载
sudo visudo
找到
Defaults secure_path="..."
,并在其中添加~/.cargo/bin
(例如):
text复制
下载
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/YOUR_USER/.cargo/bin"
然后保存退出。
(2) 用 sudo env PATH=$PATH make clean
临时让 sudo
使用当前用户的 PATH
:
bash
复制
下载
sudo env PATH=$PATH make clean
这样 sudo
就能找到 cargo
了。
(3) 用 cargo clean
代替 make clean
(推荐)
如果 make clean
只是调用 cargo clean
,你可以直接用:
bash
复制
下载
cargo clean
避免 sudo
权限问题。
4. 为什么 make clean
需要 sudo
?
通常 cargo clean
不需要 sudo
,但你的报错:
text
复制
下载
error: failed to remove file ... Permission denied (os error 13)
说明 target/
目录的权限可能被错误地修改过(比如之前用 sudo
编译过)。
正确的做法是修复权限,而不是依赖 sudo
:
bash
复制
下载
# 递归修改 target/ 目录的权限,让当前用户可读写
sudo chown -R $USER:$USER reedline_wrapper/target/
之后就可以用普通用户运行 make clean
或 cargo clean
,不再需要 sudo
。
总结
sudo
找不到cargo
是因为它默认使用受限的PATH
,而sudo su
会加载完整的 root 环境。- 最佳实践:
- 不要用
sudo
运行cargo
(Rust 工具链应该以普通用户运行)。 - 修复
target/
目录的权限,避免Permission denied
。 - 如果必须用
sudo
,可以用sudo env PATH=$PATH make clean
临时继承当前PATH
- 不要用
不明白你为什么要搞这么复杂,在.bashrc文件里面添加cargo程序所在的路径到PATH变量不久完事了吗
Featured Collection
ChangePopular Ranking
ChangePopular Events
More
我使用 apt install rustc 安装了rust;
完了 运行 cargo 报 cargo not found
如何正确安装rust和cargo?
我使用的版本是 deepin 23 社区版