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变量不久完事了吗
Popular Ranking
ChangePopular Events
More

中文 
我使用 apt install rustc 安装了rust;
完了 运行 cargo 报 cargo not found
如何正确安装rust和cargo?
我使用的版本是 deepin 23 社区版