命令:
1.shell 简介
命令 :用户向内核发起的控制请求
cd ; ls ;mkdir;rm;
命令行解释器 用户命令与内核交互工具
sh->csh->ksh->zsh->bash
脚本:
超多命令有序地放在一个文件中,用来完成一定的功能。
1.0shell执行过程:
Step1: 用户输入shell命令
Step2: shell去解释内核所能理解的二进制指令
Step3: 内核响应(调用驱动代码),控制相关硬件
Step4: 内核获取硬件的执行结果,交给shell
Step5: Shell将内核返回的结果展示给用户。
1.1关机命令:
halt 关机
reboot 重启
shutdown -h now 关机
shutdown -r now 重启
shutdown -k
shutdown -c
init 0
2.命令格式与编辑
2.1终端:
用户名@主机名:工作目录 提示符
whoami
hostname
pwd
$普通用户
#超级用户
echo $PS1
PS1='\u@\h:\w\$' 提示符格式变量
\u username
\h hostname
\w 绝对路径
\W 当前目录名
\$ 用户提示符
PS2 用户命令未写完提示符
2.2命令格式:
ls [option]... [file]...
命令 [参数] [目标]...
-a 短参
--all 长参
[ ]可选标志
ls -l jielun
ls
... 多参机制
ls -la
; 多个命令放在同一行输入
\ 表示命令没有输入完整,下一行继续输入,\用来转义回车,所以\后直接回车
自动补全
Tab
Tab Tab 补全提示
Esc
2.3 history 查看当前终端缓存区中的历史命令
每一个终端都有一个历史列表缓存区,(history可查看)
每一个用户有一个历史命令文件.bash_history
history -c 清空缓存区列表
history -w 保存缓存区列表到文件中
history -r 从历史文件读到缓存区
帮助手册有两个man history; help history
!! 执行上一条命令
!2010 执行history中编号为2010的命令
!-2 执行列表中倒数第二个命令
文件列表中历史命令的个数是由 HISTSIZE决定 echo $HISTSIZE
历史文件.bash_history的个数由HISFILESIZE决定 echo $ISTFILESIZE (~/.bashrc)
内置命令:命令的二进制文件保存在内核中(history,cd).通常的命令保存在硬盘中 /bin/ls,执行时先从硬盘读到内存再交给内核执行.
当一个用户开机登录系统后执行了哪些配置文件
/etc/profile 为所有用户配置数据,eg:自启动软件 开机就执行的指令
/etc/bash.bashrc 为所有打开bash的用户配置shell数据
~/.profile 为当前用户的配置数据
~/.bashrc 为当前用户配置shell的数据
3.shell特殊字符
* 任意长度的任意字符个数
ls file*.c
? 单个任意字符
ls file?.c file??.c
[...] 指定匹配括号中的字符
ls file[13579].c
ls file1[89].c file2[012345].c
[-] 指定匹配括号区间中的字符
ls file[1-9].c
ls file[a-z].c
[^...] 匹配除了括号中之外的字符
ls file[^1357].c
scanf("%[^\n]", buff);
管道 |
command1 | command2
左输出 | 右输入
command1 必须有标准输出数据;comman2必须能接收输入
command1和command2同时运行,command2会阻塞等待输入数据
dpkg -l | less
ls /usr/bin/ | wc -w
重定向
/***************************************************
everthing is file 一切皆文件
standard input 标准输入 <键盘> 0
standard output 标准输出 <显示屏> 1 缓存区满或 程序结束或 调用刷新函数fflush(stdout)
standard err 标准出错 2 出错就立刻打印
*****************************************************/
> == 1> 输出重定向,会覆盖之前内容
echo "hello world" > jielun
>> == 1>> 追加,在文件尾添加数据
echo "hello echo" >>jielun
< 输入重定向
wc < jielun
2> 2>> 表示错误信息定位
ls -l naying 2> log
&> &>> 表示正确和错误都输出到指定文件
ls -l naying jielun &> log
比较特殊的文件
/dev/null 无底洞文件,数据保存进去后会消逝.
echo "hello" &> /dev/null 正确信息和错误信息全部丢弃到/dev/null中.
cat /dev/null > ~/.bash_history 清空 历史命令文件.
/dev/zero 总是能产生'\0',
cat /dev/zero 一直读取到'\0',能一直从zero中读取出'\0'。
/dev/random 产生随机数,数量有限.
命令置换
comman1 `command2`将第二个命令的输出作为前面命令的目标/参数
ls `pwd`
相当于:ls /home/fs/Bangwanglong
4.基本维护命令:
ls -R /tree
less
grep
head/tail
sort -t: -k 4 -n
cat /etc/passwd | sort -t: -k 4 -n
cut -d: -f 4
cat /etc/passwd | cut -d: -f 4
cat /etc/passwd | sort -t: -k 3 -n | cut -d : -f3 将文件的第3列排序并输出
file 查看文件信息
file /bin/ls 查看二进制文件ls的文件信息
grep
grep -c 匹配到的次数
grep -i 匹配时忽略大小写
grep -n 匹配输出时显示行号
grep -v 反向输出.
cat /etc/passwd | grep 'fs'
终端:
tty: 设备终端->显示屏
pts: 虚拟终端->Terminal
pty: 伪终端 ->远程连接
帮助手册:
man info help
man 1 命令或程序
man 2 系统调用函数
man 3 库函数
whatis command 查看命令分类
挂载命令:
sudo mount -t vfat /dev/sdb2 /home/fs/Bangwanglong
-t 指定U盘类型
/dev/sdb2 指定文件的设备节点,可能是sdb3或其他。
/home/fs/Bangwanglong 指定挂载位置,挂载成功通过此目录访问U盘
sudo umount /home/fs/Bangwanglong
卸载挂载点,成功后不可通过/home/fs/Bangwanglong访问U盘
已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc);
strDest是目的字符串,strSrc是源串。(不调用C的字符串库函数,编写函数 strcpy
略头文件:#include <string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
char * strcpy( cahr * strDest, const char * strSrc)
{
if ( ( strDest == NULL) || (strSrc == NULL) ) // 检查指针的有效性
// (( !strDest) || (strSrc)或(! ( strDest && strSrc)) (忽略了类型转换, char* 转换为bool是 隐士转换)
// (( strDest == 0) || ( strSrc == 0)) 维护性差。
throw “ Invalid argument(s)” ; //
char * strDestCopy = strDest; //
while(( *strDest++ = *strSrc++) != ‘\0’); //
return strDestCopy;
}
/*
while(*srtDest ++ = *strSrc++)// 类型转换忽略
*/
/*
while(*strSrc != ‘\0’)
*strDest++ = *strSrc++; //边界遗漏,没有在strDest字符串末尾正确加上’\0’.
*/
最简单的实现
char * strcpy( char *des, const char * source)
{
char *r = des;
while( *dest ++ = *source++); //复制到NULL后,循环才停止
return;
}