shell提供了对Linux系统的交互式访问,通常在用户登录终端时启动。系统启动的shell程序取决于用户账户的配置。
/etc/passwd/文件包含了所有用户的基本信息配置,
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
例如上述root账户信息配置包含7个数据字段,字段之间用冒号分隔。每个字段的含义后续会展开介绍,其中最后一个字段指定了用户使用的shell程序,即/bin/bash。
登录终端后会看到shell提示符$,也是默认bash shell的提示符,它表示shell在等待用户输入命令。
shell中使用man命令访问Linux系统的手册,man + [命令名]显示相应命令的手册页。
例如:使用man查询拷贝(copy)命令的介绍
$ man cp
CP(1) User Commands CP(1)
#命令名加简短描述
NAME
cp - copy files and directories
#命令语法
SYNOPSIS
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
#命令一般性描述
DESCRIPTION
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.
Mandatory arguments to long options are mandatory for short options too.
-a, --archive
same as -dR --preserve=all
--attributes-only
don't copy the file data, just the attributes
--backup[=CONTROL]
make a backup of each existing destination file
-b like --backup but does not accept an argument
--copy-contents
copy contents of special files when recursive
...
#手动上下键滚动手册,h键查看帮助,空间键翻页,q键退出手册
Manual page cp(1) line 1 (press h for help or q to quit)
man命令页支持关键词搜索,例如:
#我想查找renam(e)重命名命令手册
$ man -k renam
docker-container-rename (1) - Rename a container
docker-rename (1) - Rename a container
dpkg-name (1) - rename Debian packages to full package names
git-mv (1) - Move or rename a file, a directory, or a symlink
lvrename (8) - Rename a logical volume
mmove (1) - move or rename an MSDOS file or subdirectory
mren (1) - rename an existing MSDOS file
mv (1) - move (rename) files
rename.ul (1) - rename files
rename (2) - change the name or location of a file
renameat (2) - change the name or location of a file
renameat2 (2) - change the name or location of a file
vgrename (8) - Rename a volume group
zipnote (1) - write the comments in zipfile to stdout, edit comments and rename files in zipfile
Linux手册页常用段名
段 | 描述 |
---|---|
Name | 显示命令名和简短描述 |
Synopsis | 命令语法 |
Configuration | 命令配置信息 |
Description | 命令的一般性描述 |
Options | 命令选项描述 |
Exit Status | 命令的推出状态 |
Return Value | 命令的返回值 |
Errors | 命令的错误消息 |
Environment | 命令使用的环境变量 |
Files | 命令用到的文件 |
Versions | 命令的版本信息 |
Conforming To | 遵循的命令标准 |
Notes | 其他有帮助的资料 |
Bugs | 提交Bug的途径 |
Example | 命令的用法示例 |
Authors | 命令的开发人员信息 |
Copyright | 命令源码的版权信息 |
See Also | 与该命令类似的其他命令 |
如上手册页左上角和右上角CP(1)表示CP命令所在Linux的手册的第一节,为可执行程序或shell命令。
Linux手册页节
节号 | 所涵盖的内容 |
---|---|
1 | 可执行程序或shell命令 |
2 | 系统调用 |
3 | 库调用 |
4 | 特殊文件 |
5 | 文件格式与约定 |
6 | 游戏 |
7 | 概览、约定及杂项 |
8 | 超级用户和系统管理员命令 |
9 | 内核例程(routine) |
man支持查看命令特定节
$ man 2 rename
RENAME(2) Linux Programmer's Manual RENAME(2)
NAME
rename, renameat, renameat2 - change the name or location of a file
SYNOPSIS
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);
#include <fcntl.h> /* Definition of AT_* constants */
#include <stdio.h>
int renameat(int olddirfd, const char *oldpath,
int newdirfd, const char *newpath);
int renameat2(int olddirfd, const char *oldpath,
int newdirfd, const char *newpath, unsigned int flags);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
renameat():
Since glibc 2.10:
_POSIX_C_SOURCE >= 200809L
Before glibc 2.10:
_ATFILE_SOURCE
renameat2():
_GNU_SOURCE
Manual page rename(2) line 1 (press h for help or q to quit)
Linux系统部分虚拟目录文件路径如下
由根目录(/)出发,访问其他目录,如上test.txt文件路径为/home/zhangsan/Doucuments/test.txt。
Linux文件通常存储在根驱动器中,而用户文件则存储在其他驱动器中。Linux会将根驱动器上一些特别的目录作为挂载点(将虚拟目录中分配额外存储设备的目录),其文件结构如下:
硬盘Disk2挂载在硬盘Disk1 /home目录。
Linux常见目录(基于FHS标准)及用途如下:
目录 | 用途 |
---|---|
/ | 虚拟目录的根目录,通常不会在这里放置文件 |
/bin | 二进制文件目录,存放了很多用户级的GNU实用工具 |
/boot | 引导目录,存放引导文件 |
/dev | 设备目录,Linux在其中创建设备节点 |
/etc | 系统配置文件目录 |
/home | 主目录,Linux在其中创建用户目录 |
/lib | 库目录,存放系统和应用程序的库文件 |
/libname | 库目录,存放替代格式的系统和应用程序的库文件 |
/media | 媒介目录,可移动存储设备的常用挂载点 |
/mnt | 挂载目录,用于临时挂载文件系统的常用挂载点 |
/opt | 可选目录,存放第三方软件包 |
/proc | 进程目录,存放现有内核、系统以及进程相关的信息 |
/root | root用户的主目录 |
/run | 运行目录,存放系统的运行时数据 |
/sbin | 系统二进制文件目录,存放很多管理级的GNU实用工具 |
/srv | 服务目录,存放本地服务的相关文件 |
/sys | 系统目录,存放设备、驱动程序以及部分内核特性信息 |
/temp | 临时目录,可以在其中创建和删除临时工作文件 |
/usr | 用户目录,一个次目录层级结构 |
/var | 可变目录,存放经常变化的文件,比如日志文件 |
Linux文件系统中,使用cd命令进行目录切换
$ cd / 或 cd #切换到根目录
$ cd ~ #切换到当前用户目录
$ cd .. #切换到上一级目录
$ cd - #返回上一次目录
文件目录有两种表达方式:
绝对路径总是以根目录(/)作为起始,可以准确的表明用户想切换到的确切位置,例如
$ cd /usr/bin
查看当前目录,可以使用pwd(print work direction)命令
$ pwd
/home/zhangsan
相对路径不以/开头,而是以目录名或特殊字符起始,例如
$ cd bin/ #切换至当前目录下的bin文件下
bin$
$ cd ./bin #切换当前目录(./)下的bin目录下
$ cd .. #切换至当前目录的上一层目录
$ cd ../../test #切换至上上一层目录下的test目录下
通过ls命令可以列出目录及文件,常见用法如下
$ ls #ls命令基本形式显示当前目录下的文件和目录
bin ohos
$ ls -F #以文件类型显示当前目录下的文件和目录;目录名后接/, 可执行文件名后接*
bin/ ohos/ test.txt my_script*
$ ls -a #显示当前目录下所有目录和文件,包含隐藏目录和文件
. .bash_logout .ccache ...
.. .cache .config ...
$ ls -R #显示当前目录所包含的子目录中的文件
$ ls -l #以长列表格式显示当前目录下的文件和目录
total 8 #该目录文件锁分配的总块数
drwxrwxr-x 2 zhangsan zhangsan 4096 Dec 5 09:57 bin
drwxr-xr-x 4 zhangsan zhangsan 4096 Dec 4 14:57 ohos
-rw-r--r-- 1 zhangsan zhangsan 0 Jan 14 00:48 test.txt
第一条目录信息解析如下
其中文件类型包括:
文件权限:rwxrwxr-x为775
ls 后面可以根特殊字符或模式通配符进行过滤
$ ls test.txt #显示当前目录下,文件或目录名为test.txt的文件或目录
test.txt
$ ls test* #显示当前目录下,以test开头的文件或目录
test.txt test/ test1.doc
$ ls te[!s]t #!将不需要的内容排除在外
tet/ teat.doc tebt.txt
使用touch命令创建文件,文件以当前用户名作为该文件的属主
$ touch file.text
$ ls -l file.txt
-rw-r--r-- 1 zhangsan zhangsan 0 Jan 14 01:34 file.text
$ touch 1.doc 2.doc #touch支持同时创建多个文件
$ls -l *.doc
-rw-r--r-- 1 zhangsan zhangsan 0 Jan 14 01:36 1.doc
-rw-r--r-- 1 zhangsan zhangsan 0 Jan 14 01:36 2.doc
使用cp命令复制/拷贝文件或目录,将文件或目录从一个路径复制到另外一个路径。
$ cp ./test.txt ../ #将当前目录下的test.txt拷贝至上一层目录
需要注意
$ cp -i ./test.txt ../test.txt
cp: overwrite '../test.txt'? #y,覆盖;n,不覆盖
$ cp test.txt ./test #若./test不存在,则会将原文件拷贝成目标文件名的文件
$ tree
.
├── test #创建了新的test文件,内容与test.txt一致
└── test.txt
$ cp test.txt ./test/ #若./test不存在,则报错
cp: cannot create regular file './test/': Not a directory
$ cp test.txt ./test #若./test目录存在,则将test.txt拷贝至./test目录下
$ tree -a
.
├── test
│ └── test.txt
└── test.txt
cp命令的其他常见用法:
$ cp ./test/test.txt . # 将./test/test.txt文件拷贝至当前目录
$ cp -R test/ test1/ #将test目录全部文件拷贝至test1目录中
$cp -rf test/ test1/ #将test目录全部文件强制拷贝至test1目录中
链接:是目录中指向文件真实位置的占位符。
软件链接是一个真实存在的文件,该文件指向存放在虚拟目录结构中的另一个文件,这两个以符号方式链接在一起的文件彼此的内容并不相同。
通过ln命令为一个文件创建链接文件
$ ln -s test.txt slink_test.txt
ls -l *test.txt
lrwxrwxrwx 1 zhangsan zhangsan 8 Jan 14 20:11 slink_test.txt -> test.txt
-rw-r--r-- 1 zhangsan zhangsan 0 Jan 14 01:45 test.txt
注意
:slink_test.txt与test.txt的文件大小并不相同,着说明它们是两个完全不同的文件。
硬链接创建的是一个独立的虚拟文件,包含了原文件的信息及位置,本质是同一个文件。
$ ln test.txt hlink_test.txt
$ ls -l *test.txt
-rw-r--r-- 2 huzhou huzhou 0 Jan 14 01:45 hlink_test.txt
-rw-r--r-- 2 huzhou huzhou 0 Jan 14 01:45 test.txt
注意
硬链接不能跨文件系统,而软链接可以。
使用mv命令,进行文件重命名与文件移动相同,将文件或目录移动到另一个位置或者重新命名。
#将当前目录的test.txt重命名为test_bak.txt
$ mv ./test.txt ./test_bak.txt
$ ls -l test*.txt
-rw-r--r-- 2 zhangsan zhangsan 0 Jan 14 01:45 test_bak.txt
mv命名只影响文件名
使用rm命令删除文件或文件夹,常见使用方式如下:
$ rm ./test.txt #删除当前目录下test.txt文件
$ rm -i ./test.txt #删除文件前先询问是否真的要删除文件。
rm: remove regular empty file './test_.txt'?
$ rm -rf ./test #强制删除当前目录下test文件夹(所有文件)
$ rm -rf test*.txt #强制删除以test开头,.txt结尾的文件
使用mkdir命令创建目录
$ mkdir test #在当前目录下创建test文件夹
$ mkdir -p testA/testB/testC #根据需要创建确实的父目录
使用rm -r 或rm -R删除目录
$ rmdir test # rmdir只能删除空目录
rmdir: failed to remove 'test': Directory not empty
$ rm -r test #递归删除test目录内容
使用file命令查看文件类型
$ file test.txt #查看文件类型,test.txt是ASCII文本文件
test.txt: ASCII text
$ file test/ #查看目录文件类型,test是目录
test/: directory
$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2f15ad836be3339dec0e2e6a3c637e08e48aacbd, for GNU/Linux 3.2.0, stripped
使用cat查看文件详细内容
$ cat test.txt #查看test.txt文件所有内容
this is a test file
$ cat -n test.txt #查看test.txt文件所有内容,并显示行号
1 this is a test file
对于大文件而言,cat在查看文件内容时会一闪而过,可以使用more命令(分页工具+),按页显示文本内容
$ more /etc/profile
more命令还有一个升级版本,即less,它比more提供了前后翻页和搜索等功能。
$ less /etc/profile
head命令,查看文件的最开始几行内容,默认10行
$ head ./test.txt #查看./test.txt文件的前10行
$ head -n -2 ./test.txt #查看./test.txt文件的前2行
tail命令,查看文件的最后几行内容,默认10行
$ tail /etc/profile #查看/etc/profile文件的最后10行内容
$ tail -n 2 /etc/profile #查看/etc/profile文件的最后2行内容