Linux指定目录安装软件及案例

最近发现CentOS8,更新了,就用虚拟机试用了下,发现挺多新功能。这里就不一一叙述,自行搜索相比7改进或新增了哪些功能。这里只写遇到的一个有用的知识点,画上标记,经常用到的,就是Linux命令行模式下,指定目录安装软件。

对于如何安装软件到指定目前前,先要知道如何查看已安装软件的目录及位置的方法。在linux中软件一般默认都是安装在到/usr/share/usr/local这两个路径下。但是:如果我们需要查看软件安装路径又怎么办呢?经过查询资料总结了四个办法。

本文包含了:linux查看软件安装路径,编译安装Git,编译安装python3及设置与python2共存的方法。

Linux查看软件安装目录及位置的N种方法

find 命令

语法:

1
find [path...] -options [-print / -ecex / -ok]

其中:path表示要查找的目录路径~表示home目录.表示当前目录/表示根目录等。
_options:有以下几种查找方式,按照名字查找(-name)按照文件类型来查找(-type) 等。

示例:找python find / -name python 结果为:

1
2
3
/usr/share/gcc-8/python
/etc/alternatives/python
/var/lib/alternatives/python

whereis 命令

该指令会在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。

语法:

1
whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]

示例:找python whereis python 结果为:

1
python: /usr/lib/python3.6 /usr/lib64/python3.6 /usr/include/python3.6m /usr/share/man/man1/python.1.gz

which 命令

which指令会在环境变量$PATH设置的目录里查找符合条件的文件。

语法:

1
which [文件...]

示例:找python which python 结果为:

1
/usr/bin/which: no python in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

其实,我是比较推荐后两种的。好用就是了,别问为什么,问就是简单好用。

学会了查找,再来学安装

以前也不明白,反正就是按教程上一顿复制粘贴,所以软件安装好了,也不知道安装在哪,为什么要这样做,反正就是糊涂的。这次借着安装CentOS8最小化安装后,学习一下软件安装,并记录下详细过程。

这次主要安装了两款软件,第一就是升级了python3 和编译安装了最新版的Git

先说说编译安装Git

原版本不记得了,可以用git --version查看版本。目地卸载以前的版本,安装2.26版。

先卸载老版本

1
sudo yum remove git

注意,如果编译环境不完整,先安装一遍:

1
sudo yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc xmlto perl-devel perl-CPAN autoconf*

因为最小化安装,当时边wget都不能用,顺便也一起安装了 yum -y install wget

进入 cd /usr/local/ 下载安装包,一般来说,下载安装包都放这里,自己习惯别的地方也行。

执行下载源文件命令:

1
sudo wget https://github.com/git/git/archive/v2.26.0.tar.gz

接下来解压文件,tar命令也不让用,尴尬了,先安装了yum install -y tar再继续:

1
sudo tar zxvf v2.26.0.tar.gz

解压到当前文件夹用 ls命令可查看到,重点来了,一定要进入刚解压的文件,再操作。cd v2.26.0,不然当你执行./configure --命令时,显示-bash: ./configure: 没有那个文件或目录,我踩过的坑之一。

执行 make configure 为了避免可能遇到的错误:make *** 没有指明目标并且找不到 makefile。

完成后执行-设置编译脚本:

1
sudo ./configure --prefix=/usr/local/git

说明:--prefix=参数

Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure–help输出详细的选项列表。其中,prefix选项是配源置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr/local/share,比较凌乱。

如果配置prefix,如:./configure –prefix=/usr/local/test可以把所有资源文件放在/usr/local/test的路径中,不会杂乱。 删起文件夹,删一个就行了,集中了。

接着就简单喽,就还有编译和安装了命令如下:

1
2
sudo make
sudo make instal

执行完后,把新安装的git目录加入环境变量,然后加载环境变量使其生效,命令如下:

1
2
sudo echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc
sudo source /etc/bashrc

查看新安装的Git版本号git --version显示git version2.26.0就对了

到此为止,Git安装最新版就完成了。

再说说编译安装Python

这里做说明,测试环境在CentOS7,原来就有python27,需要安装python3,并使python2和python3共存,使用时输入python2则是进入python2.7,输入python则进入python3,当然pip的版本随python版本变化,下边会讲到。

首先,我自己的应用,因为安装的是CentOS7最小化安装,可能 pip 没安装,git 没安装,wegt没安装,等,所以这些要在安装前先安装到位。本文下方有安装方法。

我用的是 python3.7 版本,如果是 python3.6 以下的版本,可以不一定要下面这个命令安装这么多依赖,但如果是 python3.7 的话,那就要了:

1
sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel

本次操作的原理
首先输入下面命令看一下当前 python2 的存在路径:

1
which python

显示的路径一般都是:/usr/bin/python
再输入下面命令看一下目前 /usr/bin目录下的 python文件有哪些:

1
2
cd /usr/bin
ls python*

结果一般都是:
python python2 python2.7
其实这几个文件是有固定链接关系的:

1
2
3
4
[bin]$ ls -al python*
lrwxrwxrwx. 1 root root 7 4月 23 2019 python -> python2
lrwxrwxrwx. 1 root root 9 4月 23 2019 python2 -> python2.7
-rwxr-xr-x. 1 root root 7136 8月 4 2017 python2.7

这里的意思就是,系统在找 python时, python指向了 python2,而 python2又指向了 python2.7,所以我们接下来就是让系统在输入 python2时就是找 python2,而输入 python时去找 python3,这无非就是 Linux 的软链接技巧而已,下面我们正式开始干:

备份原来的python,以防万一

1
sudo mv python python.bak

其实,如果不备份也是没关系的,只要 python2 还在就行了,因为本来那个 python 就是一个软链接,可以通过下面命令使得 python 还原:

1
sudo ln -s /usr/bin/python2 /usr/bin/python

指定下载目录

我们在 centos 上的一个目录下下载 python3 的安装包,我这里在 /usr/local下下载
cd /usr/local

1
sudo wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz

如果显示 -bash: wget: 未找到命令

则要安装wget工具:
输入:yum -y install wget 走你。

解压缩到当前文件夹

sudo tar -xvf Python-3.7.3.tgz

创建 python3 目录

sudo mkdir /usr/local/python3

准备编译

进入解压缩后的文件夹 如:(Python-3.7.3文件夹)并编译

cd /usr/local/Python-3.7.3
sudo ./configure –prefix=/usr/local/python3
sudo make
sudo make install

-bash: ./configure: 没有那个文件或目录

这些命令上边有讲过,还不明白的,看上边Git安装。

注意的东西,再写一次:

  • 在你配置指定路径时没有这样的文件或目录存在,先创建一个目录。
  • 可能现在执行的目录下没有configure 程序,你无法执行,你到configure所在目录下重新执行语句就可以了。
  • 我自己是因为把下载的Python-3.8.2.tgz 放在了 /usr/local/python3下,而执行命令时,我还在这个目录,并没有在解压后的Python-3.8.2目录

建立 python3 的软链接到 python

1
sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python

到此,可以说python3已经安装完成了。

验证一下

1
2
3
python
python2
yum

这里有个小知识点:CentOS7 和 CentOS8的小区别,8的包管理由DNF (YUMv4)完成。yum4基于DNF技术,yum4命令提供了与早期版本中使用的Yum v3的向后兼容性。CentOS 8里的 yum 命令只是到dnf的一个符号链接。CentOS 7 yum基于3.0.x版本。

这时,你会发现 yum 用不了了,那是因为本来 yum 是基于 python2 的,我们把 python 改为 python3.7 了,而 yum 还没有自动更改,所以我们要改动一下:

1
2
3
4
5
6
7
8
sudo vi /usr/bin/yum
# 把第一行的:

#!/usr/bin/python

# 改为:

#!/usr/bin/python2.7

保存退出,再输入 yum试一下?
那么,我们做了这么多,究竟是做了些什么呢?输入下面代码可以查看:

1
2
3
4
5
[bin]$ ls -al python*
lrwxrwxrwx. 1 root root 30 4月 23 12:00 python -> /usr/local/python3/bin/python3
lrwxrwxrwx. 1 root root 9 4月 23 2019 python2 -> python2.7
-rwxr-xr-x. 1 root root 7136 8月 4 2017 python2.7
lrwxrwxrwx. 1 root root 7 4月 23 2019 python.bak -> python2

还有 pip 也要变成 Python3 的

1
sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip

补充

  • centos7安装yum安装pip
1
2
yum -y install epel-release
yum -y install python-pip
  • CentOS7 多个python版本共存,解决yum命令安装错误:SyntaxError: invalid syntax 由于用户取消而退出

  • 必须修改的两个yum配置文件

因为yum使用python2,因此替换为python3后可能无法正常工作,继续使用这个python2.7.5,因此需要修改yum相关配置文件。

  • vi /usr/bin/yum

第一行:#!/usr/bin/python –> #!/usr/bin/python2.7

  • vi /usr/libexec/urlgrabber-ext-down

第一行:#!/usr/bin/python –> #!/usr/bin/python2.7

完成上面两步,现在使用yum命令基本不会出现这样的错误:SyntaxError: invalid syntax 由于用户取消而退出


本文参考了以下两篇博文
博文一
博文二