天天看点

/usr/bin/install: *** 与 *** 为同一文件

太长不看系列:

install 相当于是一个拷贝cp命令,请检查文件安装的目录和文件所在目录是否相同。

今天在做postgresql编写扩展练习的时候,遇到了如下报错。

$ make install

/bin/mkdir -p '/usr/share/postgresql/9.5/extension'

/bin/mkdir -p '/usr/share/postgresql/9.5/extension'

/usr/bin/install -c -m 644 .//base36.control '/usr/share/postgresql/9.5/extension/'

/usr/bin/install: './/base36.control' 与'/usr/share/postgresql/9.5/extension/base36.control' 为同一文件

/usr/lib/postgresql/9.5/lib/pgxs/src/makefiles/pgxs.mk:116: recipe for target 'install' failed

make: *** [install] Error 1

本练习参考的链接如下:

http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/

参照 PostgreSQL插件开发踩坑之路1 规避了一些坑,但还是因为对linux操作不熟练进入了另一个坑。

问题背景

extension 的 base36.control 文件和 base36--0.0.1.sql 文件应该放在 /usr/share/postgresql/9.5/contrib/myExtension 目录下的,但是因为我的误操作,把它们直接创建在了 /usr/share/postgresql/9.5/extension 目录下。make install 命令,实际上执行的是一个拷贝操作,把Makefile所在目录内base36.control、base36--0.0.1.sql 文件复制到的 /usr/share/postgresql/9.5/extension 目录下。参考:linux里install命令和cp命令的区别

基本上,在Makefile里会用到install,其他地方会用cp命令。

它们完成同样的任务——拷贝文件,它们之间的区别主要如下:

1、最重要的一点,如果目标文件存在,cp会先清空文件后往里写入新文件,而install则会先删除掉原先的文件然后写入新文件。……

原理解释

install命令 实际是把 Makefile所在文件夹中的base36--0.0.1.sql、base36.control 复制到 /usr/share/postgresql/9.5/extension 目录下,而我因为  Makefile、base36--0.0.1.sql、base36.control 这三个文件都在 /usr/share/postgresql/9.5/extension 目录下,也就意味把base36--0.0.1.sql、base36.control从本目录复制到本目录,所以会报错。

问题解决

这个问题解决还挺容易的,就是把原来的Makefile、base36--0.0.1.sql、base36.control 这三个文件放在 /usr/share/postgresql/9.5/contrib/myExtension 目录下,然后通过 $ make install 把它们install到 /usr/share/postgresql/9.5/extension 目录下。