ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从0到1:linux的底层逻辑与高频指令

从0到1:linux的底层逻辑与高频指令 目录一、linux的底层逻辑1.1 Linux指令的本质1.2 ls 与 ls -al 与 ll1.3 linux中一切皆文件二、高频指令详解2.1 man指令查看联机手册2.2 echo :输出内容与文件操作2.3 cat 读取文件内容输出到stdout屏幕2.4 cp :复制文件/目录2.5 mv: 移动/重命名文件是剪切不是复制一、linux的底层逻辑文件文件内容文件属性1.1 Linux指令的本质linux中用到的指令如ls tree pwd等本质为系统预先编译好的可执行程序分为两类内置指令如cd alias是shell自带程序无独立路径输入which查不到外置指令如ls 是/usr/bin下的独立文件输出which可查到因此指令可执行程序二进制文件可执行文件都是一回事。ubuntuVM-0-4-ubuntu:~$ which ls /usr/bin/ls ubuntuVM-0-4-ubuntu:~$ which pwd /usr/bin/pwd ubuntuVM-0-4-ubuntu:~$ which touch /usr/bin/touch注which指令查看指令命令所在路径1.2 ls 与 ls -al 与 ll命令本质输出ls命令仅文件名ls -alls -扩展显示全部文件含隐藏文件的详细信息ll等价于ls -al与ls -al一致对于第三条ll 在不同的服务器上会有不同的含义比如有的机器上表示ls -l那么如何判断究竟是什么的简写呢可以用到alias命令rootVM-0-4-ubuntu:~# alias ll alias llls -alF在我的服务器上ll表示为上述含义另外可以看到我目前将用户切换为了root用户如果你是普通用户只需要输入sudo -i即可完成切换如果想退出则输入exit或su - 用户名ubuntuVM-0-4-ubuntu:~$ sudo -i rootVM-0-4-ubuntu:~# exit logout ubuntuVM-0-4-ubuntu:~$ sudo -i rootVM-0-4-ubuntu:~# su - ubuntu ubuntuVM-0-4-ubuntu:~$此外alias还可以给指令取别名比如ubuntuVM-0-4-ubuntu:~$ alias zsls -l ubuntuVM-0-4-ubuntu:~$ alias zs alias zsls -l ubuntuVM-0-4-ubuntu:~$删除别名用unalias重启后也会将别名消除ubuntuVM-0-4-ubuntu:~$ unalias zs ubuntuVM-0-4-ubuntu:~$ alias zs -bash: alias: zs: not found注这里 仅介绍alias的功能1.3 linux中一切皆文件Linux中显示器键盘磁盘网卡等都可以看作是文件存于/dev目录比如终端窗口对应/dev/pts/N设备文件N为编号向其写入内容会直接在终端显示#查看终端设备文件 rootVM-0-4-ubuntu:~# ls -l /dev/pts total 0 crw--w---- 1 ubuntu tty 136, 0 Sep 27 10:51 0 crw------- 1 root tty 136, 1 Sep 27 11:04 1 crw------- 1 root tty 136, 2 Sep 27 15:39 2 crw------- 1 root tty 136, 3 Sep 27 15:40 3 c--------- 1 root root 5, 2 Sep 25 20:58 ptmx #向终端写入内容在终端1可见 rootVM-0-4-ubuntu:~# echo hello from terminal 0 /dev/pts/1 hello from terminal 0这里的c开头的代表字符设备文件键盘显示器这类流式文件136,0主设备号、次设备号内核用来识别硬件设备对于键盘显示器是字符设备的理解比如无论是输入还是输出“12345”都是按照字符读入或读出的。而不是读整数printf(“%d”,aC 语言三个默认打开的标准流FILE*程序运行时系统会自动打开这 3 个文件流不用手动fopenstdin标准输入 → 对应键盘scanf底层就是读 stdinstdout标准输出 → 对应显示器printf底层就是往 stdout 写stderr标准错误 → 对应显示器专门输出错误信息命令行输出重定向默认echo的内容是写入 stdout直接打印到显示器。echo的含义是向显示器写入。# 直接输出到屏幕 echo abcdefg123456789 # 输出重定向不再打印屏幕把stdout写入 message.txt echo abcdefg123456789 message.txt改变 stdout 写入方向写到指定文件如果文件存在先清空文件再写入不存在则先创建再写入: 追加写入文件如 echo b file最后cat message.txt就可以看到刚刚写入的内容。而: 从文件读取输入如 wc -l file而如果想要把文件清空可以使用message.txt前有空格在上面更详细的介绍之后我们总结重定向规则输出重定向改变 stdout 的输出目的地输入重定向改变 stdin 的输入来源不再是键盘换成文件 追加重定向在现有文件中追加/dev/pts 终端设备ls /dev/pts -l查看伪终端设备每一个远程 / 图形终端都是一个字符设备文件对应我们当前的显示器 键盘。二、高频指令详解2.1 man指令查看联机手册功能查阅指定命令的手册如现在输入man ls显示了ls的手册看这里看第一行LS(1)那么同样的man也可以查man本身如输入man man会看到这一部分序号1-9分别代表man可以查到的9个手册但常用的为前三个,分别代表普通命令系统调用库函数。man默认匹配第一个表所以如果现在再看上图LS(1)有个括号1就说明查到了表一结束了那么如果想查指定命令的其他表可以输入中间的数字代表想查的第几个表man 2 fork #fork是啥不用管我这里只是引用一下会输出这样的结果这些英文显示可以汉化但是不建议也不予说明了感兴趣可以询问AI会详细说明。2.2 echo :输出内容与文件操作在上面我们提到了echo的一些用法这里一并归类其功能为打印文本或向文本写入rootVM-0-4-ubuntu:~# echo hello //向显示器写入 hello rootVM-0-4-ubuntu:~# echo First text.txt //向文件写入 rootVM-0-4-ubuntu:~# echo sec text.txt //在文件后追加 rootVM-0-4-ubuntu:~# cat text.txt //cat表示输出 First sec2.3 cat 读取文件内容输出到stdout屏幕常见用法ubuntuVM-0-4-ubuntu:~$ echo 111 text.txt #将111写入text.txt ubuntuVM-0-4-ubuntu:~$ cat text.txt 111 ubuntuVM-0-4-ubuntu:~$ cat text.txt 111 ubuntuVM-0-4-ubuntu:~$ cat text.txt 1.txt #从text.txt读出并写入1.txt如不存在1.txt则创建 ubuntuVM-0-4-ubuntu:~$ ls 1.txt snap text.txt ubuntuVM-0-4-ubuntu:~$ cat 1.txt 111 ubuntuVM-0-4-ubuntu:~$ 1.txt #清空1.txt ubuntuVM-0-4-ubuntu:~$ cat 1.txt ubuntuVM-0-4-ubuntu:~$指令区别cat text.txtcat 打开文件cat text.txtshell 打开文件把文件内容喂给 cat 的标准输入而cat刚刚我们说了是输出到屏幕如果后面啥也不接则从键盘写入ubuntuVM-0-4-ubuntu:~$ cat as^H^H^H^H^H^Haxaxaihh #我从键盘乱打的2.4 cp :复制文件/目录功能复制文件或目录也可以把文件拷贝到其他目录如果目标文件存在则覆盖不存在则创建。功能示例1. 复制单个文件cp test.txt copy.txt把test.txt复制一份新文件名叫copy.txt如果copy.txt不存在 → 创建新文件如果copy.txt已经存在 → 直接覆盖里面内容⚠️不会提醒cp test.txt ../把test.txt复制到上级目录文件名保持不变。2. 复制多个文件到目标目录cp test.txt hello.txt ./mydir/把 test.txt、hello.txt 两个文件都复制到 mydir 文件夹里面。最后一个参数必须是目录。3. 复制文件夹目录必须加-r/-Rcp -r mydir newdir-r/-R递归复制把目录里面所有子文件、子目录一起复制不加-r直接 cp 目录会报错cp的常见扩展-i覆盖前询问cp -i test.txt copy.txt # 提示 overwrite? 输入y覆盖n取消-n不覆盖已有文件安全不会覆盖-a归档复制 保留权限、创建时间、软链接-v显示复制过程打印正在复制哪些文件-f 强行复制文件或目录不论文件或者目录是否已经存在2.5 mv: 移动/重命名文件是剪切不是复制功能1. 重命名源和目标在同一个目录mv old.txt new.txtold.txt → 改名叫 new.txt如果 new.txt 已存在直接覆盖无提醒2. 移动文件源和目标不在同一目录mv test.txt ../把 test.txt 移动到上级目录。mv test.txt mydir/把 test.txt 移动到 mydir 目录下文件名不变。3. 移动目录mv移动目录不需要加 -r这点和 cp 不一样mv dir1 dir2如果 dir2不存在dir1 重命名为 dir2如果 dir2已经存在把 dir1 整个文件夹移动到 dir2 里面常用选项-i覆盖前询问y 覆盖n 放弃-f如果目标文件已存在不会询问直接覆盖示例ubuntuVM-0-4-ubuntu:~$ mv text.txt 1.txt #给文件改名 ubuntuVM-0-4-ubuntu:~$ ls 1.txt snap ubuntuVM-0-4-ubuntu:~$ touch myfile.txt ubuntuVM-0-4-ubuntu:~$ ls 1.txt myfile.txt snap ubuntuVM-0-4-ubuntu:~$ mv 1.txt myfile.txt #给文件改名 ubuntuVM-0-4-ubuntu:~$ ls myfile.txt snap ubuntuVM-0-4-ubuntu:~$ touch 1.txt ubuntuVM-0-4-ubuntu:~$ ls 1.txt myfile.txt snap ubuntuVM-0-4-ubuntu:~$ mkdir temp ubuntuVM-0-4-ubuntu:~$ ls -l total 12 -rw-rw-r-- 1 ubuntu ubuntu 0 Sep 27 17:16 1.txt -rw-rw-r-- 1 ubuntu ubuntu 4 Sep 27 16:12 myfile.txt drwx------ 3 ubuntu ubuntu 4096 Sep 26 21:19 snap drwxrwxr-x 2 ubuntu ubuntu 4096 Sep 27 17:17 temp ubuntuVM-0-4-ubuntu:~$ mv myfile.txt temp #把文件移动到其他目录 ubuntuVM-0-4-ubuntu:~$ ls 1.txt snap temp ubuntuVM-0-4-ubuntu:~$ ls temp myfile.txt ubuntuVM-0-4-ubuntu:~$ tree . ├── 1.txt ├── snap │ └── tree │ ├── 54 │ ├── common │ │ └── marker_publisher_changed_announcement_shown │ └── current - 54 └── temp └── myfile.txt #跑到这个目录下了 7 directories, 3 files ubuntuVM-0-4-ubuntu:~$ cd temp ubuntuVM-0-4-ubuntu:~/temp$ mkdir temp1 ubuntuVM-0-4-ubuntu:~/temp$ tree .. .. ├── 1.txt ├── snap │ └── tree │ ├── 54 │ ├── common │ │ └── marker_publisher_changed_announcement_shown │ └── current - 54 └── temp ├── myfile.txt └── temp1 #temp1现在在这里 8 directories, 3 files ubuntuVM-0-4-ubuntu:~/temp$ mv temp1 .. ubuntuVM-0-4-ubuntu:~/temp$ tree .. .. ├── 1.txt ├── snap │ └── tree │ ├── 54 │ ├── common │ │ └── marker_publisher_changed_announcement_shown │ └── current - 54 ├── temp │ └── myfile.txt └── temp1 #移动到这里了 8 directories, 3 files ubuntuVM-0-4-ubuntu:~/temp$以上就是本期的全部内容❤
返回列表