linux系统关于目录结构、链接库、命令执行、环境变量

使用linux系统,常常会遇见程序运行报错,不是缺包就是找不到命令,我关于命令执行的过程一直有所困扰,比如调试代码时抛出XXX command not found……
Linux系统涉及到的方面很多,本篇博客目的是进行阶段总结。更多内容还待完善,待更新

目录结构

目录结构
根目录 / 是 linux 中最核心的一个目录,所有的目录和文件都在它下面,从 / 开始,呈树状结构。
几个重要目录:

  • /root ::root用户的家目录,超级用户(系统管理员)的主目录
  • /bin: 存放二进制可执行文件(cat,chmod(修改权限), chown, date, mv, mkdir, cp, bash等等常用的指令),常用命令一般都在这里,做了个软链接到 /usr/bin
  • /sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等,做了个软链接到 /usr/sbin
  • /lib、/lib64: 这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库
    /lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已 。 什么是函式库呢?妳可以将他想成是外挂,某些指令必须要有这些外挂才能够顺利完成程式的执行之意。 尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模组(驱动程式)。

/bin /sbin/ /lib /etc /dev 这五个目录与开机有关

  • /usr : /usr不是user的缩写,而是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据啦, 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录
    /usr目录里面包括 /usr/local、/usr/bin 、/usr/sbin 、/usr/lib 、/usr/lib64 ,这四个目录跟前面对应的那四个目录是一样的。/usr/local 里面也有这四个目录,应用可以常安装到 /usr/local下
  • /usr/bin: 系统用户使用的应用程序和命令(请注意到他与/bin的不同之处:/bin与开机过程有关)

明显一点的区别 比如/bin下没有python命令,而/usr/bin下有python命令

  • /usr/sbin: 超级用户使用的高级的管理程序和系统守护程序
  • /usr/src: 内核源代码默认的放置目录
  • /usr/local: 管理员在本机自行安装自己下载的软件,建议安装到此目录, 这样会比较便于管理。举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版, 此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别啦。 你可以自行到/usr/local去看看,该目录下也是具有bin, etc, include, lib…的次目录

/bin, /usr/bin 是给系统用户使用的指令(除root外的普通用户),而/sbin, /usr/sbin 则是给root使用的指令

  • /boot: 引导文件存放目录,存放跟启动系统相关的文件,包括一些连接文件以及镜像文件
  • /etc: 存放所有的系统需要的配置文件和子目录列表,更改目录下的文件可能会导致系统不能启动
  • /sys: 存放跟系统内核以及跟硬件驱动程序相关的文件。这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统
  • /home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,也可以用~user表示
  • /mnt: 系统提供该目录是为了让用户临时挂载别的文件系统的,用户可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。默认为空
  • /dev: dev是Device(设备)的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的
  • /media: 媒介挂载目录。默认为空
  • /srv : 存放某些服务启动后产生的文件
  • /opt: 额外安装应用的可选安装位置
  • /proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息
  • /var: 用于存放运行时经常改变数据的文件,我们习惯将那些经常被修改的目录放在这个目录下,比方说各种服务的日志文件(系统启动日志等)等
  • /tmp: 用于存放各种临时文件,是公用的临时文件存储点
  • /run: 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除(跟 /var/run 是同一个目录)

ldd 命令的绝对路径:查看该命令依赖哪些库文件

文件类型

Linux下常见的文件扩展名有:.html、.jpg、.gif、.png、.pdf、.png、.doc、.obt、.txt

类型用途
.conf配置文件
.cfg保存用户的配置设置。一般为只读
.so类库文件
.o程序目标文件
.hC\C++头文件
.cppC++代码文件
.cC代码文件
.bz2bzip2的压缩文件
.gzgizp压缩文件
.tar打包文件,非压缩
.tbztar打包并bzip压缩
.tgztar打包并gzip压缩

关于.so类型:
在linux环境下,c++编译得到库文件后缀包括:.so or .a or .la,当然,linux下文件的类型是不依赖于其后缀名的,后缀及其含义:
.so 为共享库 : 动态库(shared library/shared object/dynamic link library)
.so.1, .so.6等:后边的是表示版本而已,这都是动态运行库,大部分属于基础库,即glibc。
.a为静态库 : archive / static library
.la为libtool自动生成的一些共享库,可以用vi编辑查看,主要记录了一些配置信息。可以用如下命令查看*.la文件的格式 file *.la

https://blog.csdn.net/zhu_xun/article/details/16823989

关于动态链接库

linux系统下,若使用动态链接库进行调用函数,需注意在编译和执行时不同,即使编译时通过,但当运行时也可能会报错。进行动态链接库设置时就可以用到LD_LIBRARY_PATH环境变量,详情查看
linux中环境变量及环境变量配置文件详解linux中的动态链接库linux下添加动态链接库路径的方法

Shell 命令搜索机制

试想过一个问题,为什么我们可以在任何目录执行像lscat这些命令,而没有指定其绝对或者相对路径呢?却不会提示:command not found呢?这全是PATH的功劳了。
PATH is an environmental variable in Linux and other Unix-likeoperating systems that tells the shell which directories to search for executable files (i.e., ready-to-run programs) in response to commands issued by a user. It increases both the convenience and the safety of such operating systems and is widely considered to be the single most important environmental variable.
通常,我们在Linux系统终端提示符下键入如ls等命令时,shell是如何找到这个命令的呢? shell下都有哪几类命令呢? 这些命令是如何被加载的呢?
当我们键入某个命令时, 那么shell会按照alias->keyword->function->built-in->$PATH的顺序进行搜索, 本着”搜索顺序是从左至右的,先到先得”的原则,当然, 这不是绝对的。
大致可以分为以下4个步骤:

  1. 判断路径
    判断用户是否以绝对路径或相对路径的方式输入命令(如 /bin/ls),如果是的话直接执行。
  2. 检查别名
    Linux 系统会检查用户输入的命令是否为“别名命令”。可以通过 alias 命令是可以给现有命令自定义别名的,即用一个自定义的命令名称来替换原本的命令名称。如:
[root@localhost ~]# rm a.txt    <-- 假定当前目录中已经存在 a.txt 文件
rm: remove regular file 'a.txt'? y     <-- 手动输入 y,即确定删除
[root@localhost ~]#
[root@localhost ~]# alias rm
alias rm='rm -i'
[root@localhost ~]# unalias rm
[root@localhost ~]# rm a.txt
[root@localhost ~]#      <--直接删除,不再询问
  1. 判断是内部命令还是外部命令
    Linux命令行解释器(又称为 Shell)会判断用户输入的命令是内部命令还是外部命令。其中,内部命令指的是解释器内部的命令,会被直接执行;而用户通常输入的命令是外部命令。
    内部命令由 Shell 自带,会随着系统启动,可以直接从内存中读取;而外部命令仅是在系统中有对应的可执行文件,执行时需要读取该文件。
    判断一个命令属于内部命令还是外部命令,可以使用type命令实现。which命令用于查找某个命令所在的绝对路径。例如:
[root@localhost ~]# type pwd
pwd is a shell builtin  <-- pwd是内部命令
[root@localhost ~]# type top
top is /usr/bin/top  <-- top是外部命令
[root@localhost ~]# which rm
/bin/rm
[root@localhost ~]# which rmdir
/bin/rmdir
[root@localhost ~]# which ls
/bin/ls
  1. 查找外部命令对应的可执行文件
    当用户执行的是外部命令时,系统会在指定的多个路径中查找该命令的可执行文件,而定义这些路径的变量,就称为 PATH 环境变量,其作用就是告诉 Shell 待执行命令的可执行文件可能存放的位置,也就是说,Shell 会在 PATH 变量包含的多个路径中逐个查找,直到找到为止(如果找不到,Shell 会提示command not found)。
    为此,先执行如下命令:
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin

PATH 环境变量的内容是由一堆目录组成的,各目录之间用冒号“:”隔开。当执行某个命令时,Linux 会依照 PATH 中包含的目录依次搜寻该命令的可执行文件,最先被找到的可执行文件,被正常执行;反之,则提示无法找到该命令。
从执行结果中可以看到,/bin 目录已经包含在 PATH 环境变量中,因此可以直接使用命令名,Linux 也可以找到该命令。

http://c.biancheng.net/view/5969.html

PS:hash命令:
首先, 我们来看hash命令(我上面说的”不是绝对的”有关系了!), hash命令用于记录在当前shell环境下用户曾经键入的命令路径记录缓存表, 主要是为了加快命令搜寻速度. 下面看个例子:
例:我在shell下键入 ls, find, pwd, ls, echo “Hello, world”, mail、if:

ls
find
pwd
ls
echo “Hello, world”
mail
if

那么, 现在我执行hash命令, 其显示结果为:

root-abc$ hash
hits command
1    /bin/mail
2    /bin/ls
1    /usr/bin/find

上述结果中,左边一列表示该命令在当前shell环境下共被使用了几次, 右边一列表示命令路径. 但是我们发现这个hash缓存中缺少了if,pwd和echo这3个命令, 为什么呢? 因为hash不会记录function, built-in命令(其实还包括alias)。因为这类命令没有路径, 即不会存在于某个目录之下, 它们是随shell而加载进而存在于内存中, 所以这样的命令没有必要进行缓存,提高搜索效率了

https://blog.51cto.com/skypegnu1/1620444

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值