linux系统编程-shell基本命令和静态库与动态库

263 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

若看到相同文章,为本人其他平台

================== shell ==============

一、shell命令

1.shell是一种命令解释器

2.shell的种类:

1.bash  

2.sh

3.ksh

4.csh

5....

3.查看当前的shell类型 echo $SHELL

4.查看系统能支持的shell vi /etc/shells

5.command [-options] arg1 arg2 arg3

6.自动补齐:tab tab:写入一个命令的时候,可以用tab键来补全命令

二、命令

1.基本操作命令

1.1 pwd ==> 查看当前目录的绝对路径

1.2 ls ==> 查看当前目录下的可见文件

ls -a ==> 查看当前目录下所有文件(包含隐藏文件)

ls -l ==> 查看可见文件的详细信息

linux下一切皆是文件 (7种)

b: 块设备文件 block:存储设备文件

c: 字符设备文件 character:操作系统识别的字符设备

d: 目录文件 directory:目录文件

-: 普通文件

l: 连接文件 link:*软连接:ln -s 源文件 链接文件

  硬连接:ln 链接文件 源文件
  

s: 套接字文件 socket:进行网络传输的文件

p: 管道文件 pipe:进行进程间通信

fifo:

文件==》用户==》组用户

421 421 421

rwx rwx rwx r:代表可读 w:代表可写 x:代表可执行


7 7 7

第一组:表示文件所属用户可读可写可执行权限

第二组:表示文件所属用户同组的其它用户可读可写可执行权限

第三组:表示其他用户对文件拥有可读可写可执行的权限

1.3 chmod ==>chmod 777 文件名

将文件的权限规定为所有人对此文件都能执行读写执行的操作

chmod +x 文件名

规定所有人对此文件都有对此文件执行的权限

1.4 mkdir ==>mkdir 文件名

创建一个目录文件

1.5 rmdir ==>rmdir 文件名

删除一个空目录文件

rm -r 文件名

1.6 touch ==>touch 文件名

创建一个普通文件

vi 文件名

  1. 文件操作命令

4.1 cat ==> cat 文件名

在shell下查看文件

more ==> more 文件名

less ==> less 文件名

head ==> head 文件名 head -n 行数 文件名

tail ==> tail 文件名 tail -n 行数 文件名

2.2文件拷贝和移动 拷贝:cp

格式:cp 源文件 目标文件

移动:mv

格式:mv 源文件 目标文件

2.3.文件检索命令:

find ==> find -name 文件名

在当前目录及子目录下查找文件

==> find / -name 文件名

在系统中查找文件

==> find /home/linux -name 文件名

在/home/linux目录及子目录下查找文件

2.4.历史查询命令

history ==> history

查看shell下命令的历史记录

==> echo $HISTSIZE

打印history缓冲区的大小

==> HISTSIZE=2000

设置history缓存区大小

==> history -c

清空history缓存区

2.5.命令别名

alias ==> alias chakan='ls -l'

chakan将能实现ls -l的命令

alias 新命令='原始命令'

新建一个命令别名

unalias 新命令

删除一个命令别名

三、特殊:

1.通配符

  • 匹配满足字符串的任意长度任意字符的文件

? 匹配满足字符串的一个任意字符的文件

[] 匹配满足字符串的中括号内制定的文件

[-] 匹配满足字符串的中括号内从X-X的文件

[^] 匹配满足字符串的中括号内除了X的文件

2.管道

| 连接两个shell命令

将前面命令的输出作为后面命令的输入

ps -ef | grep XXX 查看某个进程状态

3.输出定向

echo helloworld > 1.txt

将本来应该打印在终端上的helloworld打印到1.txt文件中(覆盖源文件信息)

echo helloworld >> 1.txt

将北来应该打印在中断上的helloworld追击到1.txt文件中(不覆盖源文件信息,只是追加在文件末尾)

四、不常用

判断文件是否一致

diff file1 file2

判断文件类型

file 1.txt

中断显示

echo helloworld

echo $HISTSIZE

echo $SHELL

当前系统日期命令

date

查看当前登录用户

whoami

用户身份切换

su root

su linux

五、打包命令

1.打包 tar tar -cvf XXX.tar XXX

2.解包 tar tar -xvf XXX.tar

3.压缩 gzip gzip -c XXX.tar > XXX.tar.gz

4.解压 gunzip gunzip XXX.tar.gz

5.压缩 bzip2 bzip2 -K XXX.tar

6.解压 bunzip2 bunzip2 XXX.tar.bz2

7.组合键 tar -zcvf XXX.tar.gz XXX

tar -zxvf XXX.tar.gz

tar -jcvf XXX.tar.bz2 XXX

tar -jxvf XXX.tar.bz2

六、用户管理命令

ubuntu 1. 新建用户:sudo adduser XXX

  1. 修改密码:passwd XXX

  2. 删除用户:deluser XXX

  3. 切换用户:su XXX

/etc/passwd 保存与用户相关的信息

/etc/shadow 保存用户密码

/etc/group 保存用户组信息

/home/james 家目录

七、进程管理命令 1.程序:程序是一系列代码的集合 进程:程序执行的过程

ps -ef ==>查看当前操作系统中进程信息

ps aux ==>查看当前操作系统中进程信息

kill -9 进程号(pid) 杀死进程号对应的进程

killall -9 进程名 杀死所有进程名进程

top ==>根据CPU占用率去查看进程

————————————————

静态库:

第一步:

完成功能函数的编写,例如:hello.c

#include <stdio.h>

void hello(const char *name) { printf("hello %s !\n",name); }

第二步:

完成主调用函数的编写,例如:main.c

#include <stdio.h>

int main() { hello("everyone"); return 0;

}

第三步:

制作静态库:

1、gcc -c hello.c =》 hello.o

2、ar crs libmyhello.a hello.o =》libmyhello.a ====>必须以lib 开头 .a 结尾

第四步:

在住调用函数编译过程中链接静态库:

1、gcc -o hello main.c -L. -l myhello

2、执行效果查看,不论是否删除libmyhello.a 程序中已经编译进静态库

./hello

Hello everyone!

###############################################################################

动态库:

1、第一步,同制作静态库一样产生hello.o 文件

gcc -c hello.c =》 hello.o

2、第二步:制作动态库

gcc -shared -fPIC -o libmyhello.so hello.o ///注意:.o文件可以是多个

3、第三步:在主调函数中使用动态库

gcc -o hello main.c -L. -l myhello

小写字母L

4、第四步:将文件libmyhello.so复制到目录/usr/lib中

mv libmyhello.so /usr/lib

5、第五步:执行效果验证:

#./hello

hello everyone !

6、ldd命令可以查看一个可执行程序依赖的共享库,

ldd hello

    linux-gate.so.1 =>  (0x00110000)
    libmyhello.so => /usr/lib/libmyhello.so (0x00111000)
    libc.so.6 => /lib/libc.so.6 (0x00965000)
    /lib/ld-linux.so.2 (0x00940000)

###############################################################################

注意:

1、当静态库和动态库同名时, gcc命令将优先使用动态库

2、gcc -shared 参数使其生成是动态库而不是普通执行程序

3、功能函数可以没有头文件,但是在工程应用中最好加上头文件并声明功能函数

4、无论静态库,动态库,都是由.o文件创建 源程序hello.c通过gcc先编译成.o文件

5、在linux下,库文件一般放在/usr/lib和/lib下,

6、静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称

7、动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号,minor是副版本号