`

《Unix & Linux 大学教程》 - 第十三章 学习笔记

阅读更多

学习笔记,内容基础,适合初学者。


阅读之前,请务必花30秒查看前言说明(在第一、二章前面部分)

《Unix & Linux 大学教程》 - 第一、二章 学习笔记   Unix简介 & 什么是Linux?什么是Unix

《Unix & Linux 大学教程》 - 第三、四章 学习笔记   Unix连接 & 开始使用Unix

《Unix & Linux 大学教程》 - 第五、六章 学习笔记   GUI:图形用户界面 & Unix工作环境

《Unix & Linux 大学教程》 - 第七、八章 学习笔记   Unix键盘使用 & 能够立即使用的程序

《Unix & Linux 大学教程》 - 第九、十章 学习笔记   文档资料:Unix手册与Info & 命令语法

《Unix & Linux 大学教程》 - 第十一、十二章 学习笔记   shell & 使用shell:变量和选项

《Unix & Linux 大学教程》 - 第十三章 学习笔记   使用shell:命令和定制


>>>>和 <<<<之间的内容为没有理解的部分,希望看到文章的各位,如果知道原因,希望能给予解释,感激不尽。



第十三章:使用shell:命令和定制

元字符:

字符 英文名称 Unix绰号 章号 作用
& ampersand(和号) -- 26 作业控制:在后台运行命令
' apostrophe(撇号) 引号、单引号 12 引用:取消所有的替换
* asterisk(星号) 星号 24 文件名扩展:匹配0个或多个字符
@ at sign(at符号) at    
` back quote(反引号) 反引号(backtick) 13 命令行:命令替换
\ backslash(反斜线) -- 12 引用:下一个字符转义
{} bracebrackets(花括号) 花括号,波型括号 12 变量:确定变量名称的界限
{} bracebrackets(花括号) 花括号,波型括号 24 花括号扩展:生成一种字符模式
^ circumflex(音调符号) 插入记号    
: colon(冒号) --    
, comma(逗号) --    
$ dollar sign(美元符号) 美元 12 变量:用变量的值替换
<Return> enter、return(回车) 新行 7 空白符:标记一行结束
= equal sign(等号) 等号    
! exclamation mark(感叹号) bang 13 历史列表:事件标记
> greater-than sign(大于号) 大于 15 命令行:重定向输出
- hyphen(连字符)、minus sign(减号) 虚线、减号    
< less-than sign(小于号) 小于 15 命令行:重定向输入
# number sign(序数符号) hash、pound 14 命令行:注释的开头,忽略该行其余部分
() parentheses(圆括号) -- 15 命令行:在子shell中运行命令
% percent sign(百分比符号) 百分比    
. period(点号)    
+ plus sign(加号)    
? question mark(问号) -- 24 文件名扩展:匹配任意一个字符
" quotation mark(引号) 双引号 12 引用:取消大部分替换
; semicolon(分号) -- 10 命令行:用于分割多条命令
/ slash(斜线) 正斜线    
<Space> space(空格) -- 10 空白符:在命令行中分割单词
[] square brackets(方括号) 方括号 24 文件名扩展:与一组字符中的字符匹配
<Tab> tab(制表符) -- 10 空白符:在命令行中分割单词
~ tilde(波浪号) -- 24 文件名扩展:插入home目录的名称
_ underscore(下划线) --    
| vertical bar(竖线) 管道 15 命令行:创建一个管道线

(注1:文件名扩展也成为“通配globbing”)

(注2:连字符:年轻人称之为dash,年长者称之为minus;序数符号:年轻人称之为hash,年长者成为pound)


这里双引号和单引号作用的区别是:单引号取消所有的替换(单引号中,所有元字符都将失效,变为普通字符),双引号取消大部分的替换,其中有三个符号特例,分别为:美元符号($)、反引号(`)、反斜线(\)

单引号也称之为强引用(strong quote),双引号称之为弱引用(weak quote)。(反斜线是所有引用中最强的)


当“\<Return>”位于命令行一行的末尾时,光标会换行,但是由于新行字符被转义,所以它不再是一行结束的信号。

~$ echo this is a \
> test
this is a test

感觉只是因为一行写不下了,换了个行,方便阅读而已,实际上还是一行。

下面看看单引号

$ echo 'this is a 
test'

输出

this is a 
test

命令行只有一个单引号(双引号也一样),输入换行之后shell还在等待更多的输入,直到补全单引号。在C-Shell或Tcsh会报错



内部命令:通常成为内置命令(builtin command,或者简称builtin),shell可以直接解释他们。

外部命令:除了内部命令的命令,必须独自运行独立程序。


每条命令的第一部分都是命令的名称,其他部分为选项或参数。

当输入内部命令时,shell在自己的进程内运行该命令。

输入外部命令时,shell创建一个子进程,然后等待。子进程开始执行实际程序。当程序终止时,子进程也将终止,然后控制将返回给父进程,从而导致子进程消失。接着父进程显示一个shell提示,邀请用户输入另一条命令。



区分内外部命令

1.外部命令都拥有自己的说明书页,内部命令没有。

2.使用type命令:type command...

$ type date time set
date is /bin/date
time is a shell keyword
set is a shell builtin

date是外部命令,time和set是内部命令


学习内部命令

所有内部命令都记录在shell说明书页中。所以可以使用下面命令查看:

man bash
man ksh
man tcsh
man csh

说明书页中查找builtin

apropos builtin(apropos = man -k,见《Unix & Linux 大学教程》 - 第九、十章 学习笔记

如果存在这样的说明书页,那么可以使用man builtin查看

$ apropos builtins 
bash-builtins (7)    - bash built-in commands, see bash(1)
builtins (7)         - bash built-in commands, see bash(1)

这里使用man builtins,结果如下

BASH-BUILTINS(7)                                                                                                                                            BASH-BUILTINS(7)
NAME
       bash-builtins - bash built-in commands, see bash(1)
SYNOPSIS
……
BASH BUILTIN COMMANDS
       Unless  otherwise  noted,  each  builtin  command documented in this section as accepting options preceded by - accepts -- to signify the end of the options.  The :,
       true, false, and test builtins do not accept options and do not treat -- specially.  The exit, logout, break, continue, let, and shift builtins  accept  and  process
       arguments  beginning with - without requiring --.  Other builtins that accept arguments but are not specified as accepting options interpret arguments beginning with
       - as invalid options and require -- to prevent this interpretation.
       : [arguments]
              No effect; the command does nothing beyond expanding arguments and performing any specified redirections.  A zero exit code is returned.
        .  filename [arguments]
       source filename [arguments]
……
       alias [-p] [name[=value] ...]
……

也可使用help命令,可以以若干种方式显示builtin说明书也中的信息。

help [-s] [command...]

$ help -s pwd help
pwd: pwd [-LP]
help: help [-dms] [pattern ...]

只希望查看命令的语法则使用-s(syntax,语法)选项即可。

查看关键字语法最快捷的方式是使用help



搜索路径:环境变量PATH,包含所有外部命令的程序的目录列表。shell通过它找到外部命令位置。

修改搜索路径的时候可以使用export,如果要在PATH后面添加一个路径,不要这样

export PATH="新添加路径"

这样只会把PATH设置成上面的路径。

可以使用export PATH="$PATH:新添加路径"


shell按顺序检查PATH列表的路径,如果找到了要执行的程序,那么它就停止搜索并执行程序。所以,如果想使用自己的程序,那么只需把自己程序的路径配置到PATH的前面即可。

可以在PATH中使用点号(.)来添加自己的当前正在工作的目录。

export PATH="$PATH:$HOME/bin:."

注意:如果加入工作目录到PATH中,最好放置它到PATH末尾

如果用户A加入到PATH开头,并且用户A具有超级权限或者特殊权限,那么当切换到另一个用户B的home目录时,在此执行的程序也许并非是用户A想要执行的那个(比如用户B写了一个自己ls放在其home目录下,并且用户A在此执行了ls,那么会执行用户B的ls命令而非系统的),所以可能会被其他人利用。


提示符:

shell类型 提示符
Bash $
Korn Shell $
C-Shell %
Tcsh %或者>
超级用户 #

根据惯例:标准的shell提示由一个字符及其后面的一个空格组成。



修改shell提示:修改环境变量PS1即可。

export PS1='$ '

书中使用双引号,但是之前说过,美元符在双引号中为元字符。所以还是不要使用双引号了。

当然,如果要使用变量,那么还是需要双引号的。比如:

export PS1="${USER}$ "


当在命令中使用'${VARIABLE}'时,所有字符都去字面含义,$字符保留下来,以便稍后使用其原本含义。

当在命令中使用“${VARIABLE}”时,$字符就被解释成元字符,整个表达式在这个时刻就被替换为VARIABLE的值。

当需要变量引用时,考虑变量在使用前会不会发生变化,如果会,则使用单引号来防止$被解释,直至需要他们。否则使用双引号,从而$立即被解释。

export PS1='${RANDOM} $'

这里使用单引号,因为变量RANDOM使用前会发生变化。这样,每次输入命令的时候,都是计算一次RANDOM。

如果使用双引号,则相当于计算出一个RANDOM赋值到PS1中,所以每次输入命令的时候,前面的提示符都是固定的一个数字。



使用转义符的特殊码

Bash和Tcsh允许使用特殊码在shell提示中插入信息。

下表为部分特殊码,在shell说明书页均有介绍

含义 Bash Tcsh Korn Shell C-Shell
工作目录:~表示法 \w %~ X X
工作目录:只有基名 \W X X X
工作目录:完整路径名 X %/ $PWD X
计算机的主机名 \h %m `hostname` `hostname`
当前用户标识 \u %n $LOGNAME $LOGNAME
shell的名称 \s X `basename $SHELL` `basename $SHELL`
时间:AM/PM表示法 \@ %@ X X
时间:24小时制表示法 \A %T X X
日期 \d X X X
星期 X %d X X
月的第几天 X %D X X
X %w X X
X %Y X X
历史列表:事件编号 \! %! ! !

X表示相应的shell不支持该选项,可以通过下面介绍的命令替换来设置。

例如:

export PS1="\u$ "



命令替换

命令替换(command substitution):命令替换允许在一条命令中嵌入另一条命令。shell首先执行嵌入的命令,并且用输出替换该命令。然后再执行整个命令。

例如:

$ echo "today is `date` "
today is 2012年 08月 13日 星期一 16:23:26 CST

这里先执行`date`,它的输出为2012年 08月 13日 星期一 16:23:26 CST,然后将它的结果替换掉`date`

现在变为cho "today is 2012年 08月 13日 星期一 16:23:26 CST"

其实我觉得命令替换很好理解,和$类似。只不过$变量,输出的是变量值,然后将变量用变量值替换;而命令替换则是执行命令而不是取变量值而已。

比如:

$ echo $TERM
xterm

可以理解为先计算$TERM为xterm,然后用其输出“xterm”替换$TREM,变为echo xterm。



历史列表

在输入命令时,shell会将命令保存到历史列表中,而无论命令是否有错误。

可以通过Up和Down调用历史列表,但一次只能显示一条。

历史列表中,每条命令称为一个事件,每个事件都有一个内部编号,称为事件编号。所以可以通过编号调用历史命令。


fc(fix command)

fc -l(同history):查看历史列表

fc -s 编号(同!编号):执行此编号的命令

fs -s(或!!):执行上一条命令


重新执行命令前修改命令

fc -s pattern=replacement number(类似!number:s/pattern/replacement,此方式只替换一次

在第number号命令中搜索字符串pattern,将其替换为replacement

 2024  date
 2025  history 
suzhaoqiang-一  8月 13$ fc -s e=a 2024
data
No command 'data' found, did you mean:
 Command 'dat' from package 'liballegro4.2-dev' (universe)
 Command 'date' from package 'coreutils' (main)
data: command not found

把2024号命令中e替换为a。

(我暂时觉得,还是复制粘贴过来的好,如果命令较长,其中有多个e,那就麻烦了,它会全部替换,或者替换第一个)


修改上次命令

fc -s pattern=replacement(类似^pattern^replacement,此方式只替换一次)


^R:重新调用包含该模式的最近一条命令。

(reverse-i-search)`l': ls -l

输入ctrl+R后,开始准备查找命令,然后输入ls,它就会找到我最近一次执行的ls命令为:ls -l。


历史列表大小

通过设置HISTSIZE环境变量设置,例如

export HISTSIZE=50


rm可以指定一系列模式。比如temp*表示文件名以temp开头的文件,temp?表示文件名以temp开头但是后面根一个字符的文件。

所以执行“rm temp* extra?”之前,要先"ls temp* extra?",确保不会删错文件,然后执行“fc -s ls=rm”即可



自动补全

shell类型 自动补全 补全对象
B K C T 文件名补全 文件和目录
X X T 命令补全 命令,包括路径名
X X T 变量补全 变量
X C T 用户标识补全 系统上的用户标识
X X X 主机名补全 局域网上的计算机

(B=Bash,K=Korn Shell,C=C-Shell,T=Tcsh,X表示对应的shell类型不支持该特性)



别名

alias、unalias

alias [name=commands]

如果你经常输入cd ../.. 那么可能会觉得这样很麻烦,如果能让cd2与cd ../..功效一样该多好

那么我们给cd ../..起一个别名,别名就叫cd2

alias cd2='cd ../..'

这时再输入cd2就可以了。

当然你也可以给alias起别名

alias a=alias

你也可以给多条命令起别名,比如:

alias test='cd;ls'


也可以把命令本身修改了,比如:

alias ls='ls -l'

那么运行ls的时候则相当于执行ls -l,如果想临时执行一下原来的ls命令,那么需要在命令前加“\


\ls

则相当于最初的ls命令


查看别名定义

alias name

type name

$ type cd2
cd2 is aliased to `cd ../..'
$ alias cd2
alias cd2='cd ../..' 

取消别名

unalias name

unalias -a(取消所有别名)


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

作者提到,由于技术原因,下面的命令不能应用别名:

alias del='^ls^rm'(C-Shell风格,Bash中执行^ls^rm是可以的)

但是可以使用下面的:

alias del='fc -s ls=rm'

不清楚原因,所以就先记住好了,猜测是由于脱字符的关系吧。


可以给下面命令起别名,达到同样的目的:

(1) rm !ls:*

(2) alias del='rm \!ls:*'(为什么叹号前面要加“\”?)

但是我的机器只能执行(1),却不能执行(2)(叹号前面不加也一样无法执行),希望路过的同学能帮忙解答一下。

 写道
rm: cannot remove `!ls:*': No such file or directory

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

更多详细信息请查看java教程网 http://www.itchm.com/forum-59-1.html
分享到:
评论

相关推荐

    linux学习笔记.docx

    - **简介**:/opt目录用于存放第三方软件包的安装位置。 - **重要性**:/opt目录提供了一个标准化的方式来组织额外安装的软件包,便于管理和升级。 通过以上对Linux系统结构中关键目录的详细介绍,我们不仅能够更...

    鸟哥的私房菜Linux学习笔记

    ### 鸟哥的私房菜Linux学习笔记关键知识点解析 #### 第一章 计算机概论 **1. CPU的种类** - **精简指令集(RISC)** - 特点:指令数量少,每条指令执行周期简单且快速。 - 例子:ARM架构。 - **复杂指令集...

    Linux学习笔记.pdf,linux详解,LINUX

    本资料“Linux学习笔记.pdf”将带你深入理解Linux的基础知识和高级应用。 一、Linux系统概述 1. Linux的起源:Linux的诞生源于托瓦兹对Minix系统的不满,他决定创建一个符合个人需求的、免费的Unix-like操作系统...

    linux学习笔记 .doc

    Linux学习笔记概述 Linux是一种自由和开放源代码的操作系统,其设计目标是提供一个轻量级、高效且安全的计算平台。Linux系统采用类UNIX目录结构,每个目录都有特定的功能和用途。以下是对Linux主要目录及其内容的...

    unix shell编程第三版笔记

    通过深入学习"Unix Shell编程第三版笔记",你将能够编写出高效的自动化脚本,提高工作效率,解决日常的系统管理和开发问题。同时,对Unix Shell的熟练掌握也是成为高级系统管理员或全栈开发者的必备技能之一。

    linux系统学习笔记

    ### Linux系统学习笔记 #### 一、Linux系统Shell介绍 1. **Linux系统Shell类型**:Linux系统提供了多种Shell供用户选择,常见的包括Bourne shell (`sh`), C shell (`csh`), Korn shell (`ksh`)等。其中,`sh`是Unix...

    2009 达内Unix学习笔记

    集合了 所有的 Unix命令大全 登陆服务器时输入 公帐号 openlab-open123 telnet 192.168.0.23 自己帐号 sd08077-you0 ftp工具 192.168.0.202 tools-toolss 老师测评网址 http://172.16.0.198:8080/poll/ 各个 ...

    linux与unix经典编程

    - 第一部分的第二个至第十个字符分为三个三元组(triplet),分别表示文件属主、组用户和其他用户的权限。 - 第二部分表示文件的硬链接数目。 - 第三部分表示文件属主。 - 第四部分表示文件属主所在的默认组。 - 第...

    APUE读书笔记(Unix高级环境编程)

    #### 第十三章 守护进程 - **设计良好的守护进程的规则**:包括脱离终端、成为会话领导等步骤。 - **系统日志机制**:使用`syslog`函数记录日志信息。 - **daemon(3)函数**:帮助编写守护进程的实用函数。 - **守护...

    第11章 Linux操作系统基础-教程与笔记习题

    以下是对"第11章 Linux操作系统基础"的主要知识点的详细阐述。 一、Linux操作系统简介 Linux是基于Unix的操作系统,由林纳斯·托瓦兹于1991年创建。它的内核是开源的,允许全球开发者对其进行修改和优化。Linux系统...

    嵌入式Linux入门笔记

    通过“嵌入式Linux入门笔记”,学习者将能了解嵌入式系统的基础概念,熟悉Linux内核、设备驱动、Bootloader的工作原理,掌握构建和调试嵌入式系统的技能,为成为一名合格的嵌入式Linux开发者打下坚实基础。

    Bash shell 学习笔记

    ### Bash Shell 学习笔记知识点概览 #### 1. 引言 - **Shell**:作为用户与操作系统之间的桥梁,Shell提供了一种与系统进行交互的方式,支持用户执行命令和编写脚本来自动化任务。 - **Bash**:是Bourne-Again ...

    Linux全攻略第一章目录认识

    本章主要探讨的是"Linux全攻略第一章:目录认识",这对于初学者来说是一份非常实用的学习资料。Linux的目录结构是其核心组成部分,理解它对于高效地操作和管理Linux系统至关重要。 Linux基于Unix系统,采用的是单一...

    python学习笔记

    ### Python学习笔记知识点总结 #### 一、Python简介与特点 **1.1 Python起源与发展** - **创建背景:** Python由Guido van Rossum在1989年圣诞节期间创建,旨在解决当时编程语言的一些不足之处。 - **设计理念...

    OS + Unix FreeBSD / MacOSX Snow Leopard 10.6.3-8 / MacBook Pro / apple / MC373

    根据压缩包中的文件名“Macbook_Pro上安装三系统详解教程.txt”,我们可以推测这个教程将指导用户如何在MacBook Pro上同时安装Unix FreeBSD、MacOSX Snow Leopard以及可能的第三个操作系统,例如Windows或Linux。...

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

    linux-python

    而在Windows系统上,通常需要借助第三方工具,如PuTTY、Xshell或SecureCRT。 在搭建远程登录服务之后,我们还可以进一步学习搭建各种网络服务,如Web服务器、FTP服务器和MySQL数据库服务器。Web服务器,如Apache,...

    郝斌c语言视频教程笔记

    郝斌的C语言视频教程笔记,是一套针对学习C语言的专业视频教程笔记,其内容涵盖了C语言的基本概念、特点、程序结构、数据类型、变量、常量、指针、编译过程等基础知识,同时也对C语言在操作系统、驱动开发、数据库...

    总结搜集的shell脚本学习笔记(完结篇).pdf

    ### Shell脚本编程知识点概述 #### 一、预备知识与基本概念 在开始Shell脚本文档的学习之前,首先需要理解Shell...以上就是文档《总结搜集的shell脚本学习笔记(完结篇)》中所涵盖的主要知识点,希望对你有所帮助。

Global site tag (gtag.js) - Google Analytics