脚本这东西,反正就莫名其妙很烦

背景故事

这天想换一个压缩软件,装完后发现默认不是它,当然桌面打开方式也支持为此类文件选择默认程序,但比如我为.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 types

Synopsis

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

那些年恶心过的脚本 —— 修改配置相关推荐

  1. python登录交换机执行命令_如何用Python脚本登录到交换机上修改配置?

    原标题:如何用Python脚本登录到交换机上修改配置? 网 工 圈 网络工程师阿龙 圈内最早的公益公众号,本号已认证!学网络关注我一个就够了(关注近5w+) 关注 听说 99%的 网工都来这里充电吖 ...

  2. Hadoop【部署 02】hadoop-3.1.3 单机版YARN(配置、启动停止shell脚本修改及服务验证)

    1. 修改配置 进入 ${HADOOP_HOME}/etc/hadoop/ 目录下,修改以下配置: mapred-site.xml [root@tcloud ~]# vim /usr/local/ha ...

  3. 多主机推送公钥、修改配置、修改密码脚本

    推送公钥: !#/bin/bash if [! -f ~/.ssh/id_rsa ] ;thenssh-keygen -P "" -f ~/.ssh/id_rsa fifor i ...

  4. 【Android 安装包优化】WebP 应用 ( libwebp 源码下载 | Android.mk 和 Application.mk 构建脚本修改 | libwebp 函数库编译 )

    文章目录 一. libwebp 源码下载 二. libwebp 源码编译脚本修改 三. libwebp 函数库编译 四.参考资料 一. libwebp 源码下载 Google 提供了一系列的 WebP ...

  5. 批处理bat脚本自动配置java的jdk环境变量

    前言 每当更换电脑或者是重装系统之后,都需要重新配置java系统路径.但是又不想每次都去查配置方法,所以写了个脚本自动配置. 脚本内容 @echo off @echo 第一步 输入要设置的JAVA_H ...

  6. 2020-08-22 OpenWRT 脚本修改网卡MAC

    脚本修改网卡MAC #!/bin/shLAN_DEVICE="eth0" URL="http://127.0.0.1:80/file.txt"NEW_MAC=$ ...

  7. 【MySQL】修改配置后,重启MySQL报错[ERROR] The server quit without updating PID file

    问题: 在没有修改配置时,MySQL启动正常: 错1:修改配置后MySQL启动不了,报错: [root@localhost mysql]# service mysql restart Starting ...

  8. VSCode 开发调试 Blender脚本Addon配置实时生效

    一.概述 通常在Blender 学习一段时间后,了解了大概的基本功能后,发现没有有一些操作更简单化或者增添新功能 ,这时大家就会习惯性的寻找插件Addon. 开发插件的时候,有的时候在插件的py文件里 ...

  9. 安全加固脚本+修改root密码->出现root始终无法登录问题

    现象:据项目需要,要对系统进行安全加固,使用了安全加固脚本后,再修改root密码会无法进入系统的现象 初始加固脚本内容如下 #!/bin/bash sed '4c greeter-show-manua ...

最新文章

  1. K - Candies POJ - 3159(利用了自定义比较操作符)
  2. python定义一个变量_Python新手上车3:Python第一个程序和变量
  3. SQL中使用WITH AS提高性能-使用公用表表达式(CTE)简化嵌套SQL
  4. 向HtmlAgilityPack道歉:解析HTML还是你好用
  5. nvm版本管理工具安装
  6. MongoDB优化之二:常见优化方法
  7. C# 通过反射获取方法/类上的自定义特性
  8. WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
  9. 3层vni vxlan_方便业务迁移,大型企业数据中心VXLAN大二层基础,一分钟了解下
  10. Symantec Backup Exec 2014 备份Exchange 2013之二安装主备服务器
  11. 汇编语言---计算表达式的值
  12. Python输入输出练习
  13. 第二课--C语言基础(3部分--共三部分)
  14. Spine 1.73+ 和谐版
  15. php验证手机号码 函数,PHP 匹配电话,手机,400号码 函数 及正则。很管用。
  16. win10 64位下Oracle10g安装
  17. 基于扩张卷积神经网络的图像超分辨率
  18. 用防火墙可以防御DDoS吗?
  19. think php 5(命令行)创建控制器、model
  20. 信号完整性七步曲:从PCB走线、信号反射到特性阻抗

热门文章

  1. 毕业设计外卖点餐系统,外卖点餐系统毕业设计开发需求分析,订餐外卖点餐系统毕业设计分析数据库设计
  2. 王兴,带头围观了华为第一辆车
  3. hMailServer批量创建用户
  4. SVN中检出(check out) 和导出(export) 的区别
  5. 微信企业号开发:微信考勤百度地图定位
  6. swagger依赖配置
  7. 蒙特卡洛算法学习笔记
  8. linux下访问12306问题
  9. 【小码哥】性能瓶颈分析及案例总结
  10. spawn node ENOENT 的原因