复制到SD卡后Shell脚本属性变更且执行失败问题求助
解决Ubuntu 16.04中SD卡脚本权限丢失&执行失败的问题
你遇到的这个情况确实和SD卡的格式化格式直接相关,咱们来一步步理清原因和解决办法:
为什么会出现权限变更&执行失败?
Ubuntu桌面默认用的是ext4这类原生支持Linux权限系统的文件系统,所以你在桌面创建脚本后设置的chmod +x可执行权限能被正常存储和识别。但SD卡常用的FAT32、exFAT格式是为Windows/移动设备设计的,完全不支持Unix/Linux的权限位机制——当你把脚本复制到这类SD卡时,系统根本没法保存你原来设置的可执行权限,只能给文件套上一套默认的无执行权限属性,自然就跑不起来了。
两种可行的解决办法
方案1:临时绕过权限限制直接运行
不用动SD卡格式,直接调用Shell解释器来执行脚本就行。比如你的脚本叫test_script.sh,进入SD卡目录后运行:
bash test_script.sh # 如果脚本开头用的是#!/bin/sh,也可以用 sh test_script.sh
这种方式不需要脚本本身有可执行权限,只要解释器能读取文件内容就可以正常运行。
方案2:格式化SD卡为支持Linux权限的文件系统
如果需要长期在SD卡上运行脚本,建议把SD卡换成Linux原生支持的文件系统:
- ext4(推荐):完全兼容Linux权限,性能稳定,但Windows下默认无法直接读取(需要第三方工具)
- NTFS:可以在Windows和Linux之间共用,也支持权限,但需要配置挂载参数
格式化ext4的步骤:
- 先备份SD卡上的所有数据(格式化会清空全部内容)
- 卸载SD卡:
sudo umount /media/你的用户名/SD卡挂载目录 - 用
lsblk命令找到SD卡的设备名(比如/dev/sdb1,别和系统硬盘搞混!) - 执行格式化命令:
sudo mkfs.ext4 /dev/sdb1 - 重新挂载SD卡,之后复制过去的脚本就能正常保留可执行权限了。
用NTFS实现跨系统兼容:
如果需要SD卡同时在Windows和Linux用,格式化NTFS后,编辑/etc/fstab添加挂载参数来保留权限:
/dev/sdb1 /media/SD_CARD ntfs-3g defaults,umask=0022,fmask=0133 0 0
替换其中的/dev/sdb1为你的SD卡设备名,/media/SD_CARD为挂载目录,保存后重新挂载即可。
内容的提问来源于stack exchange,提问作者Ron




