UNIX系统操作与Shell编程指南


194、当mailx处于输入模式时,如何使用vi编辑器来撰写邮件?

在mailx输入模式下,输入$~v [Return]即可调用vi编辑器来撰写邮件。

195、读取当前日期和时间,并将其附加到消息末尾。

可使用

date

命令获取当前日期和时间,若要将其附加到消息末尾,假设消息存储在

message.txt

文件中,可使用命令:


date >> message.txt

196、在发送消息之前将消息保存到文件中。

可以使用

~w

命令,如:


~w first.mail [Return]

将当前编写的消息保存到指定文件(如

first.mail

)中;若设置了

mailx

record

变量,外发邮件会自动保存;使用:


~q [Return]

退出

mailx

输入模式也会将部分编写的消息保存到

HOME

目录下的

dead.letter

文件(或

DEAD

变量指定的文件名)中。

197、以同样的方式,使用vi编辑器和其他命令再撰写几条消息,并将它们发送给自己。这样你就有足够的消息来练习阅读邮件了。

按照在

mailx

输入模式下使用

vi

编辑邮件,添加日期时间,保存消息到文件,然后发送邮件等步骤,多撰写几条消息并发送给自己。

198、如何阅读邮件?

若要阅读邮件,可输入

mailx

并按 [Return] 键。系统可能会提示:


mailx version 4.0 Type ? for help.

接着显示邮箱信息,如:


/usr/students/mail/daniel": 1 message 1 new


?

提示符下,可通过输入邮件的关联消息编号指定要阅读的邮件,也可按 [Return] 键从当前邮件(标题中用

>

符号指示)开始阅读,并在

?

提示符后按 [Return] 键按顺序继续阅读邮件。

199、使用 mailx 命令模式下的所有命令,包括删除、恢复删除、保存等。

以下是

mailx

命令模式下各命令的使用说明:


!


:执行 shell 命令(shell 转义),例如

!ls

可在

mailx

中执行

ls

命令查看文件列表。


cd directory


:切换到指定目录,若未指定则切换到 HOME 目录,如

cd /tmp

切换到

/tmp

目录。


d


:删除指定消息,如

d 1 3

删除第 1 和第 3 条消息。


f


:显示当前消息的标题。


q


:退出

mailx

并从系统邮箱中移除消息。


h


:显示活动消息的头部。


m users


:向指定用户发送邮件,如

m daniel

向 daniel 发送邮件,

m daniel susan

向 daniel 和 susan 发送邮件。


R messages


:仅回复消息的作者,如

R 2

回复第 2 条消息的作者。


r messages


:回复消息的作者和所有其他收件人,如

r 2

回复第 2 条消息的作者及其他收件人。


s filename


:将指定消息保存(追加)到指定文件,如

s mymail.txt

将指定消息保存到

mymail.txt

文件。


t messages


:显示(打印)指定消息,如

t 2

显示第 2 条消息。


u messages


:恢复删除指定消息,如

u 1

恢复删除第 1 条消息。


x


:退出

mailx

但不从系统邮箱中移除消息。

200、读取邮件,使用 x 命令退出 mailx。然后再次读取邮件,使用 q 命令退出 mailx。观察 UNIX 系统给出的消息。

使用

x

命令退出

mailx

时,系统邮箱中已读邮件不会被移除,邮箱状态不变,即使标记为删除的邮件也会保留原样。

使用

q

命令退出

mailx

时,系统会自动移除系统邮箱中已读的邮件,默认情况下,被移除邮件的副本会保存在私人邮箱(

MAIL

变量指定的文件名)中。

201、使用 mailx 查看你的 mbox 文件。

可以使用命令

$ cat mbox [Return]

来查看 mbox 文件内容。也可以使用

mailx -f mbox [Return]

命令从 mbox 文件中读取邮件。

202、现在找另一个伙伴,使用write命令进行聊天。

操作步骤


获取已登录用户的用户ID


– 使用

who

命令获取当前已登录用户的用户ID。

– 假设伙伴的用户ID为

partner


发送消息


– 在终端输入

write partner

并按下

[Return]



– 如果伙伴已登录,其终端屏幕将显示消息提示。

– 在自己的终端输入要发送的消息内容:

每行输入完后按下

[Return]

发送。

在空行开头按下

[Ctrl + d]

结束消息发送。


接收回复


– 伙伴收到消息后,可在其终端输入

write your_user_id

并按下

[Return]

进行回复。

– 双方可同时发送消息进行实时对话。


通信约定


– 为避免对话混乱,可在消息行末尾输入字符

o

表示消息结束,可能等待回复。

– 输入

oo

表示对话结束。

203、将 mesg 设置为 n,然后设置为 y,并和你的伙伴一起观察效果。

可以使用以下命令操作:

首先输入

bash
$ mesg n [Return]


将其设置为不接收消息(NO)

之后输入

bash
$ mesg y [Return]


将其设置为接收消息(YES)

并和伙伴交流观察是否能正常接收对方使用

write

命令发送的消息。

204、解释编写程序并生成可执行文件所需的步骤。

创建可执行程序的步骤

无论使用何种计算机操作系统和编程语言,创建可执行程序需要以下步骤:

1. 创建源文件(源代码)

通常使用编辑器(如vi编辑器)编写程序并保存为文件。

该文件即为源代码,它是用所选编程语言编写的文本文件。

计算机本身无法理解源代码。

2. 创建目标文件(目标代码/目标模块)

由于计算机只理解机器语言,所以需要编译器或解释器将源代码翻译成计算机能理解的目标代码。

目标代码还不是可执行文件。

它缺少一些必要部分,这些必要部分通常存在于库文件中。

3. 创建可执行文件(可执行代码/加载模块)

目标代码可能引用了其他不在目标模块中的程序。

链接器或链接编辑器的作用是解决这些引用问题。

将所有部分组合在一起,创建出完整的、可立即执行的加载模块。

205、什么是源代码?

通常使用编辑器(如

vi

编辑器)编写程序并将内容保存到文件中,该文件就是源代码。源代码用所选的编程语言编写,计算机本身无法理解它,其目标是将源代码文件转换为可执行文件。

源代码文件是文本文件,也称为 ASCII 文件,具有以下特点:

可以在屏幕上显示

可以使用编辑器修改

可以发送到打印机以获得程序源代码的硬拷贝

206、编译器的功能是什么?


编译器是一种系统软件程序,其主要功能是将高级程序指令(如Pascal程序)翻译成计算机能够解释和执行的机器语言。它会一次性编译整个程序,在完成整个程序的编译之前不会给出任何反馈。此外,编译器生成的目标代码比解释器更好、更高效,因此编译后的程序运行速度更快,所需空间更少。

207、编译器和解释器有什么区别?

编译器与解释器的区别


编译器

是将高级程序指令(如Pascal程序)一次性编译成计算机能解释和执行的机器语言。编译完整个程序之后才会给出反馈。每种编程语言都需要单独的编译器。生成的目标代码更好、更高效。编译后的程序运行更快、占用空间更少。


解释器

也是将高级语言程序转换为机器语言,但它逐行翻译,能够立即给出反馈,可以在程序开发时纠正错误。解释器不生成单独的目标代码文件,每次执行程序时都需要进行翻译过程。生成的可执行代码效率低于编译器生成的代码,常用于教育环境。

208、编写一个简单的 C++ 程序,使其输出两行信息,第一行为 ‘Hi there!’,第二行为 ‘This is my first C++ program’。

以下是一个简单的 C++ 程序示例:


#include <iostream>
int main() {
    std::cout << "Hi there!" << std::endl;
    std::cout << "This is my first C++ program" << std::endl;
    return 0;
}

209、将英文“Compile it.”翻译成中文。

编译它。

210、运行程序。

不同程序的运行方式

不同程序的运行方式不同。

运行

svi2

程序

通过以下命令行可运行

svi2

程序:

输入

$ svi2 [Return]

可无参数运行

svi2

输入

$ svi2 myfirst [Return]

可带文件名运行

svi2

运行

uon

程序

运行

uon

程序可在后台运行,命令为:

$ uon emma &[Return]

运行

greetings1

程序

运行

greetings1

程序需确保已将其设为可执行文件,然后输入以下命令运行:

$ greetings1 [Return]

若登录 shell 是

ksh


bash

,需先输入以下命令调用

sh

外壳:

sh [Return]

再执行

greetings1

文件,可输入以下命令返回登录 shell:

exit

211、再次编译程序并指定可执行文件。

可以使用

g++

命令搭配

-o

选项来指定输出文件的名称,例如编译

first.cpp

并将输出文件命名为

first

,命令为:


$ g++ -o first first.cpp

需确保指定的输出文件名和源代码文件名不同,否则源代码文件会被覆盖。

212、如何再次运行之前执行过的命令?

可以使用Korn shell的r (redo)命令,该命令会从历史文件中重复最后一条或多条命令。

213、将你的程序输出保存到另一个文件中。

可以使用 shell 的输出重定向功能将程序输出重定向到另一个文件。

例如,运行名为

first

的可执行文件并将其输出保存到

first.out

文件中,可使用命令:


$ first > first.out [Return]

若要将程序输出显示在屏幕上并保存到文件中,可使用命令:


$ first | tee -a first.out [Return]

对于

ls

命令输出,若要保存到文件,可使用:


$ ls > mydir.list [Return]

若要追加输出到已有文件,可使用:


$ ls >> mydir.list [Return]

214、修改你的源代码并故意制造一个语法错误。

修改

first.cpp

文件,将第一条

cout()

语句末尾的分号(

;

)去掉,即把


std::cout << "Hi there!" << std::endl;

改为


std::cout << "Hi there!" << std::endl

215、当之前编译程序出现错误时,如何进行再次编译?若要将编译错误信息保存到文件,该怎么做?请举例说明。

若之前编译出现错误,需回到源文件(如

first.cpp

)纠正错误,再重新编译;若要将编译错误信息保存到文件,可利用 shell 的重定向功能。如之前编译

first.cpp

提示第6行缺少分号,就需在

first.cpp

第6行添加分号后,使用类似


g++ -c -o first first.cpp

的命令重新编译。若要保存错误信息到指定文件,可设置重定向。

216、查看包含编译错误信息的文件。

可以使用

cat

命令查看,例如

$ cat error [Return]

,其中

error

为存储编译错误信息的文件名。

217、如何执行一个 shell 脚本文件?

若 shell 脚本文件是可执行文件,无需调用其他 shell 程序来执行它,只需像执行其他命令(可执行文件)一样,直接输入文件名并按回车键即可。例如执行名为

won

的脚本文件,可输入


$ won [Return]

也可以使用

sh


ksh


bash

等 shell 命令来执行脚本文件,如使用

sh

命令执行名为

LL

的脚本文件,可输入


sh LL

218、使文件成为可执行文件的命令是什么?

使用

chmod u+x 文件名

命令可以使文件成为可执行文件,例如


$ chmod u+x myfile
[Return]


$ chmod u+x won
[Return]

219、从键盘读取输入的命令是什么?

read

命令用于从键盘读取输入。例如,在脚本中使用:

read name

read Word1 Word2 Rest

都是通过

read

命令从键盘读取输入的典型用法。

220、解释命令行参数。

shell脚本可以从命令行读取最多10个命令行参数(也称为参数)到特殊变量(也称为位置变量或参数)中。命令行参数是你在命令后输入的项,通常用空格分隔。这些参数会传递给程序,改变程序的行为或使其按特定顺序执行。特殊变量从0到9编号(没有编号10),分别命名为

$0


$1


$2

等。

221、什么是shell位置变量?

Shell脚本中的特殊变量(位置变量或参数)

Shell脚本可以从命令行读取最多10个命令行参数,这些参数存储在特殊变量(也称为位置变量或参数)中。这些变量从0到9编号(没有编号10),分别命名为

$0


$1


$2

等,具体含义如下:


$0


:包含脚本在命令行中输入的名称。


$1


$9


:分别包含第一到第九个命令行参数。


$#


:包含命令行参数的数量。


$@


:包含所有命令行参数,每个参数用引号括起来。


$?


:包含最后一个命令的退出状态。


$*


:包含所有命令行参数,以单个字符串形式存储。


$$


:包含执行进程的PID(进程ID)号。

222、位置变量与命令行参数有什么关系?

shell脚本可以从命令行将最多10个命令行参数读入特殊变量(即位置变量)。这些位置变量从0到9编号(没有编号10),分别命名为

$0


$1


$2

等。

$0

包含脚本在命令行中输入的名称,

$1


$9

分别包含第一到第九个命令行参数。

此外,还可以使用

set

命令为位置变量赋值,

set

命令的参数会被分配给位置变量。

223、如何调试你的 shell 脚本?

可以通过以下两种方式调试 shell 脚本:

在命令行输入

bash
$ sh -x 脚本文件名 [Return]

在脚本文件开头或希望开始调试的位置添加

set -x

命令。

224、请说出终止 shell 脚本的命令。

exit

225、循环结构的用途是什么?

for

循环用于按指定次数执行一组命令;

until

循环适用于编写执行依赖于其他事件发生的脚本,如检查指定用户是否登录系统,当循环条件为假时持续执行循环体,条件为真时停止。

226、while循环和until循环有什么区别?

以下是调整为 Markdown 格式的内容:


`while` 循环只要循环条件为真(非零)就会继续执行循环体,而 `until` 循环只要循环条件为假(零)就会继续执行循环体。

227、用于相加两个整数的命令是什么?

使用expr命令,如expr 1 + 2 ,注意运算符两侧要有空格。

228、用于将两个变量的值相乘的命令是什么?

可以使用

expr

命令来实现变量值相乘,例如有变量

a


b

,可使用

expr $a * $b

命令(注意运算符前后要有空格)。

229、什么是shell内置编程语言?


UNIX shell 有其内置的编程语言,它是一种命令语言,具备许多计算机编程语言共有的特性,包括结构化语言构造,如顺序、选择和迭代。使用该语言编写、修改和调试程序都很容易,且无需编译,编写完成后即可执行。

230、用于更改文件权限的命令是什么?

使用

chmod

命令来更改指定文件的权限,例如:

chmod u+x myfile

chmod o-w myfile

chmod a=rw myfile

chmod go= myfile

chmod a=x myfile

chmod 777 myfile

231、将名为xyz的文件权限更改为对所有用户(用户、组和其他用户)提供访问权限的命令是什么?

可以使用命令

$ chmod a=rw xyz

[Return] 给予所有用户读写权限;若要给予所有用户读、写和执行权限,可使用命令

$ chmod 777 xyz

[Return]。

232、什么时候使用 sh(ksh、bash)来执行命令?

当登录时,交互式 shell 会自动调用;也可以在

$

提示符下输入

sh

(或

ksh


bash

,取决于系统中可用的 shell)来调用另一个 shell 副本以执行命令。

233、我们什么时候使用chmod命令?

chmod

命令用于根据指示不同用户类别的选项字母更改指定文件的访问权限,如给文件赋予执行权限、更改文件访问模式、移除特定用户的访问权限等。

234、命令 sh -n 有什么作用?

该选项用于检测脚本文件中的语法错误,在运行程序前使用此选项可确保程序没有语法错误。

235、命令 sh -v 有什么作用?

-v

选项与

-x

选项类似,但它会在变量和命令替换完成之前显示命令。

它会显示 shell 读取的输入行。

还可以将

-x


-v

选项一起使用,这样可以查看文件中命令执行前后的情况以及它们产生的输出。

236、命令 sh -x 有什么作用?

显示脚本文件中命令及其参数在执行时的情况,展示参数和命令替换后的命令。

237、什么是test命令?

该命令测试作为参数传递给它的表达式的条件,并根据表达式的状态返回真或假。它使你能够测试不同类型的表达式。

238、什么是let命令?

以下是将给定文本内容调整为markdown格式的结果:

let

命令可用于处理整数算术,是

expr

命令更简单的替代方案,包含所有基本算术运算,如加、减、乘、除。它会自动使用变量的值,且会将

*


%

符号分别解释为乘法和取余运算符,无需使用

*


\%

来防止其特殊含义。此外,

let

命令可缩写为双括号

(( ))

239、如何在脚本(程序)中编写注释行?

在脚本中,Shell 识别

#

为注释符号,

#

之后的字符会被忽略。例如:

# 这是一条注释

# program version 3

date # show the current date

240、如何比较两个字符串?

可以使用

test

命令比较字符串,该命令提供了不同的运算符用于字符串比较,如:

=

判断两个字符串是否匹配

!=

判断两个字符串是否不匹配

使用时建议将变量用引号括起来,例如:


test "$STRING1" = "$STRING2"

241、如何比较两个数值?

可以使用

test

命令以代数方式比较两个整数数值,格式为:


test expression_1 logical_operator expression_2

逻辑运算符


逻辑与运算符(-a)


若两个表达式都为真,

test

命令返回

0

(条件码为真)。


逻辑或运算符(-o)


若一个或两个表达式为真,

test

命令返回

0

(条件码为真)。


逻辑非运算符(!)


若表达式为假,

test

命令返回

0

(条件码为真)。

数值比较运算符

运算符 说明

-eq

判断 number1 是否等于 number2

-ne

判断 number1 是否不等于 number2

-gt

判断 number1 是否大于 number2

-ge

判断 number1 是否大于或等于 number2

-lt

判断 number1 是否小于 number2

-le

判断 number1 是否小于或等于 number2

242、编写一个名为 t 的脚本文件,用于显示当前时间。

可以使用以下命令创建脚本文件

t

并使其显示当前时间:

首先使用

touch t

创建文件

然后使用

chmod +x t

赋予执行权限

接着使用

nano t

编辑文件

在文件中写入以下内容:

bash
#!/bin/bash
date +%T

最后保存退出并运行

./t

即可显示当前时间

243、编写一个名为 s 的脚本文件,用于显示当前使用的 shell 的名称。

可以使用以下命令创建名为

s

的脚本文件:


echo '#!/bin/sh' > s
echo 'echo $SHELL' >> s

然后将其变为可执行文件:


chmod +x s

最后执行该脚本:


./s

即可显示当前 shell 的名称。

244、trap 命令的作用是什么?

trap

命令用于设置和重置中断信号,可改变进程接收到信号时的默认操作,如让进程忽略中断信号或执行指定命令而非终止。

245、如何终止一个进程?

可以使用

kill

命令终止不需要或运行异常的进程,使用时必须指定进程 ID 号。信号值通常为 1 到 15,大多与实现有关,默认信号值 15 通常会使接收进程终止,对于一些能保护自身免受

kill

命令影响的进程,可使用信号值 9 来终止它们。

246、你的系统的终止键是什么?

通常使用

@


[Ctrl - u]

,也可以通过命令:


$ stty kill ^u [Return]

将终止键设置为

[Ctrl - u]

。使用以下命令:


$ stty ek [Return]

可将终止键重置为

@

247、你的系统的删除键是什么?

可以使用[Backspace]键删除字符,也可以按一次[Ctrl – h]删除一个字符。

248、case结构的用途是什么?

case

结构用于从命令列表中选择性地执行一组命令。当需要使用多个

elif

语句(例如超过两三个)时,使用

case

结构比使用多个

elif

语句是一种更优雅的编程方式。

它可用于以下场景:

实现菜单程序,识别用户的选择并执行相应的命令;

根据不同条件执行不同操作,如在问候程序中根据一天中的不同时段显示合适的问候语。

249、更改删除行的按键设置。检查其是否已更改。

可使用命令

stty kill ^u

(将删除行的按键设置为 [Ctrl – u] )来更改设置。要检查是否更改,可使用

stty

命令查看当前终端设置,或在终端中尝试按下设置的按键,看是否能实现删除整行的功能。

250、使用tput命令清除屏幕。

使用命令:$ tput clear [Return] ,屏幕将被清除。

251、解释UNIX系统安全。保护文件系统的方法有哪些?

系统安全概述

系统安全是多用户系统的重要组成部分,需要考虑以下多个方面:

防止未经授权的人员访问系统

防止授权用户篡改系统文件或其他用户的文件

授予某些用户特定权限

在UNIX系统中,可以通过简单命令实现安全保护,系统安全的松紧程度可根据需求进行设置。

文件系统保护方法

保护文件系统的一种常用方法是使用密码安全机制。系统将每个用户的信息保存在

/etc/passwd

文件中,其中密码以加密形式存储。



System V Release 4

中,加密后的密码存储在

/etc/shadow

文件中,而

/etc/passwd

文件中的密码字段则使用字母

x

作为占位符。普通用户无法读取

/etc/shadow

文件,从而增强了系统的安全性。

252、cd命令是内置命令吗?如何查明?

cd

命令是内置命令。可以通过在命令行输入


$ man shell_builtins [Return]

来获取内置命令的完整列表,从而查明。

253、解释实际时间(elapsed time)、用户时间(user time)和系统时间(system time)。

实际时间是命令运行所花费的真实时间,可能比总 CPU 时间大几倍。用户时间是 CPU 专门用于执行用户命令的时间。系统时间是执行 UNIX 内核例程以服务用户命令所花费的时间。

例如,对

BIG_FILE

进行排序的命令运行时,实际时间为 60.8 秒,用户时间为 11.4 秒,系统时间为 4.6 秒,总 CPU 时间为 16 秒。

254、哪个命令用于报告磁盘空间?

df命令用于报告指定文件系统的磁盘总空间或可用空间。

255、如果你想在稍后的时间执行一个程序,应该使用什么命令?

可以使用

at

命令,示例如下:

明天凌晨 4 点运行作业:

bash
$ at 04 tomorrow
[Return]

然后输入要执行的命令,如:

bash
sort BIG_FILE
[Return]

最后按

[Ctrl-d]

结束输入。

周三中午运行作业:

bash
$ at noon Wed
[Return]

输入命令如:

bash
mailx david < memo
[Return]


[Ctrl-d]

结束。

周五下午 3:30 执行脚本文件:

bash
$ at 1530 Fri < cmd_file
[Return]

© 版权声明

相关文章

暂无评论

none
暂无评论...