1. 基本常识
$ :普通用户# :超级用户root~ :用户家目录/ :系统根目录
1.1 命令行中的快捷键
Ctrl + a : 定位行首
Ctrl + e : 定位行尾
Ctrl + f : 光标向前移动
Ctrl + b : 定位向后移动
Ctrl + d : 删除光标所在的字符
Ctrl + t : 交换光标所在位置与其前面的字符
Ctrl + u / k : 剪切光标前的和光标后的所有字符
Ctrl + y : 粘贴
若改成Alt + d/t : 对单词的操作
Alt + l / u : 改成小写/大写(注意,改写的范围为光标所在位置到当前单词的结尾)
Ctrl + l: = clear
2. 常用命令
2.1 查看命令
2.2.1 文件函数查看
man -k(keyword) = apropos 显示所有的匹配函数,类似一个目录:
[test@VM-12-4-centos ~]$ apropos printf
asprintf (3) - print to allocated string
[test@VM-12-4-centos ~]$ man 3 asprintf
[test@VM-12-4-centos ~]$ info ls
上下键翻页、u上级目录、n/p下一个和上一个node、带* 可以按回车键进入
[test@VM-12-4-centos ~]$ ls [!.]*
[test@VM-12-4-centos ~]$ ls -l $(which mkdir)
-rwxr-xr-x 1 root root 79768 Nov 17 2020 /usr/bin/mkdir
* ? [char] [!char] [:digit:]
[test@VM-12-4-centos first]$ ls -l
-rwxrwxr-x 1 test test 8408 May 30 18:42 main
[test@VM-12-4-centos first]$ ls -nl
-rwxrwxr-x 1 1001 1001 8408 May 30 18:42 main
-
Access:文件最近被访问的时间;最新的系统中,不会立即更新,有一定时间间隔OS才会更新时间,防止过多系统资源的消耗。 -
Modify:最近一次修改文件内容的时间,修改内容时也可能修改属性(文件大小等)。应用场景:make 时会对比可执行文件时间和源文件时间,判断是否继续make -
Change:最近一次修改文件属性的时间,写入文件内容也可能改变Change的时间(内容造成了所占空间的属性变化)
[test@VM-12-4-centos 123]$ stat test.c
File: ‘test.c’
Size: 1032 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 1577177 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ test) Gid: ( 1001/ test)
Access: 2022-05-28 11:15:22.725417793 +0800
Modify: 2022-04-04 11:45:50.076246419 +0800
Change: 2022-04-04 11:45:50.093246362 +0800
Birth: -
[test@VM-12-4-centos 123]$ file test.c
test.c: C source, ASCII text
[test@VM-12-4-centos ~]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
alias 表示对ls起了一个别名
[test@VM-12-4-centos 123]$ alias ls='ls -al --color=auto'
[test@VM-12-4-centos 123]$ ls
total 68
drwxrwxr-x 2 test test 4096 Apr 4 11:45 .
drwx------ 18 test test 4096 May 28 18:40 ..
-rw-rw-r-- 1 test test 68 Mar 29 16:50 Makefile
-rw-rw-r-- 1 test test 1032 Apr 4 11:45 test.c
使用unalias 可以取消这个别名
可以用来查看某个名称是否被占用
[test@VM-12-4-centos ~]$ type ls
ls is aliased to `ls --color=auto'
[test@VM-12-4-centos ~]$ whatis ls
ls (1) - list directory contents
ls (1p) - list directory contents
行正序和行倒序输出
选项: -n (带行号输出)
-A(查看格式) [$]-换行 [.^.I]-制表符 ?-s (合并空行)
[test@VM-12-4-centos test2]$ tail -n +2 main.c
[test@VM-12-4-centos 123]$ head -3 test.c
回车:向下翻一行
空格:向下翻一页
可以向上(k )和向下(j )翻一行
也可以空格 、b 翻一页
/ +内容 :查找
q :退出
选项:-n (加行号显示) -i (忽略大小写) -v (文字的反向选择) -l (默认匹配文件名:字符出现行,带l可以只匹配文件名) -h (只匹配字符出现的行)
[test@VM-12-4-centos ~]$ grep -l main*
main.c
main.txt
[test@VM-12-4-centos ~]$ grep main*
main.c:int main()
main.txt:main.txt
[test@VM-12-4-centos ~]$ grep -h main*
int main()
main.txt
[test@VM-12-4-centos 123]$ less test.c | grep 'main'
int main()
[test@VM-12-4-centos 123]$ less test.c | grep -v 'main'
int main()
.(任意) $ ^ [] -
下面是扩展表达(需要加 -E 选项):
*(匹配任意字符) +(匹配1个或多个字符) ?(匹配0或1个字符) {}(匹配限定个字符) ()(给定一个组) |(字符串或匹配)
[test@VM-12-4-centos ~]$ grep -h '.re' main*
Binary file main matches
return 0;
[test@VM-12-4-centos ~]$ grep 're$' main*
main.txt:Picture
[test@VM-12-4-centos ~]$ grep '^in' main*
main.c:int main()
[test@VM-12-4-centos ~]$ grep '^[i#]' main*
main.c:
main.c:int main()
[test@VM-12-4-centos ~]$ grep '[^i#]' main*
[test@VM-12-4-centos ~]$ grep '[a-z]' main*
Binary file main matches
main.c:
main.c:int main()
main.c: while(1)
main.c: printf("hello world\n");
main.c: return 0;
[test@VM-12-4-centos ~]$ grep -E '[(a-z)]{4}\(' main*
main.c:int main()
main.c: while(1)
main.c: printf("hello world\n");
[test@VM-12-4-centos ~]$ grep -E 'mai|ret' main*
Binary file main matches
main.c:int main()
main.c: return 0;
main.txt:main.txt
2.2.2 系统进程查看
uname -a 显示系统信息top 任务管理器 q 退出
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
优先级 nice 虚拟内存 实际内存 共享内存
ps axj
ps aux
[test@VM-12-4-centos first]$ ps -al
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1001 8339 13095 0 80 0 - 1833 hrtime pts/1 00:00:00 main
?? PRI 和NI 构成了优先级的级别。值越小,优先级越高。NI 为修正数据,Linux通过修改nice值 修改优先级,而不是直接修改PRI 。
??PRI 默认大小为80,NI 的范围为[-20, 19],PRI[new] = PRI[old] + NI = [60, 99]。即Linux进程的优先级共有40个级别。
??进程的优先级会由操作系统自动修改。优先级防止了某个进程因长时间竞争不到CPU资源而导致进程饥饿。
free -k(Kb) -m(Mb) -g(Gb) 查看内存使用情况df -h 硬盘使用情况du -h filename 查看文件大小nautilus 任务管理器 = 图形界面版- 日期的查看
date +%Y%m%d-%H:%M:%S date +%s - 时间戳 date +%Y%m%d-%H:%M:%S -d @时间戳 # 转化
2.2 用户及权限管理
创建一个新的用户,注意不使用adduser (这是一个脚本)
cat /etc/passwd
cat /etc/shadow
cat /etc/group
将用户添加到组
useradd -g group username
usermod -a -G group username
常用于用户的切换,也可执行一条其他用户才有权限执行的命令但不改变当前用户(类似sudo )
[test@VM-12-4-centos Sticky]$ ls /root
ls: cannot open directory /root: Permission denied
[test@VM-12-4-centos Sticky]$ su -c 'ls /root'
Password:
linux_amd64_server.tar.gz
- 首先看一下文件类型,使用
ls -l 查看的文件首字符即为文件类型
-:普通文件
d: 目录
s: 套接字
p: 管道 mkfifio
l: 链接文件 ln -s file soft
b: 块设备(磁盘)
c: 字符设备(键盘,显示器)
对比普通文件和目录说明权限的作用:
用户 | 缺少权限 | 普通文件 | 目录 |
---|
owner | -r | 文件拥有者无法读 | 目录文件拥有者无法查看目录下的内容,但可以创建 | owner | -w | 文件拥有者无法写 | 目录文件拥有者无法向目录创建文件 | owner | -x | 文件拥有者无法执行 | 目录文件拥有者无法进入目录,无法查看目录下文件属性。只能查看文件名 | group | -r | 组内用户无法读 | 组内用户无法查看目录下的内容,但可以创建 | group | -w | 组内用户无法写 | 组内用户无法向目录创建文件 | group | -x | 组内用户无法执行 | 组内用户无法进入目录,无法查看目录下文件属性。只能查看文件名 | other | -r | 其他用户无法读 | other无法查看 | other | -w | 其他用户无法写 | 若有w,其他人可以创建和删除目录下的任何文件;若无w,则other无法创建和删除任何文件。若要other能创建文件和删除自己的文件,但是无法删除其他文件,可以设置粘滞位。 | other | -x | 其他用户无法执行 | 其他用户无法进入目录 |
??root用户可以直接修改普通文件的属性,并对文件的内容进行读和修改,即使文件权限设为000 ;只 是无法执行,预防恶意文件。
??文件的重命名和删除是由目录属性决定的;脚本语言可执行时必须设置成可读。
目录必须设置可执行(x)才能进行读和写。
[test@VM-12-4-centos ~]$ ls -l main.txt
-rw-rw-r-- 1 test test 0 May 28 22:34 main.txt
[test@VM-12-4-centos ~]$ chmod u+x main.txt
[test@VM-12-4-centos ~]$ ls -l main.txt
-rwxrw-r-- 1 test test 0 May 28 22:34 main.txt
[test@VM-12-4-centos ~]$ chmod a=w+r main.txt
[test@VM-12-4-centos ~]$ ls -l main.txt
-rw-rw-rw- 1 test test 0 May 28 22:34 main.txt
[test@VM-12-4-centos ~]$ chmod 777 main.txt
??对于一个用户,若允许其在某一个目录下创建文件(o+w),又不允许删除其他用户文件(o-w),则:打开所有权限并设置粘滞位
??为了防止用户删除其他用户创建的文件,给目录设置粘滞位:chmod o+t dir ,该操作会让other 用户的x 权限变成t
??粘滞位保证文件只有以下用户可以删除 1、root; 2、目录拥有者; 3、文件拥有者
[test@VM-12-4-centos ~]$ ls /home/
remote test
[test@VM-12-4-centos ~]$ su remote
[remote@VM-12-4-centos Sticky]$ ls -ld Sticky
drwxrwxrwx 2 root root 4096 May 29 01:36 Sticky
[remote@VM-12-4-centos Sticky]$ ll
total 0
-rw-rw-r-- 1 remote remote 0 May 28 23:03 file0
-rw-rw-r-- 1 remote remote 0 May 28 23:03 file1
-rw-r--r-- 1 root root 0 May 29 01:36 Root0
-rw-r--r-- 1 root root 0 May 29 01:36 Root1
-rw-r--r-- 1 root root 0 May 29 01:36 Root2
-rw-r--r-- 1 root root 0 May 29 01:36 Root3
[remote@VM-12-4-centos Sticky]$ rm -i Root3
rm: remove write-protected regular empty file ‘Root3’? y
[remote@VM-12-4-centos Sticky]$ ls
file0 file1 file2 file3 Root0 Root1 Root2
[remote@VM-12-4-centos ~]$ chmod o-w Sticky
[remote@VM-12-4-centos ~]$ ll -d Sticky
drwxrwxr-x 2 root root 4096 May 29 01:49 Sticky
[remote@VM-12-4-centos Sticky]$ rm -f Root2
rm: cannot remove ‘Root2’: Permission denied
[remote@VM-12-4-centos Sticky]$ rm -f file3
rm: cannot remove ‘file3’: Permission denied
[remote@VM-12-4-centos ~]$ sudo chmod o+t Sticky
[remote@VM-12-4-centos ~]$ ll
drwxrwxrwt 2 root root 4096 May 29 01:49 Sticky
[remote@VM-12-4-centos Sticky]$ touch hello
[remote@VM-12-4-centos Sticky]$ echo "hello world" > hello
[remote@VM-12-4-centos Sticky]$ cat hello
hello world
[remote@VM-12-4-centos Sticky]$ rm hello
[remote@VM-12-4-centos Sticky]$ ls
file0 file1 file2 file3 Root0 Root1 Root2
[remote@VM-12-4-centos Sticky]$ rm Root2
rm: remove write-protected regular empty file ‘Root2’? y
rm: cannot remove ‘Root2’: Operation not permitted
chmod u+s ExecuteFile ,给可执行文件设置,使得该文件在运行时,可以访问当前用户不能访问的文件,提升程序的权限。 与粘滞位类似.
??修改拥有者和所属组,也可使用 chown user:user + file 一次修改拥有者和所有组
??普通用户对文件修改时可能需要sudo,但是文件对于拥有者是自己的用户来说,修改所属组时不用sudo
普通文件的起始权限 (666),目录文件 (777) + umask(普通用户默认为0002)/ root(0022)
凡是在umask出现的,都应该在权限中去掉。
使用 umask 0222 设置umask - 只在本次登录有效,除非修改配置文件。
[test@VM-12-4-centos Sticky]$ ll -d dir/
drwxrwxr-x 2 test test 4096 May 29 02:25 dir/
[test@VM-12-4-centos Sticky]$ touch file
[test@VM-12-4-centos Sticky]$ ll file
-rw-rw-r-- 1 test test 0 May 29 02:25 file
2.3 常用操作命令
选项 :-f (force,不询问)、-i (询问)、-r (递归删除)
[test@VM-12-4-centos a]$ ls
text1 text2 text3
[test@VM-12-4-centos a]$ ls | rm
rm: missing operand
Try 'rm --help' for more information.
[test@VM-12-4-centos a]$ ls
text1 text2 text3
[test@VM-12-4-centos a]$ rm $(ls)
[test@VM-12-4-centos a]$ ls
[test@VM-12-4-centos a]$
选项 :-p 可以创建多层目录
-r 递归复制
移动和重命名
让进程后台运行。
使用jobs 可以查看当前后台运行的程序。使用fg 可以让进程回到前台运行
2.4 bash标准输入
[test@VM-12-4-centos test2]$ wc -l << end
> 123 34
> 2df
> 234
> end
3
[test@VM-12-4-centos test2]$ cat < main.c
cat > file :将输入的内容重定向到文件中,若没有file,则重定向到标准输出;以Ctrl + D 结尾结束输入
[test@VM-12-4-centos test2]$ cat > commands
ls -al
pwd
[test@VM-12-4-centos test2]$ cat commands
ls -al
pwd
2.5 bash标准输出
??用echo打印出字符串,加'' 和不加是有区别的,不加'' 会自动将字符串间的空格改成一个。另外双引号也有类似的作用,他会将引号内的内容转化成字符串输出,但是对于含有$() 和命令输出的(ls\pwd…)内容不受影响,若要输出$ ,可以使用\ 转义,或者改成单引号。
[test@VM-12-4-centos ~]$ echo hello world
hello world
[test@VM-12-4-centos ~]$ echo 'hello world'
hello world
[test@VM-12-4-centos ~]$ echo $HOME
/home/test
[test@VM-12-4-centos ~]$ echo "$HOME"
/home/test
[test@VM-12-4-centos ~]$ echo "\$HOME"
$HOME
[test@VM-12-4-centos ~]$ echo '$HOME'
$HOME
echo会自动在字符串后添加换行符,若不想echo换行,则可以使用-n 选项;或者使用-e 转义\c ,\c 表示禁止打印换行结束符
[test@VM-12-4-centos ~]$ echo -n 'hello world'
hello world[test@VM-12-4-centos ~]$
[test@VM-12-4-centos ~]$ echo -e 'hello world\c'
hello world[test@VM-12-4-centos ~]$
[test@VM-12-4-centos ~]$ printf '%s : %3.2f\n' 'height' 180.2 'weight' 130.5
height : 180.20
weight : 130.50
??bash的printf 类似C语言的用法,\n 表示换行;变量可以自定义个数,用空格分隔。
#include <stdio.h>
int main()
{
fprintf(stdout, "stdout output\n");
fprintf(stderr, "stderr output\n");
return 0;
}
编译得到main ,运行:
[test@VM-12-4-centos test2]$ ./main 1> out 2> err
[test@VM-12-4-centos test2]$ cat out
stdout output
[test@VM-12-4-centos test2]$ cat err
stderr output
其中的数字1、2表示文件描述符。1——标准输出;2——标准错误。上诉的代码将标准输出重定向到out;标准错误重定向到err。
标准输出是有缓冲的,而标准错误是没有的,这样保证了标准错误的即时输出。
[test@VM-12-4-centos test2]$ ./main >& output
[test@VM-12-4-centos test2]$ cat output
stderr output
stdout output
- 若向屏蔽一些输出的信息,可以将输出重定向到
/dev/null
[test@VM-12-4-centos test2]$ ./main
stdout output
stderr output
[test@VM-12-4-centos test2]$ ./main 2> /dev/null
stdout output
[test@VM-12-4-centos test2]$ cat /dev/null
[test@VM-12-4-centos test2]$
[test@VM-12-4-centos test2]$ { ls;pwd;uname -a; } > cat
[test@VM-12-4-centos test2]$ (ls;pwd;uname -a) > cat
这里可以引入一下关于{ } 的神奇用法
[test@VM-12-4-centos ~]$ echo {{1..10},{a..z}}
1 2 3 4 5 6 7 8 9 10 a b c d e f g h i j k l m n o p q r s t u v w x y z
[test@VM-12-4-centos a]$ ls | tee ls.out
text1
text2
text3
[test@VM-12-4-centos a]$ ls
ls.out text1 text2 text3
[test@VM-12-4-centos a]$ cat ls.out
text1
text2
text3
3. 其他
3.1 环境变量
env | cat -n
set
localval = 1000
set | grep localval
export localval
env | grep localval
unset localval
[test@VM-12-4-centos ~]$ echo $PATH
[test@VM-12-4-centos ~]$ vim ~/.bash_profile
[test@VM-12-4-centos ~]$ vim ~/.bashrc
[test@VM-12-4-centos ~]$ vim /etc/profile
[test@VM-12-4-centos ~]$ vim /etc/bashrc
[test@VM-12-4-centos ~]$ source .bashrc
export PATH=$PATH:/your path/
??在C库中,有一个全局变量也可以查看当前的环境变量envrion ;main函数也会获取当前的环境变量
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[], char *env[])
{
int i = 0;
while(env[i])
{
printf("%s\n",env[i++]);
}
return 0;
}
参考资料
[1]: 《Bash Cookbook Solutions and Examples for bash Users (Carl Albing, JP Vossen)》
|