第11章 认识与学习bash/et/ds

Bash Shell详解
本文深入介绍了Bash Shell的各种功能,包括命令记忆、命令补全、命令别名设置、程序脚本编写、通配符使用等,并讲解了环境变量设置、命令执行流程、数据流重定向及常用命令操作技巧。

1. bash shell的功能

(1)命令记忆

在~/.bash_history中记录的是上一次登录前所执行过的命令。而这一次登录所执行的命令都被暂存在内存中,当注销系统后,才会被记录到~/.bash_history中。

(2)命令补全

即tab。如输入命令a b,在a后输入tab则为命令补全,在b后输入tab则为文件补全。

(3)命令别名设置alias

alias stefanie='ls -al'

这段命令就将stefanie设置成了ls -al的别名

(4)程序脚本

可以用shell scripts将执行的命令写成文件

(5)通配符

用通配符来查询


2. type

bash shell内置了许多命令,如cd。但也有来自其他非bash所提供的命令,可以用type来查看一个命令是内置还是其他非bash提供。

type [-tpa] name

3.变量设置

  • 用echo $name 输出变量name的值
  • a=b,设置变量a的值为b(等号两边不能有空格)
  • 命令a="$a":b可以将b添加到变量a
  • 用unset a来取消变量a
  • 可以用export a命令将a变成环境变量,或者加在$PATH后
PS:命令行中反引号的作用:在一串命令中,反映单引号`内的命令会被先执行,执行的结果将作为外部的输入信息。如我们现在要进入目录内核的模块目录:可以用命令

cd /lib/modules/`uname -r`/kernel

用uname会输出系统的信息,参数r表示输出内核版本。

4、环境变量

(1)可以用命令env来查看所有的环境变量。下面是各种常见的环境变量的意义:

  • HOME:用户的主文件夹
  • SHELL:当前环境下使用的是哪个shell
  • HISTSIZE:历史命令的记录条数,即在~/.bash_history中能记录的命令条数
  • PATH:执行文件查找的路径,目录与目录间用冒号分隔
  • LANG:编码
  • RANDOM:随机数变量,可以随机一个0~32767之间的数。
(2)env列出的只是环境变量,而用set命令可以列出所有的变量(包括环境变量与自定义变量)。在变量中,有一个PS1变量,这个叫做提示符变量,就是我们见到的命令提示符,如在终端显示“user@user:~/"。下面是符号的意义,可以利用这些符号设定PS1.

  • \d:显示”星期月日“
  • \H:完整的主机名
  • \h:仅取主机名在第一个小数点前的名字
  • \t:显示时间(24小时)HH:MM:SS
  • \T:12小时制时间
  • \A:24小时制时间HH:MM
  • \@:12小时格式的'am/pm
  • \u:目前用户账号名
  • \v:BASH版本信息
  • \w:完整的工作目录名称
  • \W:利用basename函数取得工作目录名,帮权列出最后一个目录名
  • \#:执行的第几个命令
  • \$:如果是root时,提示符为#,否则是$
注意:$本身也是个变量,它代表了当前shell的线程号pid。?也是一个特殊的变量,它表示了上一个执行的命令的返回值。一般来说,如果成功执行该命令,则会返回0,否则会返回错误代码。

(3)export命令

env和set的差异在于,变量是否会被子进程所继续引用。当登录Linux并取得一个bash后,这个bash就是一个独立的进程,在这个bash命令下所执行的任何命令都是由这个bash所衍生的,而这些衍生的命令就是子进程。子进程会继承父进程的环境变量但不会继承自定义变量。用

export 变量名

就可以将变量设置成环境变量。

(4)变量的键盘读取、数组与声明

read 变量名

输入这个命令后,就可以通过键盘输入,read还有参数,如-t是设置输入时间的,在指定时间内没有输入,就会自动略过。

declare命令参设置变量类型:

declare [-aixr] variable
-a:将variable定义成数组类型,用arrayname[index]=content来设置数组
-i:将variable定义成整数类型
-x:将variable引入环境变量
-r:readonly,该变量将无法更改,如果该变量只读,则得注销再登录才能复原该变量的类型了。
5、ulimit:程序的限制

bash可以限制用户的某些系统资源,如可以打开的文件数、可以使用的CPU时间,内存量等等。而设置这些,需要用到ulimit命令。

ulimit [-SHacdfltu] 配额
-H:hard limit,严格的设置,不能超过这个值
-S:soft limit,警告的设置,可以超过这个值,但若超过会有警告
-a:列出所有的限制
-c:每个内核文件的最大容量。内核文件:当某些进程出错时,系统可能会将该进程在内存中的信息写成文件,这种文件就叫内核文件
-f:此shell可创建的最大文件容量
-d:进程可使用的最大内存容量
-l:可用于锁定的内存量
-t:可使用的最大CPU时间(秒)
-u:单一用户的最大进程数

5、命令别名与历史命令

alias name='command'

可以用这个命令将namd设置成command的别名,那么之后用name和用command效果是一样的。

当然如果要取消别名的话,可以用

unalias name

bash提供命令历史的服务。可以用history命令。具体参数见man。

6、路径与命令查找顺序

系统中可能有多个ls命令,那么执行一个ls命令时,到底是哪个ls被执行了?Linux中,命令运行的顺序可以按这个顺序来:

以相对/绝对路径执行(即人为确定ls在哪)--> 由alias找到的命令来执行 --> 由hash内置的命令(builtin)来执行 --> 通过$PATH查找到的第一个命令来执行

7、登录与欢迎信息

在/etc/issue中,记录了用户登录后要显示的信息,我们可以自定义显示哪些信息:

  • \d:本机时间的日期
  • \l:显示第几个终端机接口
  • \m:显示硬件的等级
  • \n:显示主机的网络名称
  • \o:显示域名
  • \r:操作系统版本
  • \t:本机的时间
  • \s:操作系统名称
  • \v:操作系统版本

在/etc/motd中,记录了用户登录后需要显示的信息。

8、bash的环境配置文件

  • /etc/profile:每个用户登录取得bash时都会读取这个文件,如果要改变所有用户登录时的状态,可以更改这个文件。
  • ~/.bash_profile -> ~/.bash_login -> ~/.profile:用户个人的配置文件,按前面的顺序咐会读取找到的一个文件。

在登录时,会先读取/etc/profile,再读取~/.bash_profile。这两个文件可能又会读取其它的文件。如~/.bash_profile会读取~/.bashsrc的内容。

9、数据流重定向

  • 标准输入:代码为0,使用< 或 <<
  • 标准输出:代码为1,使用 > 或 >>
  • 标准错误输出,代码为2,使用2>或2>>
  • 对于输入来说,<<表示输入什么结束。如 cat > catfile << "eof",当输入eof时,就会结束程序。而不需要输入ctrl+d
  • >和>>不同:>表示如果文件不存在,则创建;存在则覆盖。>>表示不存在则创建,存在则追加。
10、命令执行的判断

  • cmd1;cmd2;...:依次执行
  • &&和||:前一个命令执行的结果为正确,则在Linux下会回传一个$?=0,我们可以通过这个回传值,加上&&和||来执行命令。如cmd1 && cmd2,表示cmd1正确执行时才执行cmd2。而cmd1 || cmd2表示,如果cmd1正确执行,则cmd2不执行,若cmd1错误,则开始执行cmd2。
11、管道命令pipe

在执行ls命令时,如果列出的文件过多,就会看不过来,这时,可以用管道命令符|加上less命令,表示使用less来输出这些文件。I这个命令权能处理由前一个命令传来的正确信息,即标准输出,而不能处理标准错误输出。而且|后拉的第一个数据一定是命令,且这个命令必须能接受标准输出的数据。

12、选取

cut命令:在一行中取出我们要的

grep:分析一行信息,若该行中有我们想要的,则将该行取出

sort:对取出的信息排序

uniq:将重复的数据仅列出一个显示

wc:查看有多少字、行、字符。

tee:双向重定向,即写到文件,又写到标准输出。


PS D:\ASSimpleDemo> ./gradlew build --warning-mode all Configuration on demand is an incubating feature. > Configure project : The RepositoryHandler.jcenter() method has been deprecated. This is scheduled to be removed in Gradle 8.0. JFrog announced JCenter's shutdown in February 2021. Use mavenCentral() instead. Consult the upgrading guide for further information: https://docs.gradle.org/7.0.2/userguide/upgrading_version_6.html#jcenter_deprecation at build_ce3ruzx0et0a87btopefgvs46$_run_closure1$_closure2.doCall(D:\ASSimpleDemo\build.gradle:11) (Run with --stacktrace to get the full stack trace of this deprecation warning.) > Configure project :app WARNING:Using flatDir should be avoided because it doesn't support any meta-data formats. Warning: This version only understands SDK XML versions up to 2 but an SDK XML file of version 3 was encountered. This can happen if you use versions of Android Studio and the command-line tools that were released at different times. Warning: 意外的元素 (uri:"", local:"extension-level")。所需元素为<{}codename>,<{}layoutlib>,<{}api-level> Warning: 意外的元素 (uri:"", local:"base-extension")。所需元素为<{}codename>,<{}layoutlib>,<{}api-level> WARNING:We recommend using a newer Android Gradle plugin to use compileSdk = 34 This Android Gradle plugin (7.0.2) was tested up to compileSdk = 31 This warning can be suppressed by adding android.suppressUnsupportedCompileSdk=34 to this project's gradle.properties The build will continue, but you are strongly encouraged to update your project to use a newer Android Gradle Plugin that has been tested with compileSdk = 34 > Task :app:processReleaseMainManifest D:\ASSimpleDemo\app\src\main\AndroidManifest.xml:21:5-79 Warning: Element uses-permission#android.permission.ACCESS_FINE_LOCATION at AndroidManifest.xml:21:5-79 duplicated with element declared at AndroidManifest.xml:12:5-79 D:\ASSimpleDemo\app\src\main\AndroidManifest.xml:22:5-65 Warning: Element uses-permission#android.permission.CAMERA at AndroidManifest.xml:22:5-65 duplicated with element declared at AndroidManifest.xml:16:5-64 D:\ASSimpleDemo\app\src\main\AndroidManifest.xml:23:5-80 Warning: Element uses-permission#android.permission.READ_EXTERNAL_STORAGE at AndroidManifest.xml:23:5-80 duplicated with element declared at AndroidManifest.xml:18:5-80 D:\ASSimpleDemo\app\src\main\AndroidManifest.xml:24:5-81 Warning: Element uses-permission#android.permission.WRITE_EXTERNAL_STORAGE at AndroidManifest.xml:24:5-81 duplicated with element declared at AndroidManifest.xml:5:5-81 > Task :app:processDebugResources FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:processDebugResources'. > A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction > AAPT2 aapt2-7.0.2-7396180-windows Daemon #0: Unexpected error during link, attempting to stop daemon. This should not happen under normal circumstances, please file an issue if it does. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 8s 36 actionable tasks: 12 executed, 24 up-to-date
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值