ProgrammingNotes
  • README
  • accounting会计学
  • Apache
  • ar
  • asciidoc
  • AssemblyLanguage汇编语言
  • authorization授权
    • 1.jwt
    • 2.oauth
  • C语言
    • C++
  • cache
  • Computer计算机相关
    • 1.reinstallSystem重装系统
    • 2.vhd
    • 3.bulidWeb建站
    • 4.computerOrganization计算机原理
  • config配置文件相关
  • ContainerTechnology
    • 1.docker
    • 2.kubernetes
  • cs计算机科学
    • 1.api
      • 1.1.restful
      • 1.2.graphQL
      • 1.3.openAPI
      • 1.4.swagger
    • 10.blockchain区块链
      • 10.1.bitCoin比特币
    • 11.characterEncoding字符编码
    • 12.map
      • 12.1.百度地图
      • 12.2.qgis
      • 12.3.openLayers3
      • 12.4.postGIS
    • 13.ai人工智能
    • 14.machineLearning机器学习
    • 15.ioT物联网
    • 16.microservices微服务
    • 17.serverless无服务架构
    • 2.uml
    • 3.designPattern
    • 33.compilation_tool编译工具
      • 33.1.gradle
      • 33.2.maven
    • 4.devOps
      • 4.1.ci
        • 4.1.1.jenkins
        • 4.1.2.github_actions
        • 4.1.3.team_city
      • 4.2.argoCD
    • 6.dataVisualization数据可视化
    • 7.abandonTechnology可放弃的技术
    • 8.bigData大数据
      • 8.1.streamComputing流计算
      • 8.2.edgeComputing边缘计算
    • 9.deepLearning
  • C#
  • db数据库
    • 1.sql
    • 2.noSQL
      • 2.1.redis
      • 2.2.mongoDB
      • 2.3.hbase
      • 2.4.etcd
    • 3.fileSystem文件系统
      • 3.1.fastDFS
      • 3.2.hdfs
    • 4.postgreSQL
    • 5.sqlserver
    • 6.MySQL
    • 7.oracle
    • 8.oceanBase
    • 9.influxDB
    • DatabaseSecurity数据库安全
    • pl/sql
  • Delphi
  • dorado
  • education
  • english
  • frontEnd前端
    • 1.html
      • 1.1.h5
      • 1.2.webSocket
      • 1.3.html2pdf
    • 10.1.wonder
    • 10.webGL
    • 2.w3C规范
      • 2.1.webAPIs
    • 3.css
    • 4.dom
    • 5.xhtml
    • 6.webAssembly
    • 7.ajax
    • 8.fetch
    • 9.picture
  • git
    • 1.gitbook
    • 2.svn
    • 3.github
    • 4.travis_ci
  • golang
    • go_cloud
    • go_crawler
    • goroutine
    • hydra
  • hardware
  • ios
  • java
    • 1.jvm
    • 2.java高级特性之多线程
    • 3.javafx
    • 4.java网络编程
    • 5.java类加载和反射
    • 6.jms
    • 7.java_cloud
    • 8.jsp
    • 9.spring
  • js
    • 1.npm
    • 13.mockJS
    • 19.bootstrap
    • 2.nodeJS
    • 25.echarts
    • 3.angular
      • 3.1.angularCLI
      • 3.2.angularMaterial
    • 4.react
      • 4.3.reactNative
      • 4.4.next
    • 5.vue
      • 5.1.vue-CLI
      • 5.2.vuex
      • 5.3.axios
      • 5.4.vue-router
      • 5.5.element-ui
      • 5.6.vueCore
      • 5.7.nuxt
    • 6.compilation_tool编译工具
      • 6.1.webpack
      • 6.2.parcel
      • 6.3.grunt
    • 7.lib第三方库
      • 7.1.jQuery
      • 7.2.lodash
    • TypeScript
      • 8.1.tslint
    • Deno
    • JS设计模式
    • ECMAScript
    • JS
    • JS6
    • NativeScript
    • RXJS
    • V8
  • linux
    • 1.vim
    • 2.shell
    • 3.shellScript
    • 4.ubuntu
    • 5.makefile
    • 6.centOS
  • markdown
  • markup_lang
    • JSON
    • YAML
  • math
    • 1.algorithm算法
    • 2.cryptology密码学
    • 3.computerGraphics计算机图形学
    • 4.dataStructure数据结构
  • MC消息通信
    • MQ消息队列
      • 1.kafka
      • 2.rabbitMQ
      • 3.redis
      • 4.activeMQ
      • 5.rocketMQ
      • 6.nats
    • MQTT
      • EMQ
    • RPC
      • gRPC
  • mobile
    • android
      • 1.kotlin
      • 2.weixin
      • 3.miniProgram
    • cordova
    • dart
    • flutter
    • ios
      • xcode
    • ReactNative
  • network网络
    • 2.ss
    • 3.http
    • 4.kcp
    • 5.nmap
    • 5G
    • 6.webCrawler
  • news重要新闻
  • Philosophy哲学
    • AnCoderPrepares程序员的自我修养
    • 软件工程的语录
  • php
  • popularizationOfScience科普
  • protocol
    • 1.rpc
  • python
  • readingNotes读书笔记
    • 1.profession专业笔记
    • 2.sql_Antipatterns
    • 3.unix_Network_Programming
    • 4.the_Docker_Book
  • rust
  • scriptingLanguage
    • 2.lua
    • 3.regularExpression正则表达式
    • 4.julia
    • 5.ruby
  • security安全
  • server服务器相关
    • nginx
    • OpenResty
  • software&tool软件和工具
    • 1.vscode
    • 11.plsqldev
    • 17.androidStudio
    • 3.虚拟机VirtualMachine
    • 4.jetBrains
    • 5.eclipse
    • 7.visualStudio
    • 8.office系列
  • softwaretest软件测试
    • JUnit
  • ssh&ssm
    • 2.hibernate
    • 1.spring
  • unix
    • hackintosh
    • mac
  • vr
  • windows
    • terminal&DOS
    • windows10
    • Wine
  • word一些术语
  • zztemp草稿
    • temp
    • temp4study
    • temp4studyLater以后再学的
Powered by GitBook
On this page
  • shell
  • 一 概述
  • 1 简介
  • 3 常识
  • 4 文档网站等
  • 二 安装配置
  • 三 基础
  • 1 命令控制&&、||和;
  • 2 通配符
  • 3 参数
  • 4 测试
  • 五 经验
  • 六 问题
  • 1 shell returned 127 Press ENTER or type command to continue
  • X 其他
  • 七 未整理

Was this helpful?

  1. linux

2.shell

Previous1.vimNext3.shellScript

Last updated 3 years ago

Was this helpful?

shell

[TOC]

一 概述

1 简介

什么是shell:

  1. 管理整個電腦硬體的其實是作業系統的核心 (kernel),這個核心是需要被保護的,不能夠隨便被一些沒有管理能力的終端用戶隨意使用,但是我們總是需要讓使用者操作系統的,于是就有了在作業系統上面發展的应用程序,而这个程序在kernel外層,就如同雞蛋的外殼一樣,因此這個咚咚也就被稱呼為外壳程序(shell) 。shell中的命令本质也是通过命令控制相应的程序,从这个点来看,只要能操作应用程序的介质都能成为外壳程序。

  2. 狭义的shell指的命令行界面的解析器,广义的则包括图形界面,因为图形界面也是调用的应用程序来呼叫kernel工作。

  3. 关于终端的维基百科,应该说得更准确:

为什么要学shell:

  1. 通用性强 各家 distributions 使用的 bash 都是一樣的(不全是?)

  2. 远程管理

    1. 远程管理的时候文字传输命令更快

    2. 不易掉线、信息保密性更好

  3. 文字界面更简洁有效

关于linux预设的shell——bash shell的主要功能:

  1. 记忆命令,很多发行版中默认可记忆1k个 放在$HOME/.bash_history中,不过里面的内容是每次登出的时候才会存进去,而本次的命令则是在内存中,可用history查看

  2. tab键补全

    1. 在第一个单词中使用是补全命令

      1. 连按两次会显示所有可补全的命令,过多会提示Display all possibilities?(y/n)

    2. 在第二个单词中使用是补全档案

    3. 其他的补全

      1. $开头的话,是变量补全

      2. ~开头是用户名字补全

      3. @开头则是对主机名补全(只对包含在文件/etc/hosts中的主机名有效)

  3. 别名alias

  4. 工作控制、前景背景控制: (job control, foreground, background)

  5. 程式化腳本: (shell scripts)

  6. 通配符: (Wildcard)

3 常识

3.1 shell的分类

待补充

图形界面shell(Graphical User Interface shell 即 GUI shell)

  1. 应用最为广泛的 Windows Explorer(windows资源管理器)

命令行式shell(Command Line Interface shell ,即CLI shell)

3.2 shell和终端的关系

3.3 快捷键

shell快捷键主要记住这几个就行了:ctrl+a、ctrl+e、ctrl+k、ctrl+u和ctrl+l

  1. 图形界面终端下的多标签切换:ctrl+PgUP/PgDN或alt+1/2/...

  2. 光标移动命令(似乎有问题,待整理)

    按键
    行动

    Ctrl-a

    移动光标到行首.

    Ctrl-e

    移动光标到行尾.

    Ctrl-f

    光标前移一个字符;和右箭头作用一样.

    Ctrl-b

    光标后移一个字符;和左箭头作用一样.

    Alt-f

    光标前移一个字.

    Alt-b

    光标后移一个字.

    Ctrl-l

    清空屏幕,移动光标到左上角.clear命令完成同样的工作.

  3. 文本编辑命令

    按键
    行动

    Ctrl-d

    删除光标位置的字符。

    Ctrl-t

    光标位置的字符和光标前面的字符互换位置。

    Alt-t

    光标位置的字和其前面的字互换位置。

    Alt-l

    把从光标位置到字尾的字符转换成小写字母。

    Alt-u

    把从光标位置到字尾的字符转换成大写字母。

  4. 剪切和粘贴命令

    按键
    行动

    Ctrl-k

    剪切从光标位置到行尾的文本。

    Ctrl-u

    剪切从光标位置到行首的文本。

    Alt-d

    剪切从光标位置到词尾的文本。

    Alt-Backspace

    剪切从光标位置到词头的文本。如果光标在一个单词的开头,剪切`前一个单词。

    Ctrl-y

    把剪切板中的文本粘贴到光标位置。

  5. 自动补全命令

    按键
    行动

    Alt-?

    显示可能的自动补全列表。在大多数系统中,你也可以完成这个通过按 两次 tab 键,这会更容易些。

    Alt-*

    插入所有可能的自动补全。当你想要使用多个可能的匹配项时,这个很有帮助。

  6. 撤销上次编辑:Ctrl+-

3.4 关于不同用户获得的不同shell

当我们登入的时候,系统就会指派一个shell来为我们工作,记录在/etc/passwd里

3.5 查看当前是什么shell

echo $0:如果是在shell中则输出shell的名字,如果是在脚本中,则输出脚本的文件名。比如在bash中执行echo $0,输出的是“-bash”。

3.6 控制终端

通过网络登录或者终端登录建立的会话,会分配唯一一个tty终端或者pts伪终端(网络登录),实际上它们都是虚拟的,以文件的形式建立在/dev目录,而并非实际的物理终端。

在终端中按下的特殊按键:中断键(ctrl+c)、退出键(ctrl+\)、终端挂起键(ctrl + z)会发送给当前终端连接的会话中的前台进程组中的所有进程

在网络登录程序中,登录认证守护程序 fork 一个进程处理连接,并以ptys_open 函数打开一个伪终端设备(文件)获得文件句柄,并将此句柄复制到子进程中作为标准输入、标准输出、标准错误,所以位于此控制终端进程下的所有子进程将可以持有终端

与控制终端相连的会话首进程也叫控制进程

3.7 fork、内部命令和外部命令

fork是linux的系统调用,用来创建子进程(child process)。子进程是父进程(parent process)的一个副本,从父进程那里获得一定的资源分配以及继承父进程的环境。子进程与父进程唯一不同的地方在于pid(process id)。环境变量(传给子进程的变量,遗传性是本地变量和环境变量的根本区别)只能单向从父进程传给子进程。不管子进程的环境变量如何变化,都不会影响父进程的环境变量。

bash shell的命令分为两类:外部命令和内部命令。

内部命令实际上是shell程序的一部分,其中包含的是一些比较简练的UNIX系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在UNIX系统加载运行时shell就被加载并驻留在系统内存中。外部命令是UNIX系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以它们包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调进内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell 程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。

外部命令是通过系统调用或独立的程序实现的,如sed、awk等等。内部命令是由特殊的文件格式(.def)所实现,如cd、history、exec、source等等。

3.8 sh 和 bash

sh是一种POSIX标准,它有很多种实现,包括ksh88, dash,bash等。

因为sh是一种规范,并不是实现,所以/bin/sh实际上是一个硬链接,链接到某种实现上。大多数情况下,/bin/sh会链接到/bin/bash。所以你执行sh xx等价于执行bash xx。但是在一些系统中,/bin/sh并没有指向/bin/bash,比如在一些现代的Debian和Ubuntu系统中,sh指向的是dash。

4 文档网站等

  1. ubuntu中文wiki的shell指南:https://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80

二 安装配置

三 基础

1 命令控制&&、||和;

  1. 对于command1 $$ command2,当command1执行成功时才会执行command2

  2. 对于command1 || command2,当command1执行失败时才会执行command2

  3. 对于command1 ; command2,顺序执行,不管command1执行是否成功,command2都会执行

2 通配符

对于复杂文件操作很有用,使得shell的命令行变得很强大,因为shell频繁使用文件名.通配符所依赖的工作机制叫做路径名展开.

  1. 常用通配符

    通配符
    意义

    *

    匹配任意多个字符(包括零个或一个)

    ?

    匹配任意一个字符(不包括零个)

    [characters]

    匹配任意一个属于字符集中的字符

    [!characters]

    匹配任意一个不是字符集中的字符

    [[:class:]]

    匹配任意一个属于指定字符类中的字符

  2. 常用的字符类

    字符类
    意义

    [:alnum:]

    匹配任意一个字母或数字

    [:alpha:]

    匹配任意一个字母

    [:digit:]

    匹配任意一个数字

    [:lower:]

    匹配任意一个小写字母

    [:upper:]

    匹配任意一个大写字母

  3. 通配符例子

    模式
    匹配对象

    *

    所有文件

    g*

    文件名以“g”开头的文件

    b*.txt

    以"b"开头,中间有零个或任意多个字符,并以".txt"结尾的文件

    Data???

    以“Data”开头,其后紧接着3个字符的文件

    [abc]*

    文件名以"a","b",或"c"开头的文件

    BACKUP.[0-9][0-9][0-9]

    以"BACKUP."开头,并紧接着3个数字的文件

    [[:upper:]]*

    以大写字母开头的文件

    [![:digit:]]*

    不以数字开头的文件

    *[[:lower:]123]

    文件名以小写字母结尾,或以 “1”,“2”,或 “3” 结尾的文件

  4. 尽量避免使用[a-z]和[A-Z]这种写法,它是早期的unix环境中的写法(而且也不稳定),现在推荐使用字符类

  5. 通配符在一些图形文件管理器中也有效,比如gnome的Nautilus中的Edit/Select 模式

  6. 通配符总是以有序的方式展开.比如movie.mpeg.0*,则所有匹配项会有序排列

3 参数

  1. -c:它可以让 bash 将一个字串作为完整的命令来执行。

    sh -c "echo hello" // hello    
  2. 脚本调试

    1. -x在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个”+”号。 “+”号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。它是调试shell脚本的强有力参数。关闭显示使用+x

      # 可以在执行脚本的时候带上
      sh -x ...
      # 也可以写在脚本里面
      set -x
      file=file:///Users/xxx/temp/a
      proto=file
      curl --proto "=$proto" "${file}"

4 测试

test和[]都是测试的意思,比如

  1. [ -d dir ]等价于test -d dest:如果dir是目录则为真

五 经验

  1. 字符展开和引用可以说是shell最重要的主题

六 问题

1 shell returned 127 Press ENTER or type command to continue

可能原因:输入了错误的指令,比如q!输成!q

X 其他

  1. 如何在执行一个命令的时候还可以执行另外一个命令,比如说git clone的时候我想像eclipse那样实时显示进度,我写进了python,怎么能在之后执行呢?

七 未整理

  1. 程式化腳本: (shell scripts)

  2. $(dirname $0)表示存放脚本文件的目录

(待补充)

bash参考手册,是一本参考书,同时包含了很多实例:

bashFAQ,包含很多常见问题的答案,面向中高级用户:

GNU完整命令行列表:

维基百科关于手册页的有趣文章:

https://en.wikipedia.org/wiki/Computer_terminal
https://www.cnblogs.com/jplatformx/p/4366278.html
http://www.gnu.org/software/bash/manual/bashref.html
http://mywiki.wooledge.org/BashFAQ
http://www.gnu.org/manual/manual.html
http://en.wikipedia.org/wiki/Man_page
http://macshuo.com/?p=676