linux的shell基本机制

🌕写在前面

  • 🍊博客主页:Scorpio_m7github
  • 🎉欢迎关注🔎点赞👍收藏⭐️留言📝
  • 🌟本文由 Scorpio_m7原创,CSDN首发!
  • 📆首发时间:🌹2023年4月14日🌹
  • ✉️坚持和努力一定能换来诗与远方!
  • 🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢感谢感谢!

shell的种类

  • b-shell,早期unix的标准shell,/bin/sh
  • c-shell,c语言特点
  • k-shell:korn shell,/bin/ksh,支持带类型的变量,数组
  • bash,bourne again shell,是Linux标准shell,/bin/bash,b-shell扩展,吸收c-shell特点

shell的功能

  • shell是命令解释器
  • 文件名替换,命令替换,变量替换
  • 历史替换,别名替换
  • 流程控制的内部命令(内部命令和外部命令)

shell的特点

  • 主要用途:批处理,执行效率比算法语言低
  • shell编程风格和c语言等算法语言的区别
  • shell是面向命令处理的语言,提供的流程控制结构通过对一些内部命令的解释实现
  • shell设计精炼,但是提供灵活机制(策略与机制相分离)。提供shell替换实现,例如:流程控制所需的条件判断,四则运算,都由shell之外的命令完成
  • 重定向与管道
  • 方便交互使用的功能:历史替换与别名替换
  • shell变量
  • shell的变量替换,命令替换,文件名替换
  • 元字符,如:单双引号
  • 流程控制
  • 子程序

启动bash

  • 注册shell
  • 交互式shell(键入bash命令)
  • 脚本解释器

自动执行的一批命令 (用户偏好)

  • 当bash作为注册shell被启动时,自动执行用户主目录下的.bash_profile文件中命令,~/.bash_profile或$HOME/.bash_profile,umask之类的命令应当在.bash_profile文件中
  • 当bash作为注册shell被退出时,自动执行$HOME/.bash_logout
  • 当bash作为交互式shell启动时,自动执行$HOME/.bashrc

自动执行的一批命令(系统级,比用户级高)

当bash作为注册shell启动时,自动执行/etc/profile文件中命令

当bash作为交互式shell启动时,自动执行/etc/bash.bashrc

当bash作为注册shell退出时,自动执行/etc/bash.bash.logout

脚本文件

三种方法都启动/bin/bash,新创建子进程,并在子进程中执行脚本

  • bash<lsdir(无法携带参数)

  • bash lsdir

    bash -x lsdir

    bash lsdir /usr/lib/gcc

  • chmod u+x lsdir

    ./lsdir /usr/lib/gcc

在当前shell中执行脚本(会修改当前bash的路径)

  • . lsdir /usr/lib/gcc
  • source lsdir /usr/lib/gcc
#lsdir
if [ $# = 0 ]
then
	dir=.
else
	dir=$1
fi
find $dir -type d -print
echo '-----------'
cd $dir
pwd

历史表

先前键入的命令存于历史表,编号递增,FIFO刷新。表大小由变量HISTSIZE设定,修改HISTSIZE的配置应放入~/.bashrc

history查看历史表($HOME/.bash_history)

  • 上下键替换命令
  • !! 引用上一条命令
  • !str 以str开头的最近用过的命令,如:!v

别名替换

在别名表中增加一个别名,应把alias命令放入.bashrc

alias dir="ls -flad"

TAB键补全

首个单词TAB建补全搜索$PATH下的命令,其他单词搜索当前目录下文件

输入重定向

  • <filename:从文件中获取stdin,例如:sort<1.txt

  • <<word:从shell脚本文件获取数据直到遇到定界符word,如脚本word.sh:

    cat << word
    * now : `date`
    * my home directory is $HOME
    word
    pwd
    

    定界符中的内容需要加工替换,date会打印当前时间。程序运行结果如下:

    root@ubuntu:~/Desktop# ./word.sh
    * now : Sat Jan 21 22:35:26 PST 2023
    * my home directory is /root
    /root/Desktop
    

    如果不想定界符中的内容发生替换,将脚本改成:

    cat << 'word'
    * now : `date`
    * my home directory is $HOME
    word
    pwd
    
  • base64 <<< test:将test字符串作为输入就行base64编码后输出

输出重定向与管道

  • 程序的标准输入是stdin,fd=0
  • 程序的标准输出是stdout,fd=1
  • 程序的标准错误输出是stderr,fd=2

使用系统调用(原始I/O)的程序举例

#include <string.h>
#include <unistd.h>

int main(void)
{
    static char *str1="string1\n";
    static char *str2="string2\n";
    for(int i=0;i<3;i++){
        write(1,str1,strlen(str1));//向标准输出写入
        write(2,str2,strlen(str2));//向标准错误输出写入
    }
}

stdout输出重定向

  • **>**filename:将stdout重定向到文件filename,若文件存在则覆盖内容
  • **>>**filename:将stdout重定向追加到filename尾

stderr输出重定向

  • 2>filename:将文件句柄2重定向到文件
  • 2>&1:将文件句柄2重定向到文件描述符1指向的文件
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scorpio-m7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值