那些年恶心过的脚本 —— 修改配置
脚本这东西,反正就莫名其妙很烦
背景故事
这天想换一个压缩软件,装完后发现默认不是它,当然桌面打开方式也支持为此类文件选择默认程序,但比如我为.tar.gz选择了默认打开程序,.zip文件竟然还不是。
后来查了查这俩文件的mime_type都不同,一个是application/x-compressed-tar,另一个是application/zip。mime_type是什么呢?
MIME的全称是Multipurpose Internet Mail Extensions,即多用途互联网邮件扩展类型。
这是HTTP协议中用来定义文档性质及格式的标准。IETF RFC 6838,对HTTP传输内容类型进行了全面定义。
而 IANA(互联网号码分配机构)是负责管理所有标准MIME类型的官方机构。可以在这里)找到所有的标准MIME。服务器通过MIME告知响应内容类型,而浏览器则通过MIME类型来确定如何处理文档。
MIME的格式:
type/subtype
这是一个两级的分类,第一级分类通常包含text,image,audio,video,applications,multipart和message。
第二级非常多,通俗的理解成第一级的细分。
这linux桌面系统也用mimetypes区别分类,那先别管那么多,目的很简单,就是想安装这个压缩软件rpm包时自动把默认压缩软件变成它。
其实命令就有
[jal@localhost Desktop]$ xdg-mime --help
xdg-mime - command line tool for querying information about
file type handling and adding descriptions for new file typesSynopsis
xdg-mime query { filetype | default } …
xdg-mime default application mimetype(s)
xdg-mime install [–mode mode] [–novendor] mimetypes-file
xdg-mime uninstall [–mode mode] mimetypes-file
xdg-mime { --help | --manual | --version }
Use ‘man xdg-mime’ or ‘xdg-mime --manual’ for additional info.
其中 xdg-mime default application mimetype(s) 就适合这次目的。
比如xdg-mime default org.kde.ark.desktop application/x-compressed-tar就成功修改了.tar.gz的默认打开程序为ark。
但是真的要每次装完压缩软件都打开终端敲命令,还一敲敲一堆吗?大哥你是桌面系统诶 = =
换个法子吧。比如装完包就立即生效就很不错。
尝试过编辑srpm包中的spec文件的%post区域,即安装后运行N个xdg-mime命令,但还是不行因为rpm安装的时候是以超级用户安装的,这个xdg-mime命令也改的只是root用户的配置,对于普通用户是不生效的。
但也由此发现,原来有配置文件配置着这一切~/.config/mimeapps.list,瞅一眼这个文件里面一目了然嘛
[Default Applications]
x-scheme-handler/http=google-chrome.desktop
x-scheme-handler/https=google-chrome.desktop
x-scheme-handler/about=google-chrome.desktop
x-scheme-handler/unknown=google-chrome.desktop
…
…
…
[Added Associations]
…
…
这个…尝试直接写一个application/zip=org.kde.ark.desktop上去,发现是生效的。
那就打算直接在spec文件的%post字段执行脚本,改用户配置就行了。
shell脚本
脚本这东西,就是你用的时候永远都不记得了的东西。
那么也尽量做得通用一点。大概的想法是这个脚本要配一个参数,参数就是要设置的默认压缩软件的desktop文件名,脚本里有支持的mimetypes设置,当要增加直接增加即可。
老规矩先想想,当然这里是马后炮哈哈哈,刚开始想没这么多,都是执行几次后发现不行再补漏,但其实核心也没变多少,补也是补细节罢了。
1.参数过滤
脚本脚本,都是一边搞一边百度"linux 脚本如何xxx"。。
这里简单判断下首先参数为一个:
if [ ! $# -eq 1 ] ;thenecho use [cmd] [archive program desktop file]exit 1
fi
这里百度到这个$#代表参数个数,不包含脚本自己本身。
然后判断下参数是不是dekstop文件:
if [[ ! $1 == *".desktop" ]] ;thenecho not a desktop fileexit 1
fi
这里是百度判断字符串是否包含xxx,这个方法不错。
用到的是两个中括号,额又百度下大概 [[]] 是 [] 的拓展,比后者强大很多,比如支持正则表达式,这里就用到了正则表达式。
2.扩展支持
这里肯定是定义数组了,不然下面肯定有一堆重复的代码了,关键只是在shell里面的数组和后续的遍历不太懂,所以又得百度一下。
好吧定义数组是这样:
support_mime_type=(
"application/x-tar"
"application/x-compressed-tar"
"application/x-xz-compressed-tar"
"application/x-compressed-tar"
"application/x-bzip-compressed-tar"
"application/x-tarz"
"application/x-cbr"
"application/vnd.rar"
"application/x-7z-compressed"
"application/x-java-archive"
"application/vnd.comicbook+zip"
"application/zip"
"application/x-rpm"
"image/svg+xml-compressed"
)
有数组就有遍历,后续的遍历格式是这样:
for mime_type in ${support_mime_type[*]}
doecho mime_type
done
3.修改流程
最关键就数这里了。
a)首先找到所有用户,或是说列出所有用户,命令读取多个参数并循环执行可以使用这个办法:
ls /home/ | while read line
do...
done
b)判断用户内是否存在.config目录,如果没有那大概率不是一个用户目录,就不执行下去:
if [ -d /home/$line/.config ]; thenecho find /home/$line/.config...
fi
c)判断用户是否存在mimeapps.list文件,如果有就说明配置过,直接处理,如果没有就新建一个再进行处理,:
if [ -e /home/$line/.config/mimeapps.list ]; thenecho find /home/$line/.config/mimeapps.list...
elseecho not find /home/$line/.config/mimeapps.listtouch /home/$line/.config/mimeapps.listchmod 777 /home/$line/.config/mimeapps.listecho [Default Applications] >> /home/$line/.config/mimeapps.list...fi
d)有了mimeapps.list这个文件,就直接根据support_mime_type修改这个文件的内容,当然就是sed了。对于已存在mimeapps.list文件的,先判断有没有配置过相关类型默认打开方式,如果有就覆盖掉了,如果没有就加上,所以加起来就是:
for mime_type in ${support_mime_type[*]}
dogrep ${mime_type} /home/$line/.config/mimeapps.list > /dev/nullif [ $? -eq 0 ] ;thenecho "find setting ${mime_type}"sed -i 's#'${mime_type}'=.*#'${mime_type}'='$1'#g' /home/$line/.config/mimeapps.listelseecho not setting ${mime_type} yetsed -i '/\[Default Applications\]/a'${mime_type}'='$1'' /home/$line/.config/mimeapps.listfi
done
在sed匹配命令里用到变量,要用单引号括起来。额就是字符串里加变量,不然变量就不是变量了就是字符串。
第一句sed用了井号分割符号,s首先说明了替换,'${mime_type}'就是上面定义的数组,=.*配合前者加起来的被替换内容就是如application/x-tar=.*等等这种,意思就是把application/x-tar=开头的所有内容替换,换成application/x-tar=xxx.desktop,也就是输入参数。
判断有没有配置过用grep看看文件有没有包含字段就行,有就整行替换了,整行替换用到.*匹配。
没有的话先匹配[Default Applications]字段,然后在下一行加就行,当然中括号属于特殊字符,前面加个反斜杠表示它是字符串。
第二句sed添加,添加sed语法也没什么了。
先前没有mimeapps.list文件的当然也属于没有配置过,也直接加即可。
OHHHHHHHHHHHHHHHHHHHHHHHHHHHHh
把脚本放到/usr/bin/下面,改一下权限。
再运行一下,再看看配置文件mimeapps.list,再在桌面上双击一下试试。
当然是生效的!
添加脚本到软件包里,在cmakelist上面添加安装规则
install(FILES set-archiver.shDESTINATION "/usr/bin/"
)
然后去spec文件的%post字段,也就是安装后执行的命令添加即可:
chmod 777 /usr/bin/set-archiver.sh
/usr/bin/set-archiver.sh org.kde.ark.desktop
那些年恶心过的脚本 —— 修改配置相关推荐
- python登录交换机执行命令_如何用Python脚本登录到交换机上修改配置?
原标题:如何用Python脚本登录到交换机上修改配置? 网 工 圈 网络工程师阿龙 圈内最早的公益公众号,本号已认证!学网络关注我一个就够了(关注近5w+) 关注 听说 99%的 网工都来这里充电吖 ...
- Hadoop【部署 02】hadoop-3.1.3 单机版YARN(配置、启动停止shell脚本修改及服务验证)
1. 修改配置 进入 ${HADOOP_HOME}/etc/hadoop/ 目录下,修改以下配置: mapred-site.xml [root@tcloud ~]# vim /usr/local/ha ...
- 多主机推送公钥、修改配置、修改密码脚本
推送公钥: !#/bin/bash if [! -f ~/.ssh/id_rsa ] ;thenssh-keygen -P "" -f ~/.ssh/id_rsa fifor i ...
- 【Android 安装包优化】WebP 应用 ( libwebp 源码下载 | Android.mk 和 Application.mk 构建脚本修改 | libwebp 函数库编译 )
文章目录 一. libwebp 源码下载 二. libwebp 源码编译脚本修改 三. libwebp 函数库编译 四.参考资料 一. libwebp 源码下载 Google 提供了一系列的 WebP ...
- 批处理bat脚本自动配置java的jdk环境变量
前言 每当更换电脑或者是重装系统之后,都需要重新配置java系统路径.但是又不想每次都去查配置方法,所以写了个脚本自动配置. 脚本内容 @echo off @echo 第一步 输入要设置的JAVA_H ...
- 2020-08-22 OpenWRT 脚本修改网卡MAC
脚本修改网卡MAC #!/bin/shLAN_DEVICE="eth0" URL="http://127.0.0.1:80/file.txt"NEW_MAC=$ ...
- 【MySQL】修改配置后,重启MySQL报错[ERROR] The server quit without updating PID file
问题: 在没有修改配置时,MySQL启动正常: 错1:修改配置后MySQL启动不了,报错: [root@localhost mysql]# service mysql restart Starting ...
- VSCode 开发调试 Blender脚本Addon配置实时生效
一.概述 通常在Blender 学习一段时间后,了解了大概的基本功能后,发现没有有一些操作更简单化或者增添新功能 ,这时大家就会习惯性的寻找插件Addon. 开发插件的时候,有的时候在插件的py文件里 ...
- 安全加固脚本+修改root密码->出现root始终无法登录问题
现象:据项目需要,要对系统进行安全加固,使用了安全加固脚本后,再修改root密码会无法进入系统的现象 初始加固脚本内容如下 #!/bin/bash sed '4c greeter-show-manua ...
最新文章
- K - Candies POJ - 3159(利用了自定义比较操作符)
- python定义一个变量_Python新手上车3:Python第一个程序和变量
- SQL中使用WITH AS提高性能-使用公用表表达式(CTE)简化嵌套SQL
- 向HtmlAgilityPack道歉:解析HTML还是你好用
- nvm版本管理工具安装
- MongoDB优化之二:常见优化方法
- C# 通过反射获取方法/类上的自定义特性
- WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
- 3层vni vxlan_方便业务迁移,大型企业数据中心VXLAN大二层基础,一分钟了解下
- Symantec Backup Exec 2014 备份Exchange 2013之二安装主备服务器
- 汇编语言---计算表达式的值
- Python输入输出练习
- 第二课--C语言基础(3部分--共三部分)
- Spine 1.73+ 和谐版
- php验证手机号码 函数,PHP 匹配电话,手机,400号码 函数 及正则。很管用。
- win10 64位下Oracle10g安装
- 基于扩张卷积神经网络的图像超分辨率
- 用防火墙可以防御DDoS吗?
- think php 5(命令行)创建控制器、model
- 信号完整性七步曲:从PCB走线、信号反射到特性阻抗