那些年恶心过的脚本 —— 修改配置

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

背景故事

这天想换一个压缩软件,装完后发现默认不是它,当然桌面打开方式也支持为此类文件选择默认程序,但比如我为.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 ] ;then
	echo use [cmd] [archive program desktop file]
	exit 1 
fi

这里百度到这个$#代表参数个数,不包含脚本自己本身。

然后判断下参数是不是dekstop文件:

if [[ ! $1 == *".desktop" ]] ;then
	echo not a desktop file
	exit 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[*]}
do
	echo mime_type
done

3.修改流程

最关键就数这里了。

a)首先找到所有用户,或是说列出所有用户,命令读取多个参数并循环执行可以使用这个办法:

ls /home/ | while read line
do
	...
done

b)判断用户内是否存在.config目录,如果没有那大概率不是一个用户目录,就不执行下去:

if [ -d /home/$line/.config ]; then
	echo find /home/$line/.config
	...
fi

c)判断用户是否存在mimeapps.list文件,如果有就说明配置过,直接处理,如果没有就新建一个再进行处理,:

if [ -e /home/$line/.config/mimeapps.list ]; then
		echo find /home/$line/.config/mimeapps.list
		...
else
		echo not find /home/$line/.config/mimeapps.list
		touch /home/$line/.config/mimeapps.list
		chmod 777 /home/$line/.config/mimeapps.list
		echo [Default Applications] >> /home/$line/.config/mimeapps.list
		...
			
fi

d)有了mimeapps.list这个文件,就直接根据support_mime_type修改这个文件的内容,当然就是sed了。对于已存在mimeapps.list文件的,先判断有没有配置过相关类型默认打开方式,如果有就覆盖掉了,如果没有就加上,所以加起来就是:

for mime_type in ${support_mime_type[*]}
do
	grep ${mime_type} /home/$line/.config/mimeapps.list > /dev/null
	if [ $? -eq 0 ] ;then
		echo "find setting ${mime_type}"
		sed -i 's#'${mime_type}'=.*#'${mime_type}'='$1'#g' /home/$line/.config/mimeapps.list
	else
		echo not setting ${mime_type}  yet
		sed -i '/\[Default Applications\]/a'${mime_type}'='$1'' /home/$line/.config/mimeapps.list
	fi
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.sh
	DESTINATION "/usr/bin/"
)

然后去spec文件的%post字段,也就是安装后执行的命令添加即可:

chmod 777 /usr/bin/set-archiver.sh
/usr/bin/set-archiver.sh org.kde.ark.desktop

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值