Unix快速指南

Unix - 快速指南

Unix - 入门指南

什么是Unix?

Unix操作系统是一组程序,用作计算机和用户之间的链接。

分配系统资源并协调计算机内部细节的计算机程序称为操作系统内核

用户通过称为shell的程序与内核通信shell是一个命令行解释器; 它会转换用户输入的命令,并将其转换为内核所理解的语言。

  • Unix最初于1969年由贝塔实验室的AT&T员工Ken Thompson,Dennis Ritchie,Douglas McIlroy和Joe Ossanna组成。

  • 市面上有各种Unix变种。Solaris Unix,AIX,HP Unix和BSD是几个例子。Linux也是免费提供的Unix的风格。

  • 几个人可以同时使用Unix电脑; 因此Unix被称为多用户系统。

  • 用户也可以同时运行多个程序; 因此Unix是一个多任务环境。

Unix架构

以下是Unix系统的基本框图 -

Unix架构

结合Unix所有版本的主要概念是以下四个基础 -

  • 内核 - 内核是操作系统的核心。它与硬件和大多数任务(如内存管理,任务调度和文件管理)进行交互。

  • Shell - shell是处理您的请求的实用程序。当您在终端上键入命令时,shell解释该命令并调用所需的程序。shell使用所有命令的标准语法。C Shell,Bourne Shell和Korn Shell是大多数Unix版本中最有名的shell。

  • 命令和实用程序 - 有各种命令和实用程序,您可以在日常活动中使用它们。cpmvcatgrep等都是命令和实用程序的例子。有通过3提供超过250个标准命令以及许多其他第三第三方软件。所有命令都附带各种选项。

  • 文件和目录 - Unix的所有数据都被组织成文件。然后将所有文件组织成目录。这些目录进一步组织成一个称为文件系统的树形结构

系统启动

如果您有安装了Unix操作系统的计算机,那么您只需要打开系统即可使其生效。

一旦打开系统,它将开始启动,最后它会提示您登录系统,这是一个登录系统并将其用于日常活动的活动。

登录Unix

当您首次连接到Unix系统时,通常会看到如下提示:

login:

登录

  • 让您的userid(用户识别)和密码准备就绪。如果您还没有,请与系统管理员联系。

  • 在登录提示符下键入您的用户标识,然后按ENTER键您的用户标识符区分大小写,因此请确保按照系统管理员的指示键入。

  • 在密码提示下键入密码,然后按ENTER键您的密码也区分大小写。

  • 如果您提供正确的用户名和密码,那么您将被允许进入系统。阅读屏幕上显示的信息和信息,如下所示。

login : amrood
amrood\"s password:
Last login: Sun Jun 14 09:32:32 2009 from 62.61.164.73
$

您将被提供一个命令提示符(有时称为$提示符),您可以在其中键入所有命令。例如,要检查日历,您需要键入cal命令,如下所示:

$ cal
     June 2009
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

$

更改密码

所有Unix系统都需要密码才能确保您的文件和数据保持自己的状态,并且系统本身对黑客和cookie来说是安全的。以下是更改密码的步骤 -

步骤1 - 要启动,请在命令提示符下键入password,如下所示。

步骤2 - 输入您当前使用的密码。

步骤3 - 输入新密码。始终保持您的密码很复杂,以至于没有人能猜到它。但请确保您记住它。

步骤4 - 您必须再次输入验证密码。

$ passwd
Changing password for amrood
(current) Unix password:******
New UNIX password:*******
Retype new UNIX password:*******
passwd: all authentication tokens updated  successfully

$

注意 - 我们在这里添加了星号(*),只是为了显示您需要在系统中输入当前和新密码的位置。键入时不显示任何字符。

列表目录和文件

Unix中的所有数据都被组织成文件。所有文件都被组织成目录。这些目录被组织成一个称为文件系统的树状结构。

您可以使用ls命令列出目录中可用的所有文件或目录。以下是使用ls命令和-l选项的示例

$ ls -l
total 19621
drwxrwxr-x  2 amrood amrood      4096 Dec 25 09:59 uml
-rw-rw-r--  1 amrood amrood      5341 Dec 25 08:38 uml.jpg
drwxr-xr-x  2 amrood amrood      4096 Feb 15  2006 univ
drwxr-xr-x  2 root   root        4096 Dec  9  2007 urlspedia
-rw-r--r--  1 root   root      276480 Dec  9  2007 urlspedia.tar
drwxr-xr-x  8 root   root        4096 Nov 25  2007 usr
-rwxr-xr-x  1 root   root        3192 Nov 25  2007 webthumb.php
-rw-rw-r--  1 amrood amrood     20480 Nov 25  2007 webthumb.tar
-rw-rw-r--  1 amrood amrood      5654 Aug  9  2007 yourfile.mid
-rw-rw-r--  1 amrood amrood    166255 Aug  9  2007 yourfile.swf

$

这里以d .....开头的条目表示目录。例如,uml,univ和urlspedia是目录,其余的条目是文件。

你是谁?

当您登录系统时,您可能愿意知道:我是谁

找出“你是谁”的最简单的方法是输入whoami命令 -

$ whoami
 amrood

$

尝试在您的系统上。此命令列出与当前登录名关联的帐户名称。你可以尝试我的命令,以获取有关你自己的信息。

谁登录了?

有时你可能有兴趣知道谁在同一时间登录到电脑。

根据您希望了解其他用户的数量,用户可以通过以下三种命令来获取此信息:userswhow

$ users
 amrood bablu qadir

$ who
amrood ttyp0 Oct 8 14:10 (limbo)
bablu  ttyp2 Oct 4 09:08 (calliope)
qadir  ttyp4 Oct 8 12:09 (dent)

$

尝试在系统上w命令检查输出。这将列出与登录系统的用户关联的信息。

注销

完成会话后,您需要退出系统。这是为了确保没有人访问您的文件。

注销

  • 只需在命令提示符下键入logout命令,系统将清理所有内容并断开连接。

系统关机

通过命令行正确关闭Unix系统的最一致的方法是使用以下命令之一 -

S.No. 命令与说明
1

使系统立即关闭

2

init 0

使用预定义的脚本关闭系统,以在关闭之前同步并清理系统

3

init 6

重新启动系统,完全关闭系统,然后重新启动

4

没电了

通过断电关闭系统

重启

重新启动系统

6

关掉

关闭系统

您通常需要是超级用户或根(Unix系统上最有特权的帐户)关闭系统。然而,在一些独立或个人拥有的Unix框中,管理用户,有时是普通用户可以这样做。

Unix - 文件管理

在本章中,我们将详细探讨Unix中的文件管理。Unix中的所有数据都被组织成文件。所有文件都被组织成目录。这些目录被组织成一个称为文件系统的树状结构。

当您使用Unix进行操作时,您大部分时间都会使用文件。本教程将帮助您了解如何创建和删除文件,复制和重命名它们,为其创建链接等。

在Unix中,有三种基本类型的文件 -

  • 普通文件 - 普通文件是系统上包含数据,文本或程序指令的文件。在本教程中,您将看到使用普通文件。

  • 目录 - 目录存储特殊和普通文件。对于熟悉Windows或Mac OS的用户,Unix目录等同于文件夹。

  • 特殊文件 - 一些特殊文件可以访问诸如硬盘驱动器,CD-ROM驱动器,调制解调器和以太网适配器之类的硬件。其他特殊文件类似于别名或快捷方式,并允许您使用不同的名称访问单个文件。

列出文件

要列出当前目录中存储的文件和目录,请使用以下命令 -

$ls

以上是上面命令的输出示例 -

$ls

bin        hosts  lib     res.03
ch07       hw1    pub     test_results
ch07.bak   hw2    res.01  users
docs       hw3    res.02  work

命令ls支持-l选项,这将帮助您获取有关列出的文件的更多信息 -

$ls -l
total 1962188

drwxrwxr-x  2 amrood amrood      4096 Dec 25 09:59 uml
-rw-rw-r--  1 amrood amrood      5341 Dec 25 08:38 uml.jpg
drwxr-xr-x  2 amrood amrood      4096 Feb 15  2006 univ
drwxr-xr-x  2 root   root        4096 Dec  9  2007 urlspedia
-rw-r--r--  1 root   root      276480 Dec  9  2007 urlspedia.tar
drwxr-xr-x  8 root   root        4096 Nov 25  2007 usr
drwxr-xr-x  2    200    300      4096 Nov 25  2007 webthumb-1.01
-rwxr-xr-x  1 root   root        3192 Nov 25  2007 webthumb.php
-rw-rw-r--  1 amrood amrood     20480 Nov 25  2007 webthumb.tar
-rw-rw-r--  1 amrood amrood      5654 Aug  9  2007 yourfile.mid
-rw-rw-r--  1 amrood amrood    166255 Aug  9  2007 yourfile.swf
drwxr-xr-x 11 amrood amrood      4096 May 29  2007 zlib-1.2.3
$

以下是所有列出的列的信息 -

  • 第一列 - 表示该文件的文件类型和权限。以下是所有类型文件的描述。

  • 第二列 - 表示文件或目录占用的内存块数。

  • 第三列 - 表示文件的所有者。这是创建此文件的Unix用户。

  • 第四列 - 代表所有者的组。每个Unix用户都将有一个关联的组。

  • 第五列 - 以字节表示文件大小。

  • 第六列 - 表示最后一次创建或修改此文件的日期和时间。

  • 第七列 - 表示文件或目录名称。

ls -l列表示例中,每个文件行以d-l开头这些字符表示列出的文件的类型。

S.No. 前缀和说明
1

-

常规文件,如ASCII文本文件,二进制可执行文件或硬链接。

2

b

阻止特殊文件。阻止输入/输出设备文件,如物理硬盘。

3

C

字符特殊文件。原始输入/输出设备文件,如物理硬盘。

4

ð

包含其他文件和目录列表的目录文件。

符号链接文件。链接任何常规文件。

6

p

命名管道。进程间通信的机制。

7

小号

用于进程间通信的套接字。

元字符

元字符在Unix中有特殊的含义。例如,*是元字符。我们使用*来匹配0个或更多个字符,一个问号()与单个字符匹配。

例如 -

$ls ch*.doc

显示所有文件,其中先从名字CH和结束.DOC -

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc ch02-1.doc c

这里,*作为与任何字符匹配的元字符。如果要显示以.doc结尾的所有文件,则可以使用以下命令 -

$ls *.doc

隐藏文件

一个不可见的文件是一个,其第一个字符是点或周期字符(。)。Unix程序(包括shell)使用大多数这些文件来存储配置信息。

隐藏文件的一些常见示例包括文件 -

  • .profile - Bourne shell(sh)初始化脚本

  • .kshrc - Korn shell(ksh)初始化脚本

  • .cshrc - C shell(csh)初始化脚本

  • .rhosts - 远程shell配置文件

要列出不可见的文件,请指定-a选项到ls -

$ ls -a

.         .profile       docs     lib     test_results
..        .rhosts        hosts    pub     users
.emacs    bin            hw1      res.01  work
.exrc     ch07           hw2      res.02
.kshrc    ch07.bak       hw3      res.03
$
  • 单点(。) - 表示当前目录。

  • 双点(..) - 这表示父目录。

创建文件

您可以使用vi编辑器在任何Unix系统上创建普通文件。你只需要给出以下命令 -

$ vi filename

上述命令将打开一个包含给定文件名的文件。现在,按键进入编辑模式。一旦您处于编辑模式,您可以开始在文件中编写您的内容,如下面的程序 -

This is unix file....I created it for the first time.....
I\"m going to save this content in this file.

完成该程序后,请按照下列步骤操作:

  • Esc键退出编辑模式。

  • 按两下Shift + ZZ将文件从文件中完全出来。

您现在将在当前目录中创建一个文件创建的文件

$ vi filename
$

编辑文件

您可以使用vi编辑器编辑现有文件我们将简要探讨如何打开现有文件 -

$ vi filename

打开文件后,可以按键i进入编辑模式,然后可以通过编辑文件进行操作。如果要在文件中移动到这里,那么首先需要按Esc键退出编辑模式之后,您可以使用以下键在文件中移动 -

  • l键移动到右侧。

  • h键移动到左侧。

  • k键在文件中上移。

  • j键在文件中下移。

所以使用上面的键,你可以将光标放在任何你想编辑的地方。定位后,您可以使用i键进入编辑模式。完成文件编辑后,按Esc键,最后将两个Shift + ZZ一起从文件中完全出来。

显示文件的内容

您可以使用cat命令查看文件的内容。以下是一个简单的例子来看到上面创建的文件的内容 -

$ cat filename
This is unix file....I created it for the first time.....
I\"m going to save this content in this file.
$

您可以使用-b选项以及cat命令显示行号,如下所示:

$ cat -b filename
1   This is unix file....I created it for the first time.....
2   I\"m going to save this content in this file.
$

在文件中计数单词

您可以使用wc命令获取文件中包含的行,字和字符总数的计数。以下是一个简单的例子来查看上面创建的文件的信息 -

$ wc filename
2  19 103 filename
$

以下是所有四列的细节 -

  • 第一列 - 表示文件中总行数。

  • 第二列 - 表示文件中的单词总数。

  • 第三列 - 表示文件中的总字节数。这是文件的实际大小。

  • 第四列 - 表示文件名。

您可以一次提供多个文件并获取有关这些文件的信息。以下是简单的语法 -

$ wc filename1 filename2 filename3

复制文件

要使文件的副本使用cp命令。该命令的基本语法是 -

$ cp source_file destination_file

以下是创建现有文件文件的副本的示例

$ cp filename copyfile
$

现在,您会发现多了一个文件的CopyFile在当前目录。该文件将与原始文件文件完全相同

重命名文件

要更改文件的名称,请使用mv命令。以下是基本语法 -

$ mv old_file new_file

以下程序将把现有的文件重新命名newfile

$ mv filename newfile
$

MV命令将完全移动现有的文件到新的文件。在这种情况下,你会发现只有的newfile在当前目录。

删除文件

要删除现有文件,请使用rm命令。以下是基本语法 -

$ rm filename

注意 - 文件可能包含有用的信息。使用此删除命令时始终建议小心最好使用-i选项以及rm命令。

以下是显示如何完全删除现有文件文件的示例

$ rm filename
$

您可以使用以下命令一次删除多个文件 -

$ rm filename1 filename2 filename3
$

标准Unix流

一般情况下,每个Unix程序启动时都会打开三个流(文件)

  • stdin - 这被称为标准输入,相关的文件描述符为0.这也表示为STDIN。Unix程序将从STDIN读取默认输入。

  • stdout - 这被称为标准输出,相关的文件描述符为1.这也表示为STDOUT。Unix程序将在STDOUT中写入默认输出

  • stderr - 这被称为标准错误,相关的文件描述符为2.这也表示为STDERR。Unix程序将在STDERR中写入所有错误消息。

Unix - 目录管理

在本章中,我们将详细探讨Unix中的目录管理。

一个目录是一个文件,其个人作业是存储文件名和相关信息。所有文件,无论是普通的,特殊的还是目录,都包含在目录中。

Unix使用层次结构来组织文件和目录。这种结构通常被称为目录树。树具有单个根节点,斜杠字符(/),所有其他目录都包含在其中。

主目录

您首次登录时发现自己的目录称为主目录。

您将在您的主目录和您将要创建的子目录中进行大部分工作来组织文件。

您可以随时使用以下命令进入您的主目录 -

$cd ~
$

这里表示主目录。假设你必须去任何其他用户的主目录,使用以下命令 -

$cd ~username
$

要进入最后一个目录,可以使用以下命令 -

$cd -
$

绝对/相对路径名

目录以顶层的根(/)排列在层次结构中。层次结构中任何文件的位置由其路径名描述。

路径名的元素由一个/。路径名是绝对的,如果是根据root描述的,那么绝对路径名始终以a开头。

以下是绝对文件名的一些示例。

/etc/passwd
/users/sjones/chem/notes
/dev/rdsk/Os3

路径名也可以相对于您当前的工作目录。相对路径名从不以/开头。相对于用户amrood的主目录,一些路径名可能看起来像这样 -

chem/notes
personal/res

要随时确定文件系统层次结构中的位置,请输入命令pwd以打印当前工作目录 -

$pwd
/user0/home/amrood

$

上市目录

要列出目录中的文件,可以使用以下语法 -

$ls dirname

以下是列出/ usr / local目录中包含的所有文件的示例-

$ls /usr/local

X11       bin          gimp       jikes       sbin
ace       doc          include    lib         share
atalk     etc          info       man         ami

创建目录

现在我们将了解如何创建目录。目录由以下命令创建 -

$mkdir dirname

这里,目录是要创建的目录的绝对路径名或相对路径名。例如,命令 -

$mkdir mydir
$

在当前目录中创建目录mydir这是另一个例子 -

$mkdir /tmp/test-dir
$

此命令/ tmp 目录创建目录test-dirMKDIR命令不产生任何输出,如果它成功地创建请求的目录。

如果在命令行上给出多个目录,mkdir会创建每个目录。例如, -

$mkdir docs pub
$

在当前目录下创建目录docs和pub。

创建父目录

我们现在将了解如何创建父目录。有时,当您要创建目录时,其父目录或目录可能不存在。在这种情况下,mkdir会发出如下错误消息:

$mkdir /tmp/amrood/test
mkdir: Failed to make directory "/tmp/amrood/test"; 
No such file or directory
$

在这种情况下,您可以mkdir命令指定-p选项它为您创建所有必要的目录。例如 -

$mkdir -p /tmp/amrood/test
$

上述命令创建所有必需的父目录。

删除目录

可以使用rmdir命令删除目录,如下所示:

$rmdir dirname
$

注意 - 要删除目录,请确保它是空的,这意味着该目录中不应有任何文件或子目录。

您可以一次删除多个目录,如下所示:

$rmdir dirname1 dirname2 dirname3
$

上述命令删除目录dirname1,dirname2和dirname3(如果它们为空)。如果成功,rmdir命令不会产生输出。

改变目录

您可以使用cd命令做更多的不只是更改到主目录。您可以通过指定一个有效的绝对路径或相对路径来使用它来更改任何目录。语法如下:

$cd dirname
$

这里,dirname是要更改的目录的名称。例如,命令 -

$cd /usr/local/bin
$

目录/ usr / local / bin的更改从该目录可以使用以下相对路径cd到目录/ usr / home / amrood -

$cd ../../home/amrood
$

重命名目录

MV(移动)指令,也可用于重命名的目录。语法如下 -

$mv olddir newdir
$

您可以将目录mydir重命名yourdir,如下所示:

$mv mydir yourdir
$

目录。(点)和..(点点)

文件名。(dot)表示当前工作目录; 文件名..(dot dot)表示当前工作目录以上一级的目录,通常称为父目录。

如果我们输入命令显示当前工作目录/文件的列表,并使用-a选项列出所有文件和-l选项以提供长列表,我们将收到以下结果。

$ls -la
drwxrwxr-x    4    teacher   class   2048  Jul 16 17.56 .
drwxr-xr-x    60   root              1536  Jul 13 14:18 ..
----------    1    teacher   class   4210  May 1 08:27 .profile
-rwxr-xr-x    1    teacher   class   1948  May 12 13:42 memo
$

Unix - 文件许可/访问模式

在本章中,我们将详细探讨Unix中的文件权限和访问模式。文件所有权是Unix的一个重要组件,它提供了一种用于存储文件的安全方法。Unix中的每个文件具有以下属性 -

  • 所有者权限 - 所有者的权限确定文件所有者可以对文件执行哪些操作。

  • 组权限 - 组的权限确定用户(文件所属组成员)可对该文件执行哪些操作。

  • 其他(世界)权限 - 其他人的权限表示其他所有用户可以对文件执行什么操作。

许可指标

使用ls -l命令时,会显示与文件许可有关的各种信息,如下所示:

$ls -l /home/amrood
-rwxr-xr--  1 amrood   users 1024  Nov 2 00:10  myfile
drwxr-xr--- 1 amrood   users 1024  Nov 2 00:10  mydir

这里,第一列表示不同的访问模式,即与文件或目录相关联的权限。

权限被分成三组,组中的每个位置按照以下顺序表示特定权限:read(r),write(w),execute(x) -

  • 前三个字符(2-4)表示文件所有者的权限。例如,-rwxr-xr--表示所有者具有read(r),write(w)和execute(x)权限。

  • 第二组三个字符(5-7)由文件所属的组的权限组成。例如,-rwxr-xr--表示该组具有read(r)和execute(x)权限,但没有写入权限。

  • 最后一组三个字符(8-10)表示其他人的权限。例如,-rwxr-xr--表示只有read(r)权限。

文件访问模式

文件的权限是Unix系统安全性的第一道防线。Unix权限的基本构建块是读取写入执行权限,如下所述:

授予读取能力,即查看文件的内容。

授予修改或删除文件内容的功能。

执行

具有执行权限的用户可以将程序作为程序运行。

目录访问模式

目录访问模式以与任何其他文件相同的方式列出和组织。有一些差异需要提及 -

访问目录意味着用户可以读取内容。用户可以查看目录中的文件名。

访问意味着用户可以从目录中添加或删除文件。

执行

执行一个目录并没有什么意义,所以认为这是一个遍历权限。

为了执行lscd命令,用户必须具有bin目录的执行访问权限

改变权限

要更改文件或目录权限,请使用chmod(change mode)命令。使用chmod有两种方法 - 符号模式和绝对模式。

在符号模式下使用chmod

初学者修改文件或目录权限的最简单方法是使用符号模式。使用符号权限,您可以使用下表中的运算符添加,删除或指定所需的权限集。

S.No. Chmod操作符和说明
1

+

将指定的权限添加到文件或目录。

2

-

从文件或目录中删除指定的权限。

3

=

设置指定的权限。

以下是使用testfile的示例在测试文件上运行ls -1显示文件的权限如下 -

$ls -l testfile
-rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile

然后,每个示例来自上表的chmod命令在测试文件上运行,后跟ls -l,因此您可以看到权限更改 -

$chmod o+wx testfile
$ls -l testfile
-rwxrwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod u-x testfile
$ls -l testfile
-rw-rwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod g = rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

以下是在一行中组合这些命令的方法 -

$chmod o+wx,u-x,g = rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

使用chmod与绝对权限

使用chmod命令修改权限的第二种方法是使用一个数字来指定文件的每个权限集。

为每个权限分配一个值,如下表所示,每组权限的总和为该集合提供一个数字。

八进制权限表示 参考
0 没有权限 ---
1 执行权限 - X
2 写权限 -W-
3 执行和写入许可:1(执行)+ 2(写)= 3 -wx
4 读权限 R--
读取和执行权限:4(读取)+ 1(执行)= 5 RX
6 读写许可:4(读)+ 2(写)= 6 RW-
7 所有权限:4(读)+ 2(写)+ 1(执行)= 7 RWX

以下是使用testfile的示例。在测试文件上运行ls -1显示文件的权限如下 -

$ls -l testfile
-rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile

然后,每个示例来自上表的chmod命令在测试文件上运行,后跟ls -l,因此您可以看到权限更改 -

$ chmod 755 testfile
$ls -l testfile
-rwxr-xr-x  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 743 testfile
$ls -l testfile
-rwxr---wx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 043 testfile
$ls -l testfile
----r---wx  1 amrood   users 1024  Nov 2 00:10  testfile

更改所有者和组

在Unix上创建一个帐户时,它会为每个用户分配一个所有者ID组ID上述所有权限也是根据所有者和组分配。

两个命令可用于更改所有者和文件组 -

  • chown - chown命令代表“更改所有者”,用于更改文件的所有者。

  • chgrp - chgrp命令代表“更改组”,用于更改文件组。

改变所有权

CHOWN命令更改文件的所有权。基本语法如下 -

$ chown user filelist

用户的值可以是系统上用户名称或系统上用户的用户标识(uid)

以下示例将帮助您了解概念 -

$ chown amrood testfile
$

将给定文件的所有者更改为用户amrood

注意 - 超级用户root具有不受限制的权限,可以更改任何文件的所有权,但普通用户只能更改其拥有的文件的所有权。

改变集团所有权

chgrp命令命令更改文件的组所有权。基本语法如下 -

$ chgrp group filelist

组的值可以是系统上的名称或系统上组的组ID(GID)

以下示例可帮助您了解概念 -

$ chgrp special testfile
$

将给定文件的组更改为特殊组。

SUID和SGID文件权限

通常执行命令时,必须使用特殊权限执行命令才能完成其任务。

例如,当您使用passwd命令更改密码时,您的新密码将存储在文件/ etc / shadow中

作为常规用户,出于安全考虑,您不具有对该文件的读取写入权限,但是当您更改密码时,您需要具有此文件的写入权限。这意味着passwd程序必须提供额外的权限,以便您可以写入文件/ etc / shadow

通过称为设置用户ID(SUID)设置组ID(SGID)的机制向程序提供附加权限

当您执行启用了SUID位的程序时,您继承该程序所有者的权限。没有设置SUID的程序将以启动程序的用户的权限运行。

SGID也是如此。通常,程序会执行您的组权限,但是您的组将只是将该程序更改为程序的组所有者。

如果权限可用,SUID和SGID位将显示为字母“s”SUID 的“位”将位于所有者的执行权限通常所在的权限位中

例如,命令 -

$ ls -l /usr/bin/passwd
-r-sr-xr-x  1   root   bin  19031 Feb 7 13:47  /usr/bin/passwd*
$

显示SUID位已设置,并且该命令由根拥有。大写字母S在执行位置而不是小写字母s表示执行位未设置。

如果在目录上启用了粘性位,只有当您是以下用户之一时才能删除文件 -

  • 粘性目录的所有者
  • 文件的所有者被删除
  • 超级用户,根

要为任何目录设置SUID和SGID位,请尝试以下命令 -

$ chmod ug+s dirname
$ ls -l
drwsr-sr-x 2 root root  4096 Jun 19 06:45 dirname
$

Unix - 环境

在本章中,我们将详细探讨Unix环境。一个重要的Unix的概念就是环境,这是由环境变量定义。一些由系统设置,其他由你设置,其他的由shell设置,或者任何加载另一个程序的程序。

一个变量是我们分配一个值的字符string。分配的值可以是数字,文本,文件名,设备或任何其他类型的数据。

例如,首先我们设置一个变量TEST,然后使用echo命令来访问它的值-

$TEST="Unix Programming"
$echo $TEST

它产生以下结果。

Unix Programming

请注意,环境变量的设置不使用$符号,但访问它们时,我们使用$符号作为前缀。这些变量保留它们的值,直到我们从shell出来。

当您登录系统时,shell将进行一个称为初始化的阶段来设置环境。这通常是一个两步的过程,涉及到shell读取以下文件 -

  • / etc / profile文件
  • 轮廓

过程如下 -

  • shell检查文件/ etc / profile是否存在。

  • 如果它存在,shell读取它。否则,将跳过此文件。不显示错误信息。

  • shell检查文件.profile是否存在于您的主目录中。您的主目录是您登录后开始的目录。

  • 如果存在,shell读取它; 否则,外壳会跳过它。不显示错误信息。

只要这两个文件都被读取,shell会显示一个提示 -

$

这是您可以输入命令以便执行命令的提示。

- 这里详细介绍的shell初始化过程适用于所有Bourne类型的shell,但bashksh使用了一些其他文件

.profile文件

文件/ etc / profile由Unix机器的系统管理员维护,并包含系统上所有用户所需的shell初始化信息。

文件.profile在您的控制之下。您可以根据需要添加尽可能多的shell定制信息。您需要配置的最小信息集包括 -

  • 您正在使用的终端类型。
  • 查找命令的目录列表。
  • 影响终端外观和风格的变量列表。

您可以检查您的主目录中.profile文件。使用vi编辑器打开它,并检查为您的环境设置的所有变量。

设置终端类型

通常,您正在使用的终端类型由logingetty程序自动配置。有时,自动配置过程会错误地猜测您的终端。

如果您的终端设置不正确,则输出的命令可能看起来很奇怪,否则可能无法正确与外壳进行交互。

为了确保不是这种情况,大多数用户以下列方式将终端设置为最低公分母 -

$TERM=vt100
$

设置路径

当您在命令提示符下键入任何命令时,shell必须找到该命令才能执行。

PATH变量指定shell应该查找命令的位置。通常,Path变量设置如下:

$PATH = /bin:/usr/bin
$

这里,每个由冒号字符(:)分隔的条目都是目录。如果您请求shell执行命令,并且在PATH变量中给出的任何目录中找不到命令,将显示类似于以下内容的消息:

$hello
hello: not found
$

有像PS1和PS2这样的变量在下一节探讨。

PS1和PS2变量

shell显示为命令提示符的字符存储在变量PS1中。您可以将此变量更改为任何您想要的。一旦你改变它,它就会被shell使用。

例如,如果你发出命令 -

$PS1=\"=>\"
=>
=>
=>

您的提示将变为=>。要设置PS1的值以显示工作目录,请发出命令 -

=>PS1="[u@h w]$"
[root@ip-72-167-112-17 /var/www/vue5/unix]$
[root@ip-72-167-112-17 /var/www/tutorialspoint/unix]$

此命令的结果是提示显示用户的用户名,机器的名称(主机名)和工作目录。

有很多转义序列可以用作PS1的值参数; 尝试将自己限制在最关键的位置,以便提示信息不会压倒您。

S.No. 逃脱序列和描述
1

t

当前时间,表示为HH:MM:SS

2

D

当前日期,以平日日期为单位表示

3

n

新队

4

S

当前shell环境

W

工作目录

6

W

工作目录的完整路径

7

ü

当前用户的用户名

8

H

当前机器的主机名

9

当前命令的命令编号。输入新命令时增加

10

$

如果有效的UID为0(即,如果以root身份登录),则以#字符结束提示; 否则,使用$ sign

您可以在每次登录时自行进行更改,也可以通过将其添加到.profile文件中,使PS1自动更改

当您发出不完整的命令时,shell将显示辅助提示,并等待您完成命令并再次按Enter

默认辅助提示符是>(大于符号),但可以通过重新定义PS2 shell变量来更改-

以下是使用默认辅助提示的示例 -

$ echo "this is a
> test"
this is a
test
$

下面给出的示例重新定义了PS2的定制提示 -

$ PS2="secondary prompt->"
$ echo "this is a
secondary prompt->test"
this is a
test
$

环境变量

以下是重要环境变量的部分列表。这些变量的设置和访问如下所述 -

S.No. 变量和说明
1

显示

包含X11程序默认使用的显示标识符

2

表示当前用户的主目录:cd 内置命令的默认参数

3

IFS

表示扩展后解析器用于分词内部字段分隔符。

4

LANG

LANG扩展到默认系统区域设置; LC_ALL可以用来覆盖这个。例如,如果它的值为pt_BR,则语言设置为(巴西)葡萄牙语,并将语言设置为巴西。

LD_LIBRARY_PATH

具有动态链接器的Unix系统包含目录的分离列表,动态链接器在执行exec后构建过程映像时,在搜索任何其他目录之前,应搜索共享对象。

6

domain

表示命令的搜索路径。它是一个冒号分隔的目录列表,其中shell查找命令。

7

PWD

表示由cd命令设置的当前工作目录。

8

随机

每次引用时,生成0到32,767之间的随机整数。

9

SHLVL

每次启动bash的实例时增加一次。此变量可用于确定内置的退出命令是否结束当前会话。

10

术语

指显示类型。

11

TZ

指时区。它可以取值,如GMT,AST等

12

UID

扩展到当前用户的数字用户ID,在shell启动时初始化。

以下示例显示了几个环境变量 -

$ echo $HOME
/root
]$ echo $DISPLAY

$ echo $TERM
xterm
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/home/amrood/bin:/usr/local/bin
$

Unix Basic Utilities - 打印,电子邮件

在本章中,我们将详细探讨打印和电子邮件作为Unix的基本功能。到目前为止,我们已经尝试了解Unix操作系统及其基本命令的性质。在本章中,我们将学习一些可以在日常生活中使用的重要的Unix工具。

打印文件

在Unix系统上打印文件之前,您可能需要重新格式化以调整边距,突出显示某些单词等等。大多数文件也可以打印而不重新格式化,但原始打印输出可能不是那么有吸引力。

许多版本的Unix包括两个强大的文本格式化程序,nrofftroff

指挥部

PR命令执行终端屏幕上或用于打印机的文件少量格式。例如,如果文件中有很长的名称列表,则可以将其格式化为两个或更多列。

以下是pr命令的语法

pr option(s) filename(s)

PR改变只在屏幕上或在所述印刷拷贝该文件的格式; 它不会修改原始文件。下表列出了一些公关方案-

S.No. 选项和说明
1

-k

产生k列输出

2

-d

双输出(不在所有的pr版本)

3

-h“header”

将下一个项目作为报告标题

4

-t

消除标题和顶部/底部边距的打印

-l PAGE_LENGTH

将页面长度设置为PAGE_LENGTH(66)行。默认行文数为56

6

-o MARGIN

用MARGIN(零)空格偏移每一行

7

-w PAGE_WIDTH

将页面宽度设置为仅用于多个文本列输出的PAGE_WIDTH(72)个字符

在使用pr之前,这里是一个名为food的示例文件的内容。

$cat food
Sweet Tooth
Bangkok Wok
Mandalay
Afghani Cuisine
Isle of Java
Big Apple Deli
Sushi and Sashimi
Tio Pepe\"s Peppers
........
$

让我们用pr命令做出两列报告,标题餐厅 -

$pr -2 -h "Restaurants" food
Nov  7  9:58 1997  Restaurants   Page 1

Sweet Tooth              Isle of Java
Bangkok Wok              Big Apple Deli
Mandalay                 Sushi and Sashimi
Afghani Cuisine          Tio Pepe\"s Peppers
........
$

lp和lpr命令

命令lplpr将文件打印到纸上而不是屏幕显示。使用pr命令准备好格式化后,您可以使用以下任何命令在连接到计算机的打印机上打印文件。

您的系统管理员可能已经在您的站点设置了默认打印机。在默认打印机上打印名为food的文件,请使用lplpr命令,如以下示例所示:

$lp food
request id is laserp-525  (1 file)
$

LP命令显示你可以用它来取消打印作业或检查其状态的ID。

  • 如果使用lp命令,可以使用-n Num选项打印Num份数。与命令lpr一起,您可以使用 - Num作为相同的。

  • 如果有多台打印机与共享网络连接,则可以使用-d 打印机选项以及lp命令选择打印机,同样的目的,您可以使用-P 打印机选项以及lpr命令。这里打印机是打印机名称。

lpstat和lpq命令

的lpstat命令显示什么在打印机队列:请求ID,所有者,文件大小,当工作岗位发送的要打印,以及请求的状态。

如果您想要查看除您自己以外的所有输出请求,请使用lpstat -o请求按照打印的顺序显示 -

$lpstat -o
laserp-573  john  128865  Nov 7  11:27  on laserp
laserp-574  grace  82744  Nov 7  11:28
laserp-575  john   23347  Nov 7  11:35
$

LPQ给出比略有不同信息的lpstat -o -

$lpq
laserp is ready and printing
Rank   Owner      Job  Files                  Total Size
active john       573  report.ps              128865 bytes
1st    grace      574  ch03.ps ch04.ps        82744 bytes
2nd    john       575  standard input         23347 bytes
$

这里第一行显示打印机状态。如果打印机停用或纸张不足,您可能会在第一行看到不同的信息。

取消和lprm命令

取消命令终止从打印请求lp命令LPRM命令终止所有LPR请求您可以指定请求的ID(由lp或lpq显示)或打印机的名称。

$cancel laserp-575
request "laserp-575" cancelled
$

要取消当前打印的任何请求,无论其ID如何,只需输入取消和打印机名称 -

$cancel laserp
request "laserp-573" cancelled
$

LPRM,如果它属于你的命令将取消活动作业。否则,您可以将作业编号作为参数,或使用破折号( - )删除所有作业 -

$lprm 575
dfA575diamond dequeued
cfA575diamond dequeued
$

LPRM命令告诉您从打印机队列中删除的实际文件名。

发送电子邮件

您使用Unix邮件命令发送和接收邮件。以下是发送电子邮件的语法 -

$mail [-s subject] [-c cc-addr] [-b bcc-addr] to-addr

以下是与邮件命令-s相关的重要选项

S.No. 选项和说明
1

-s

在命令行上指定主题。

2

-C

将碳副本发送到用户列表。列表应该是一个逗号分隔的名称列表。

3

-b

发送盲卡复制列表。列表应该是一个逗号分隔的名称列表。

以下是向admin@yahoo.com发送测试消息的示例。

$mail -s "Test Message" admin@yahoo.com 

然后,您将输入您的消息,然后在行的开始处输入“control-D”要停止,只需键入点(。)如下 -

Hi,

This is a test
.
Cc: 

您可以使用重定向<运算符发送完整的文件,如下所示 -

$mail -s "Report 05/06/07" admin@yahoo.com < demo.txt 

要在Unix系统上检查收到的电子邮件,您只需键入电子邮件,如下所示:

$mail
no email

Unix - 管道和过滤器

在本章中,我们将详细探讨Unix中的管道和过滤器。您可以将两个命令连接在一起,使得一个程序的输出成为下一个程序的输入。以这种方式连接的两个或多个命令形成管道。

要制作一个管道,请在两个命令之间的命令行上放置一个垂直条(|)。

当程序从另一个程序接收输入时,它会对该输入执行一些操作,并将结果写入标准输出。它被称为过滤器

grep命令

grep命令在文件或文件中搜索具有某种模式的行。语法是 -

$grep pattern file(s)

名称“grep”来自ed(一个Unix行编辑器)命令g / re / p,这意味着“全局搜索正则表达式并打印包含它的所有行”。

正则表达式是一些纯文本(例如一个字)和/或用于模式匹配的特殊字符。

最简单的使用grep就是寻找一个由单个单词组成的模式。它可以在管道中使用,以便只将包含给定字符string的输入文件的那些行发送到标准输出。如果您不给grep一个文件名读取,它读取其标准输入; 这就是所有过滤程序的工作方式 -

$ls -l | grep "Aug"
-rw-rw-rw-   1 john  doc     11008 Aug  6 14:10 ch02
-rw-rw-rw-   1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--   1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$

有各种选项可以与grep命令一起使用-

S.No. 选项和说明
1

-v

打印所有不符合模式的行。

2

-n

打印匹配的行及其行号。

3

-l

仅打印具有匹配行(字母“l”)的文件名称

4

-C

仅打印匹配行数。

-一世

匹配大小写。

现在让我们使用一个正则表达式来告诉grep找到具有“carol”的行,其次是在正则表达式中被缩写为“。*”)的零个或其他字符,然后是“Aug”。

在这里,我们使用-i选项来区分大小写搜索 -

$ls -l | grep -i "carol.*aug"
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$

排序命令

排序命令安排字母或数字的文本行。以下示例将食物文件中的行排序 -

$sort food
Afghani Cuisine
Bangkok Wok
Big Apple Deli
Isle of Java

Mandalay
Sushi and Sashimi
Sweet Tooth
Tio Pepe\"s Peppers
$

排序命令按字母顺序排列的默认文本行。有很多选项来控制排序 -

S.No. 描述
1

-n

数字排序(例如:10将排序2后),忽略空白和选项卡。

2

-r

反转排序顺序。

3

-F

一起排列大小写。

4

+ X

排序时忽略第一个x字段。

可以将多于两个命令链接到管道中。以前的管道示例使用grep,我们可以按照大小的顺序进一步排序在8月修改的文件。

以下管道由命令lsgrepsort组成

$ls -l | grep "Aug" | sort +4n
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-rw-  1 john  doc     11008 Aug  6 14:10 ch02
$

此管道按照大小顺序对您在8月份修改的目录中的所有文件进行排序,并将其打印在终端屏幕上。排序选项+ 4n跳过四个字段(字段由空格分隔),然后按数字顺序对行进行排序。

pg和更多命令

屏幕上通常可以压缩长输出,但如果您更多地运行文本或使用pg命令作为过滤器; 一旦屏幕充满文字,显示屏就会停止。

我们假设你有一个很长的目录列表。为了更容易阅读排序的列表,通过以下更多的方式管道输出

$ls -l | grep "Aug" | sort +4n | more
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--  1 john  doc     14827 Aug  9 12:40 ch03
	.
	.
	.
-rw-rw-rw-  1 john  doc     16867 Aug  6 15:56 ch05
--More--(74%)

屏幕将填满一个屏幕,其中包含按照文件大小顺序排列的文本。在屏幕的底部是更加提示,您可以在其中键入一个命令来移动排序的文本。

完成此屏幕后,您可以使用更多程序探讨中列出的任何命令。

Unix - 进程管理

在本章中,我们将详细探讨Unix中的进程管理。当您在Unix系统上执行程序时,系统会为该程序创建一个特殊的环境。此环境包含系统运行程序所需的一切,就像系统上没有运行其他程序一样。

无论何时在Unix中发出命令,它都会创建或启动一个新进程。当您尝试ls命令列出目录内容时,您启动了一个进程。一个简单的过程是一个正在运行的程序的实例。

操作系统通过称为pid进程ID的五位数ID号跟踪进程系统中的每个进程都有一个唯一的pid

虱子最终重复,因为所有可能的数字都用完了,下一个pid滚动或重新开始。在任何时间点上,系统中不存在具有相同pid的两个进程,因为它是Unix用于跟踪每个进程的pid。

开始一个过程

当您启动一个进程(运行命令)时,有两种方法可以运行它 -

  • 前台处理
  • 背景过程

前台处理

默认情况下,您启动的每个进程都在前台运行。它从键盘获取输入,并将其输出发送到屏幕。

您可以使用ls命令看到这一点如果您希望列出当前目录中的所有文件,可以使用以下命令 -

$ls ch*.doc

这将显示所有文件,其名称的开始通道和结束.DOC -

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

该进程在前台运行,输出指向我的屏幕,如果ls命令需要任何输入(它没有),它将从键盘等待。

当程序在前台运行并且耗时时,没有其他命令可以运行(启动任何其他进程),因为在程序完成处理并出来之前,提示将不可用。

背景过程

后台进程运行而不连接到您的键盘。如果后台进程需要任何键盘输入,则会等待。

在后台运行进程的优点是可以运行其他命令; 你不必等到完成开始另一个!

启动后台进程的最简单方法是在命令的末尾添加符号()。

$ls ch*.doc &

这将显示所有这些文件,其中先从名字CH和结束.DOC -

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

在这里,如果ls命令需要任何输入(它没有),它将进入停止状态,直到我们将其移动到前台,并从键盘中提供数据。

第一行包含有关后台进程的信息 - 作业号和进程ID。您需要知道作业号才能在背景和前景之间进行操作。

按Enter键,您将看到以下内容 -

[1]   +   Done                 ls ch*.doc &
$

第一行告诉你ls命令后台进程成功完成。第二个是另一个命令的提示。

列出运行进程

通过运行ps(进程状态)命令可以轻松查看自己的进程,如下所示:

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

ps中最常用的标志之一是-f(f for full)选项,它提供了更多信息,如下例所示:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f

以下是ps -f命令显示的所有字段的描述-

S.No. 列和说明
1

UID

此进程所属的用户ID(运行该用户的人员)

2

PID

进程ID

3

PPID

父进程ID(启动它的进程的ID)

4

C

CPU利用率的过程

STIME

处理开始时间

6

TTY

与过程相关联的终端类型

7

时间

CPU进程占用的时间

8

CMD

启动此过程的命令

还有其他选项可以与ps命令一起使用-

S.No. 选项和说明
1

-一个

显示有关所有用户的信息

2

-X

显示有关没有终端的进程的信息

3

-u

显示其他信息,如-f选项

4

-e

显示扩展信息

停止进程

结束一个过程可以通过几种不同的方式完成。通常,从基于控制台的命令,发送CTRL + C键击(默认中断字符)将退出该命令。当进程以前台模式运行时,此功能将起作用。

如果进程在后台运行,则应使用ps命令获取其作业ID 之后,可以使用kill命令杀死进程,如下所示:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

这里,kill命令终止first_one进程。如果进程忽略常规kill命令,则可以使用kill -9,后跟进程ID,如下所示:

$kill -9 6738
Terminated

父子进程

每个unix进程都有两个ID号分配给它:进程ID(pid)和父进程号(ppid)。系统中的每个用户进程都有一个父进程。

您运行的大多数命令都将shell作为其父级。检查ps -f示例,其中该命令列出进程ID和父进程ID。

僵尸和孤儿进程

通常,当子进程被杀死时,通过SIGCHLD信号更新父进程然后,父级可以根据需要执行其他任务或重新启动一个新的小孩。然而,有时父进程在其小孩被杀之前就被杀死。在这种情况下,init进程的“所有进程的父进程成为新的PPID(父进程ID)。在某些情况下,这些过程称为孤立进程。

当进程被杀死时,ps列表仍然可以显示具有Z状态的进程这是一个僵尸或灭亡的过程。这个过程是死的,没有被使用。这些过程与孤儿过程不同。它们已经完成执行,但仍然在进程表中找到一个条目。

守护进程

守护进程是系统相关的后台进程,它们通常以其他进程的根和服务请求的权限运行。

守护进程没有控制终端。它不能打开/ dev / tty如果你做一个“ps -ef”并且看tty字段,所有守护进程将会有一个tty

确切地说,一个守护进程是一个在后台运行的进程,通常是等待发生的事情,它能够与之配合使用。例如,打印机守护进程等待打印命令。

如果你有一个程序需要长时间的处理,那么值得让它成为一个守护进程,并在后台运行它。

顶级命令

顶部的命令是用于快速示出由各种标准排序处理的非常有用的工具。

它是一个交互式诊断工具,经常更新,并显示有关物理和虚拟内存,CPU使用率,负载平均值和忙碌进程的信息。

以下是运行top命令的简单语法,并查看不同进程对CPU利用率的统计信息 -

$top

作业ID与进程ID

背景和暂停进程通常通过作业号(作业ID)进行操作该号码与进程ID不同,因为它较短。

此外,作业可以由并行运行的多个进程组成,也可以同时进行。使用作业ID比跟踪单个进程更容易。

Unix - 网络通信工具

在本章中,我们将详细探讨Unix中的网络通信实用程序。当您在分布式环境中工作时,您需要与远程用户进行通信,并且还需要访问远程Unix机器。

有几个Unix实用程序可帮助用户在联网的分布式环境中进行计算。本章列举了其中的几个。

ping实用程序

命令发送的回波请求给网络上可用的主机。使用此命令,您可以检查远程主机是否正常响应。

ping命令对以下内容很有用 -

  • 跟踪和隔离硬件和软件问题。
  • 确定网络和各种外部主机的状态。
  • 测试,测量和管理网络。

用法

以下是使用ping命令的简单语法 -

$ping hostname or ip-address

上述命令在每秒钟后开始打印响应。要退出命令,可以按CNTRL + C终止

以下是检查网络上可用主机可用性的示例 -

$ping google.com
PING google.com (74.125.67.100) 56(84) bytes of data.
64 bytes from 74.125.67.100: icmp_seq = 1 ttl = 54 time = 39.4 ms
64 bytes from 74.125.67.100: icmp_seq = 2 ttl = 54 time = 39.9 ms
64 bytes from 74.125.67.100: icmp_seq = 3 ttl = 54 time = 39.3 ms
64 bytes from 74.125.67.100: icmp_seq = 4 ttl = 54 time = 39.1 ms
64 bytes from 74.125.67.100: icmp_seq = 5 ttl = 54 time = 38.8 ms
--- google.com ping statistics ---
22 packets transmitted, 22 received, 0% packet loss, time 21017ms
rtt min/avg/max/mdev = 38.867/39.334/39.900/0.396 ms
$

如果主机不存在,您将收到以下输出 -

$ping giiiiiigle.com
ping: unknown host giiiiigle.com
$

ftp实用程序

在这里,FTP代表˚F ILE 牛逼转让(BOT)P rotocol。此实用程序可帮助您将文件从一台计算机上传并下载到另一台计算机。

ftp实用程序有自己的一套类Unix命令。这些命令可以帮助您执行以下任务:

  • 连接并登录到远程主机。

  • 浏览目录。

  • 列出目录内容

  • 放置并获取文件。

  • 传输文件asciiebcdic二进制文件

用法

以下是使用ping命令的简单语法 -

$ftp hostname or ip-address

上述命令将提示您登录ID和密码。验证后,您可以访问登录帐户的主目录,您可以执行各种命令。

下表列出了一些重要的命令 -

S.No. 命令与说明
1

放文件名

将本地机器的文件名上传到远程机器。

2

获取文件名

将文件名从远程机器下载到本地机器。

3

mput文件列表

将多个文件从本地机器上传到远程机器。

4

mget文件列表

将多个文件从远程机器下载到本地机器。

提示关闭

关闭提示。默认情况下,您将收到使用mputmget命令上传或下载文件的提示

6

提示

打开提示。

7

DIR

列出远程机器当前目录中可用的所有文件。

8

cd dirname

将目录更改为远程机器上的dirname。

9

lcd dirname

将目录更改为本地机器上的dirname。

10

放弃

帮助从当前登录注销。

应该注意的是,所有文件将被下载或上传到当前目录或从当前目录上传。如果要将文件上传到特定目录中,则需要先修改该目录,然后上传所需的文件。

以下是显示几个命令的工作的例子 -

$ftp amrood.com
Connected to amrood.com.
220 amrood.com FTP server (Ver 4.9 Thu Sep 2 20:35:07 CDT 2009)
Name (amrood.com:amrood): amrood
331 Password required for amrood.
Password:
230 User amrood logged in.
ftp> dir
200 PORT command successful.
150 Opening data connection for /bin/ls.
total 1464
drwxr-sr-x   3 amrood   group       1024 Mar 11 20:04 Mail
drwxr-sr-x   2 amrood   group       1536 Mar  3 18:07 Misc
drwxr-sr-x   5 amrood   group        512 Dec  7 10:59 OldStuff
drwxr-sr-x   2 amrood   group       1024 Mar 11 15:24 bin
drwxr-sr-x   5 amrood   group       3072 Mar 13 16:10 mpl
-rw-r--r--   1 amrood   group     209671 Mar 15 10:57 myfile.out
drwxr-sr-x   3 amrood   group        512 Jan  5 13:32 public
drwxr-sr-x   3 amrood   group        512 Feb 10 10:17 pvm3
226 Transfer complete.
ftp> cd mpl
250 CWD command successful.
ftp> dir
200 PORT command successful.
150 Opening data connection for /bin/ls.
total 7320
-rw-r--r--   1 amrood   group       1630 Aug  8 1994  dboard.f
-rw-r-----   1 amrood   group       4340 Jul 17 1994  vttest.c
-rwxr-xr-x   1 amrood   group     525574 Feb 15 11:52 wave_shift
-rw-r--r--   1 amrood   group       1648 Aug  5 1994  wide.list
-rwxr-xr-x   1 amrood   group       4019 Feb 14 16:26 fix.c
226 Transfer complete.
ftp> get wave_shift
200 PORT command successful.
150 Opening data connection for wave_shift (525574 bytes).
226 Transfer complete.
528454 bytes received in 1.296 seconds (398.1 Kbytes/s)
ftp> quit
221 Goodbye.
$

telnet实用程序

有时我们需要连接到远程的Unix机器并远程处理该机器。Telnet是一个实用程序,允许一个站点的计算机用户进行连接,登录,然后在另一个站点的计算机上进行工作。

一旦您使用Telnet登录,您可以执行远程连接的机器上的所有活动。以下是Telnet会话的示例 -

C:>telnet amrood.com
Trying...
Connected to amrood.com.
Escape character is \"^]\".

login: amrood
amrood\"s Password: 
*****************************************************
*                                                   *
*                                                   *
*    WELCOME TO AMROOD.COM                          *
*                                                   *
*                                                   *
*****************************************************

Last unsuccessful login: Fri Mar  3 12:01:09 IST 2009
Last login: Wed Mar  8 18:33:27 IST 2009 on pts/10

   {  do your work }

$ logout
Connection closed.
C:>

手指实用程序

手指在一个给定主机上的用户命令显示的信息。主机可以是本地或远程。

出于安全考虑,手指可能在其他系统上被禁用。

以下是使用finger命令的简单语法 -

检查本地机器上的所有登录用户 -

$ finger
Login     Name       Tty      Idle  Login Time   Office
amrood               pts/0          Jun 25 08:03 (62.61.164.115)

获取有关本地机器上可用的特定用户的信息 -

$ finger amrood
Login: amrood                           Name: (null)
Directory: /home/amrood                 Shell: /bin/bash
On since Thu Jun 25 08:03 (MST) on pts/0 from 62.61.164.115
No mail.
No Plan.

检查远程机器上的所有登录用户 -

$ finger @avtar.com
Login     Name       Tty      Idle  Login Time   Office
amrood               pts/0          Jun 25 08:03 (62.61.164.115)

获取有关远程机器上可用的特定用户的信息 -

$ finger amrood@avtar.com
Login: amrood                           Name: (null)
Directory: /home/amrood                 Shell: /bin/bash
On since Thu Jun 25 08:03 (MST) on pts/0 from 62.61.164.115
No mail.
No Plan.

Unix - vi编辑器教程

在本章中,我们将了解vi Editor在Unix中的工作原理。有很多方法可以在Unix中编辑文件。使用面向屏幕的文本编辑器vi编辑文件是最好的方法之一。该编辑器使您可以在上下文中编辑文件中的其他行。

V 编辑器的改进版本也被称为VIM在这里,VIM代表Vi IM证明。

vi通常被认为是Unix编辑器中的实际标准,因为 -

  • 它通常可以在所有的Unix系统上使用。

  • 它的实现非常相似。

  • 它需要很少的资源。

  • 它比其他编辑器更加人性化,如edex

您可以使用vi编辑器编辑现有文件或从头开始创建新文件。您也可以使用此编辑器来阅读文本文件。

启动vi编辑器

下表列出了使用vi编辑器的基本命令 -

S.No. 命令与说明
1

vi文件名

创建一个新的文件,如果它已经不存在,否则打开一个现有的文件。

2

vi -R文件名

以只读模式打开现有文件。

3

查看文件名

以只读模式打开现有文件。

下面是创建一个新的文件为例testfile的,如果它已经在当前的工作目录不存在-

$vi testfile

上述命令将生成以下输出 -

|
~
~
~
~
~
~
~
~
~
~
~
~
"testfile" [New File]    

您将注意到光标后面的每行上都会有一个波浪号(〜)。波浪号表示未使用的行。如果一行不以波浪符号开始,并且看起来是空白的,则存在空格,制表符,换行符或其他一些不可见的字符。

你现在有一个打开的文件开始工作。在进一步介绍之前,让我们了解一些重要的概念。

操作模式

在使用vi编辑器的同时,通常会遇到以下两种模式:

  • 命令模式 - 此模式使您可以执行管理任务,例如保存文件,执行命令,移动光标,切割(剪切)和粘贴行或单词,以及查找和替换。在这种模式下,无论你输入什么都被解释为一个命令。

  • 插入模式 - 此模式可以将文本插入到文件中。在此模式下键入的所有内容都将被解释为输入并放在文件中。

vi始终在命令模式下启动要输入文本,您必须处于简单类型i的插入模式要退出插入模式,请按Esc键,这将返回到命令模式。

提示 - 如果您不确定您所在的模式,请按Esc键两次; 这将带您进入命令模式。您使用vi编辑器打开文件。首先键入一些字符,然后进入命令模式来了解差异。

离开vi

退出vi的命令是:q在命令模式下,键入冒号和\"q\",然后返回。如果您的文件以任何方式进行了修改,编辑器会向您发出警告,不要让您退出。要忽略此消息,退出vi而不保存的命令是:q!这可以让您退出vi而不保存任何更改。

保存编辑器内容的命令是:w您可以将上述命令与quit命令进行组合,或者使用:wq和return。

保存更改并退出vi的最简单方法是使用ZZ命令。当您处于命令模式时,键入ZZZZ命令的工作方式相同:WQ命令。

如果要指定/声明文件的任何特定名称,可以通过以下方式指定:w例如,如果要将您正在处理的文件另存filename2,请输入:w filename2并返回。

在文件中移动

要在文件中移动而不影响文本,您必须处于命令模式(按Esc两次)。下表列出了一些可用于一次移动一个字符的命令,

S.No. 命令与说明
1

ķ

将光标向上移动一行

2

Ĵ

将光标向下移动一行

3

H

将光标移动到左侧一个字符位置

4

将光标移动到右一个字符位置

在文件中需要考虑以下几点:

  • vi区分大小写。使用命令时需要注意大小写。

  • vi中的大多数命令可以以您希望操作发生的次数开头。例如,2j将光标向下移动光标位置。

在vi中有很多其他的方式可以在文件中移动。请记住,您必须处于命令模式(按Esc两次)。下表列出了围绕文件移动的几个命令 -

S.No. 命令与说明
1

0或|

将光标定位在行的开头

2

$

将光标定位在行尾

3

w ^

将光标定位到下一个字

4

b

将光标定位到上一个单词

将光标定位到当前句子的开头

6

将光标定位到下一句的开头

7

Ë

移动到空白分隔词的末尾

8

{

向后移动一个段落

9

}

向前移动一个段落

10

[[

将部分移回

11

]]

向前移动一个部分

12

N |

移动到当前行中的列n

13

1G

移动到文件的第一行

14

G

移动到文件的最后一行

15

了nG

移动到文件的 n

16

:N

移动到文件的 n

17

FC

前进到c

18

FC

移动到c

19

H

Moves to the top of the screen

20

nH

Moves to the nth line from the top of the screen

21

M

Moves to the middle of the screen

22

L

Move to the bottom of the screen

23

nL

Moves to the nth line from the bottom of the screen

24

:x

Colon followed by a number would position the cursor on the line number represented by x

控制命令

以下命令可以与控制键一起使用,执行下表所示的功能:

S.No. Command & Description
1

CTRL+d

Moves forward 1/2 screen

2

CTRL+f

Moves forward one full screen

3

CTRL+u

Moves backward 1/2 screen

4

CTRL+b

Moves backward one full screen

5

CTRL+e

Moves the screen up one line

6

CTRL+y

Moves the screen down one line

7

CTRL+u

Moves the screen up 1/2 page

8

CTRL+d

Moves the screen down 1/2 page

9

CTRL+b

Moves the screen up one page

10

CTRL+f

Moves the screen down one page

11

CTRL+I

Redraws the screen

编辑文件

要编辑文件,您需要处于插入模式。从命令模式进入插入模式有很多种方法 -

S.No. 命令与说明
1

一世

在当前光标位置之前插入文本

2

一世

在当前行的开头插入文本

3

一个

在当前光标位置之后插入文本

4

一个

在当前行的末尾插入文本

Ø

为光标位置下方的文本输入创建新行

6

Ø

为光标位置上方的文本输入创建新行

删除字符

以下是重要的命令列表,可用于删除打开文件中的字符和行 -

S.No. 命令与说明
1

X

删除光标位置下的字符

2

X

删除光标位置前的字符

3

DW

从当前光标位置删除到下一个字

4

ð^

从当前光标位置删除到行的开头

D $

从当前光标位置删除到行尾

6

ð

从光标位置删除到当前行的末尾

7

DD

删除光标所在的行

如上所述,vi中的大多数命令可以以您希望操作发生的次数开始。例如,2x删除光标位置下的两个字符,2dd删除光标所在的两行。

我们建议在我们继续进行之前,实施这些命令。

更改命令

您还可以更改vi中的字符,单词或行,而不删除它们。以下是相关的命令 -

S.No. 命令与说明
1

CC

删除该行的内容,让您处于插入模式。

2

CW

更改了Word光标从光标到小写字母是W ^字的结尾。

3

[R

替换光标下的字符。vi在输入更换后返回命令模式。

4

[R

覆盖从当前光标下方的字符开始的多个字符。您必须使用Esc来停止覆盖。

小号

用您键入的字符替换当前字符。之后,您将处于插入模式。

6

小号

删除光标所在的行,并用新文本替换它。输入新文本后,vi将保持在插入模式。

复制和粘贴命令

您可以从一个地方复制行或单词,然后您可以使用以下命令将其粘贴到另一个地方 -

S.No. 命令与说明
1

YY

复制当前行。

2

YW

从字符开始复制当前单词,小写字母w开启,直到单词结尾。

3

p

将复制的文本放在光标后面。

4

P

将光标放在光标前面。

高级命令

有一些高级命令可以简化日常编辑,并可以更有效地使用vi -

S.No. Command & Description
1

J

Joins the current line with the next one. A count of j commands join many lines.

2

<<

Shifts the current line to the left by one shift width.

3

>>

Shifts the current line to the right by one shift width.

4

~

Switches the case of the character under the cursor.

5

^G

Press Ctrl and G keys at the same time to show the current filename and the status.

6

U

Restores the current line to the state it was in before the cursor entered the line.

7

u

This helps undo the last change that was done in the file. Typing \"u\" again will re-do the change.

8

J

Joins the current line with the next one. A count joins that many lines.

9

:f

Displays the current position in the file in % and the file name, the total number of file.

10

:f filename

Renames the current file to filename.

11

:w filename

Writes to file filename.

12

:e filename

Opens another file with filename.

13

:cd dirname

Changes the current working directory to dirname.

14

:e #

Toggles between two open files.

15

:n

In case you open multiple files using vi, use :n to go to the next file in the series.

16

:p

In case you open multiple files using vi, use :p to go to the previous file in the series.

17

:N

In case you open multiple files using vi, use :N to go to the previous file in the series.

18

:r file

Reads file and inserts it after the current line.

19

:nr file

Reads file and inserts it after the line n.

词和字符搜索

vi编辑器有两种搜索:字符string字符对于字符string搜索,/使用命令。当您启动这些命令时,刚刚键入的命令将显示在屏幕的最后一行,您可以在其中键入要查找的特定字符string。

这两个命令在搜索方向上有所不同 -

  • /该文件中命令搜索转发(向下)。

  • 命令在文件中向后(向上)搜索。

ÑÑ命令在相同或相反的方向上分别重复前面的搜索命令。一些字符有特殊的含义。这些字符之前必须有一个反斜杠()作为搜索表达式的一部分。

S.No. 字符和描述
1

^

在行的开始搜索(在搜索表达式的开头使用)。

2

匹配单个字符。

3

*

匹配上一个字符的零个或多个。

4

$

行结束(在搜索表达式的末尾使用)。

[

启动一组匹配或不匹配的表达式。

6

<

这被放入一个用反斜杠转义的表达式,以找到一个单词的结尾或开始。

7

>

这有助于看到上面的\" < \"字符描述。

字符搜索在一行内搜索以查找命令后输入的字符。˚F˚F命令搜索仅在当前行的文字。f向前搜索,F向后搜索,光标移动到找到的字符的位置。

Ť命令搜索在当前行的字符只,但对于,将光标移动到所述位置处的字符之前,和Ť向后搜索行的字符后的位置。

设置命令

您可以使用以下命令来更改vi屏幕的外观和设置:set命令。一旦进入命令模式,键入:set,然后执行以下命令之一。

S.No. 命令与说明
1

:设置ic

忽略搜索时的情况

2

:设置ai

设置自动缩进

3

:设置noai

取消自动缩进

4

:set nu

显示左侧行号的行

:设置sw

设置软件tabstop的宽度。例如,您可以使用此命令设置移位宽度4 :set sw = 4

6

:设置ws

如果设置了wrapscan,并且文件底部找不到该单词,那么它将开始搜索它

7

:设置wm

如果此选项的值大于零,编辑器将自动“换行”。例如,要将换行边距设置为两个字符,可以键入::set wm = 2

8

:set ro

将文件类型更改为“只读”

9

:设定术语

打印终端类型

10

:设置bf

从输入中丢弃控制字符

运行命令

vi可以在编辑器内运行命令。要运行命令,只需要进入命令模式并键入:!命令。

例如,如果要在尝试使用该文件名保存文件之前检查文件是否存在,可以键入:!ls,您将在屏幕上看到ls的输出

您可以按任意键(或命令的转义序列)返回到您的vi会话。

替换文字

替换命令(:s /)使您能够快速替换文件中的单词或组。以下是替换文本的语法 -

:s/search/replace/g

代表全球。该命令的结果是光标行上的所有出现都被更改。

重要注意事项

以下几点将增加您的成功与vi -

  • 您必须使用命令模式才能使用命令。(随时按Esc两次以确保您处于命令模式。)

  • 你必须注意命令。这些区分大小写。

  • 您必须处于插入模式才能输入文本。

Unix - 什么是Shells?

一个壳牌为您提供了Unix系统的接口。它收集您的输入,并根据该输入执行程序。程序完成执行时,显示该程序的输出。

Shell是一个可以运行命令,程序和shell脚本的环境。有不同口味的shell,就像有不同口味的操作系统一样。每种风味的shell都有自己的一套识别的命令和功能。

外壳提示

提示符$(称为命令提示符)由shell发出。显示提示时,可以键入命令。

Enter键后,Shell会读取您的输入它通过查看输入的第一个单词来确定要执行的命令。一个字是一套不间断的字符。空格和制表符分开单词。

以下是date命令的简单示例,显示当前的日期和时间 -

$date
Thu Jun 25 08:30:19 MST 2009

您可以使用环境教程中说明的环境变量PS1自定义命令提示符。

外壳类型

在Unix中,有两种主要类型的shell -

  • Bourne shell - 如果使用Bourne类型的shell,$ character是默认提示符。

  • C shell - 如果使用C型shell,则%字符是默认提示。

Bourne Shell有以下子类别 -

  • Bourne shell(sh)
  • Korn shell(ksh)
  • Bourne再次shell(bash)
  • POSIX shell(sh)

不同的C型壳跟随 -

  • C shell(csh)
  • TENEX / TOPS C shell(tcsh)

原来的Unix shell是由Stephen R. Bourne在20世纪70年代中期在新泽西AT&T贝尔实验室写的。

Bourne shell是出现在Unix系统上的第一个shell,因此它被称为“shell”。

Bourne shell通常作为/ bin / sh安装在大多数Unix版本上。为此,它是可以在不同版本的Unix上编写脚本的首选shell。

在本章中,我们将介绍基于Borne Shell的大部分Shell概念。

Shell脚本

shell脚本的基本概念是按照执行顺序列出的命令列表。一个良好的shell脚本会有意见,前面加符号,描述的步骤。

有条件测试,例如值A大于值B,循环允许我们通过大量数据,文件读取和存储数据,以及变量来读取和存储数据,并且脚本可能包括函数。

我们将在下一节中编写许多脚本。这将是一个简单的文本文件,其中我们将把我们的所有命令和其他几个必需的结构告诉shell环境做什么,什么时候做。

Shell脚本和函数都被解释。这意味着它们没有被编译。

示例脚本

假设我们创建一个test.sh脚本。注意所有的脚本都有.sh扩展名。在您向脚本添加任何其他内容之前,您需要提醒系统正在启动shell脚本。这是使用shebang构造完成的。例如 -

#!/bin/sh

这告诉系统,以下命令将由Bourne shell执行。它被称为shebang,因为符号被称为哈希,而!符号被称为爆炸声

要创建一个包含这些命令的脚本,首先放置shebang行,然后添加命令 -

#!/bin/bash
pwd
ls

壳注释

您可以按照以下方式将您的意见放在脚本中:

#!/bin/bash

# Author : Zara Ali
# Copyright (c) Tutorialspoint.com
# Script follows here:
pwd
ls

保存上述内容并使脚本可执行 -

$chmod +x test.sh

shell脚本现在可以执行了 -

$./test.sh

执行后,您将收到以下结果 -

/home/amrood
index.htm  unix-basic_utilities.htm  unix-directories.htm  
test.sh    unix-communication.htm    unix-environment.htm

- 要执行当前目录中可用的程序,请使用./program_name

扩展Shell脚本

Shell脚本有几个必需的结构,告诉shell环境该怎么做,什么时候做。当然,大多数脚本比上述更复杂。

毕竟,shell是一个真正的编程语言,包含变量,控制结构等等。无论脚本得到多么复杂,它仍然只是顺序执行的命令列表。

以下脚本使用读取命令,该命令接受来自键盘的输入,并将其分配为变量PERSON的值,最后将其打印在STDOUT上。

#!/bin/sh

# Author : Zara Ali
# Copyright (c) Tutorialspoint.com
# Script follows here:

echo "What is your name?"
read PERSON
echo "Hello, $PERSON"

这是脚本的示例运行 -

$./test.sh
What is your name?
Zara Ali
Hello, Zara Ali
$

Unix - 使用Shell变量

在本章中,我们将学习如何在Unix中使用Shell变量。一个变量是我们分配一个值的字符string。分配的值可以是数字,文本,文件名,设备或任何其他类型的数据。

一个变量只不过是一个指向实际数据的指针。该shell可以创建,分配和删除变量。

变量名称

变量的名称只能包含字母(a到z或A到Z),数字(0到9)或下划线字符(_)。

按照惯例,Unix shell变量将在UPPERCASE中具有它们的名称。

以下示例是有效的变量名称 -

_ALI
TOKEN_A
VAR_1
VAR_2

以下是无效变量名称的示例 -

2_VAR
-VARIABLE
VAR1-VAR2
VAR_A!

你不能使用其他字符的原因,如*-是这些字符对shell有特殊的含义。

定义变量

变量定义如下 -

variable_name=variable_value

例如 -

NAME="Zara Ali"

上面的例子定义了变量NAME,并赋值为“Zara Ali”。这种类型的变量称为标量变量标量变量一次只能保存一个值。

Shell使您可以在变量中存储所需的任何值。例如 -

VAR1="Zara Ali"
VAR2=100

访问值

要访问存储在变量中的值,请将其名称加上美元符号($) -

例如,以下脚本将访问定义的变量NAME的值并在STDOUT上打印 -

#!/bin/sh

NAME="Zara Ali"
echo $NAME

上述脚本将产生以下值 -

Zara Ali

只读变量

Shell提供了一种通过使用只读命令将变量标记为只读的方式。变量标记为只读后,其值不能更改。

例如,以下脚本在尝试更改NAME的值时会生成错误 -

#!/bin/sh

NAME="Zara Ali"
readonly NAME
NAME="Qadiri"

上述脚本将产生以下结果 -

/bin/sh: NAME: This variable is read only.

取消变量

取消设置或删除变量会引导shell从其跟踪的变量列表中删除变量。一旦您取消设置变量,就无法访​​问变量中存储的值。

以下是使用unset命令取消设置定义的变量的语法-

unset variable_name

上述命令取消定义变量的值。这是一个简单的例子,演示命令的工作原理 -

#!/bin/sh

NAME="Zara Ali"
unset NAME
echo $NAME

上面的例子不打印任何东西。您不能使用unset命令来取消设置标记为只读的变量

变量类型

当shell运行时,存在三种主要类型的变量 -

  • 局部变量 -一个局部变量是一个变量,它是在外壳的当前实例中存在。它不适用于由shell启动的程序。它们在命令提示符下设置。

  • 环境变量 - 环境变量可用于shell的任何子进程。一些程序需要环境变量才能正常运行。通常,shell脚本仅定义运行的程序需要的那些环境变量。

  • Shell变量 - 一个shell变量是由shell设置的特殊变量,由shell要求才能正常运行。这些变量中的一些是环境变量,而其他变量是局部变量。

Unix - 特殊变量

在本章中,我们将详细探讨Unix中的特殊变量。在我们之前的章节中,我们了解了如何在变量名中使用某些非字母数字字符时要小心。这是因为这些字符用于特殊Unix变量的名称。这些变量为特定功能保留。

例如,$ character表示当前shell的进程ID号或PID,

$echo $$

上述命令写入当前shell的PID -

29949

下表显示了您可以在shell脚本中使用的许多特殊变量 -

S.No. 变量和说明
1

$ 0

当前脚本的文件名。

2

$ N

这些变量对应于调用脚本的参数。这里n是对应于参数位置的正十进制数(第一个参数为$ 1,第二个参数为$ 2,依此类推)。

3

$#

提供给脚本的参数数。

4

$ *

所有参数都是双引号。如果一个脚本收到两个参数,$ *相当于$ 1 $ 2。

$ @

所有的论据都是单引号。如果一个脚本收到两个参数,$ @相当于$ 1 $ 2。

6

$?

执行最后一个命令的退出状态。

7

$$

当前shell的进程号。对于shell脚本,这是它们正在执行的进程ID。

8

$!

最后一个背景命令的进程号。

命令行参数

命令行参数$ 1,$ 2,$ 3,... $ 9是位置参数,$ 0指向实际的命令,程序,shell脚本或函数,$ 1,$ 2,$ 3,... $ 9作为参数命令。

以下脚本使用与命令行相关的各种特殊变量 -

#!/bin/sh

echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

以下是上述脚本的运行示例 -

$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2

特殊参数$ *和$ @

有一些特殊参数允许一次访问所有的命令行参数。$ *$ @两者都会相同,除非它们被双引号括起来,“”

这两个参数都指定了命令行参数。但是,“$ *”特殊参数将整个列表作为一个参数,空格之间具有空格,“$ @”特殊参数将整个列表分成独立的参数。

我们可以编写shell脚本,如下所示,使用$ *或$ @特殊参数来处理未知数量的命令行参数 -

#!/bin/sh

for TOKEN in $*
do
   echo $TOKEN
done

以下是上述脚本的运行示例 -

$./test.sh Zara Ali 10 Years Old
Zara
Ali
10
Years
Old

注意 - 这里做...完成是一种循环,将在后续教程中介绍。

退出状态

$?变量表示上一个命令的退出状态。

退出状态是每个命令完成后返回的数值。通常,大多数命令如果成功,返回退出状态为0,如果失败则返回1。

某些命令出于特殊原因返回额外的退出状态。例如,一些命令区分错误种类,并将根据具体的故障类型返回各种退出值。

以下是成功命令的例子 -

$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$echo $?
0
$

Unix - 使用Shell数组

在本章中,我们将探讨如何在Unix中使用shell数组。一个shell变量足以容纳一个值。这些变量称为标量变量。

Shell支持一种称为数组变量的不同类型的变量这可以同时保存多个值。数组提供了对一组变量进行分组的方法。您可以使用单个数组变量来存储所有其他变量,而不是为所需的每个变量创建一个新名称。

所有关于Shell变量探讨的命名规则都适用于命名数组。

定义数组值

数组变量和标量变量之间的区别可以解释如下。

假设您正在尝试将各种学生的名称作为一组变量来表示。每个变量都是一个标量变量,如下所示:

NAME01="Zara"
NAME02="Qadir"
NAME03="Mahnaz"
NAME04="Ayan"
NAME05="Daisy"

我们可以使用单个数组来存储上述所有的名称。以下是创建数组变量的最简单的方法。这有助于将值分配给其中一个索引。

array_name[index]=value

这里array_name是数组的名称,index是要设置的数组中的项目的索引,value是要为该项目设置的值。

作为示例,以下命令 -

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"

如果使用ksh shell,这里是数组初始化的语法 -

set -A array_name value1 value2 ... valuen

如果你使用的是bash shell,这里是数组初始化的语法 -

array_name = (value1 ... valuen)

访问数组值

设置任何数组变量后,可以按如下方式进行访问:

${array_name[index]}

这里array_name是数组的名称,index是要访问的值的索引。以下是了解概念的一个例子 -

#!/bin/sh

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"

上面的例子将产生以下结果 -

$./test.sh
First Index: Zara
Second Index: Qadir

您可以通过以下方法之一访问数组中的所有项目:

${array_name[*]}
${array_name[@]}

这里array_name是您感兴趣的数组的名称。以下示例将帮助您了解概念 -

#!/bin/sh

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"

上面的例子将产生以下结果 -

$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy

Unix - Shell基本操作符

每个shell都支持各种操作。我们将在本章中详细探讨Bourne shell(默认shell)。

我们现在将探讨以下运算符 -

  • 算术运算符
  • 关系运算符
  • 布尔运算符
  • 字符string运算符
  • 文件测试运算符

Bourne shell最初没有任何机制来执行简单的算术运算,但是它使用外部程序awkexpr

以下示例显示如何添加两个数字 -

#!/bin/sh

val=`expr 2 + 2`
echo "Total value : $val"

上述脚本将产生以下结果 -

Total value : 4

在添加时需要考虑以下几点:

  • 运算符和表达式之间必须有空格。例如,2 + 2是不正确的; 应该写成2 + 2。

  • 完整的表达式应该包含在\"\"之间,称为反向逗号。

算术运算符

Bourne Shell支持以下算术运算符。

假设变量a保持10,变量b保持20,则 -

显示示例

操作者 描述
+(加法) 在操作符的两边添加值 “expr $ a + $ b”将给予30
- (减法) 从左手操作数减去右手操作数 `expr $ a - $ b`会给-10
*(乘法) 在运算符的任一侧乘以值 `expr $ a * $ b`会给予200
/(司) 用右手操作数除左手操作数`expr $ b / $ a`将给出2
%(模量) 用右手操作数除数左手操作数并返回余数 `expr $ b%$ a`会给0
=(作业) 在左操作数中分配右操作数 a = $ b将b的值分配给a
==(平等) 比较两个数字,如果两者相同,则返回true。 [$ a == $ b]将返回false。
!=(不平等) 比较两个数字,如果两者都不同,则返回true。 [$ a!= $ b]将返回true。

了解所有条件表达式应该在它们周围空间的方括号内,这是非常重要的,例如[$ a == $ b]是正确的,而[$ a == $ b]不正确。

所有的算术计算都是使用长整数进行的。

关系运算符

Bourne Shell支持特定于数值的以下关系运算符。这些操作符不适用于字符string值,除非它们的值为数字。

例如,以下运算符将努力检查10到20之间以及“10”和“20”之间的关系,但不在“十”和“二十”之间。

假设变量a保持10,变量b保持20,则 -

显示示例

操作者 描述
当量 检查两个操作数的值是否相等; 如果是,则条件成立。 [$ a -eq $ b]不正确。
-ne 检查两个操作数的值是否相等; 如果值不相等,则条件成立。 [$ a -ne $ b]是真的。
-gt 检查左操作数的值是否大于右操作数的值; 如果是,则条件成立。 [$ a -gt $ b]不正确。
-lt 检查左操作数的值是否小于右操作数的值; 如果是,则条件成立。 [$ a -lt $ b]是真的。
-ge 检查左操作数的值是否大于或等于右操作数的值; 如果是,则条件成立。 [$ a -ge $ b]不正确。
-le 检查左操作数的值是否小于或等于右操作数的值; 如果是,则条件成立。 [$ a -le $ b]是真的。

了解所有的条件表达式应该放置在方括号内的方括号中是非常重要的。例如,[$ a <= $ b]正确,而[$ a <= $ b]不正确。

布尔运算符

Bourne Shell支持以下布尔运算符。

假设变量a保持10,变量b保持20,则 -

显示示例

操作者 描述
这是逻辑否定。这将真实条件反转为假,反之亦然。 [!假]是真的。
-o 这是逻辑OR如果其中一个操作数为真,则条件成立。 [$ a -lt 20 -o $ b -gt 100]是真的。
-一个 这是逻辑AND如果两个操作数都为真,则条件成为true,否则为false。 [$ a -lt 20 -a $ b -gt 100]为假。

字符string运算符

Bourne Shell支持以下字符string运算符。

假设变量a保持“abc”,变量b保持“efg”然后 -

显示示例

操作者 描述
= 检查两个操作数的值是否相等; 如果是,则条件成立。 [$ a = $ b]不正确。
!= 检查两个操作数的值是否相等; 如果值不等于条件成立。 [$ a!= $ b]是真的。
-z 检查给定的字符string操作数大小是否为零; 如果是零长度,则返回true。 [-z $ a]不正确。
-n 检查给定的字符string操作数大小是否为零; 如果它是非零长度,则返回true。 [-n $ a]不是虚假的。
海峡 检查str是否不是空字符string; 如果为空,则返回false。 [$ a]不是假的。

文件测试运算符

我们有一些操作符可用于测试与Unix文件相关联的各种属性。

假设一个变量文件保存现有的文件名“test”,其大小为100个字节,并具有读取写入执行权限,

显示示例

操作者 描述
-b文件 检查文件是否是块专用文件; 如果是,则条件成立。 [-b $ file]为false。
-c文件 检查文件是否是一个字符特殊文件; 如果是,则条件成立。 [-c $ file]为false。
-d文件 检查文件是否是目录; 如果是,则条件成立。 [-d $ file]不正确。
-f文件 检查文件是否是普通文件,而不是目录或特殊文件; 如果是,则条件成立。 [-f $ file]是true。
-g文件 检查文件是否设置了组ID(SGID)位; 如果是,则条件成立。 [-g $ file]为false。
-k文件 检查文件是否具有其粘性位设置; 如果是,则条件成立。 [-k $ file]为false。
-p文件 检查文件是否是命名管道; 如果是,则条件成立。 [-p $ file]为false。
-t文件 检查文件描述符是否打开并与终端相关联; 如果是,则条件成立。 [-t $ file]为false。
-u文件 检查文件是否设置了其设置用户ID(SUID)位; 如果是,则条件成立。 [-u $ file]为false。
-r文件 检查文件是否可读; 如果是,则条件成立。 [-r $ file]是true。
-w文件 检查文件是否可写入; 如果是,则条件成立。 [-w $ file]是true。
-x文件 检查文件是否可执行; 如果是,则条件成立。 [-x $ file]是true。
-s文件 检查文件的大小是否大于0; 如果是,则条件变为真。 [-s $ file]是true。
-e文件 检查文件是否存在; 即使文件是目录而是存在也是如此。 [-e $ file]是真的。

C壳牌运算符

以下链接将为您简要介绍C Shell Operators -

C壳牌运算符

Korn壳牌运算符

以下链接可以帮助您了解Korn Shell运算符 -

Korn壳牌运算符

Unix - Shell判断

在本章中,我们将了解Unix中的shell判断。在编写一个shell脚本时,可能会出现一种情况,当您需要从给定的两个路径中选择一个路径时。所以你需要使用条件语句,让你的程序做出正确的决定并执行正确的操作。

Unix Shell支持用于根据不同条件执行不同操作的条件语句。我们现在将在这里了解两个判断声明 -

  • IF ... ELSE语句

  • 情况下... ESAC声明

if ... else语句

如果else语句是有用的判断语句,可用于从给定的一组选项中选择一个选项。

Unix Shell支持以下形式if ... else语句 -

大多数if语句使用上一章探讨的关系运算符检查关系。

case ... esac语句

您可以使用多个if ... elif语句来执行多路分支。然而,这并不总是最好的解决方案,特别是当所有分支依赖于单个变量的值时。

Unix Shell支持case ... esac语句,它正好处理这种情况,并且如果... elif语句,它比重复执行的效率更高。

只有一种形式的case ... esac语句已在此详细描述 -

情况下... ESAC在Unix外壳语句很相似,switch...情况下,我们必须像其他编程语言的语句çC ++PERL等。

Unix - Shell循环类型

在本章中,我们将探讨Unix中的shell循环。循环是一个强大的编程工具,可以重复执行一组命令。在本章中,我们将检查shell程序员可用的以下类型的循环 -

您将根据情况使用不同的循环。例如,while循环执行给定的命令,直到给定的条件保持为真; 直到循环执行,直到给定的条件为真。

一旦你有良好的编程实践,你将获得专业知识,从而根据情况开始使用适当的循环。在这里,whilefor循环可用于大多数其他编程语言,如CC ++PERL等。

嵌套循环

所有的循环支持嵌套概念,这意味着您可以将一个循环放在另一个相似的一个或不同循环中。根据您的要求,此嵌套可以达到无限次。

这是一个嵌套while循环的例子其他循环可以基于编程要求以类似的方式嵌套 -

在循环中嵌套

可以使用while循环作为另一个while循环体的一部分。

用法

while command1 ; # this is loop1, the outer loop
do
   Statement(s) to be executed if command1 is true

   while command2 ; # this is loop2, the inner loop
   do
      Statement(s) to be executed if command2 is true
   done

   Statement(s) to be executed if command1 is true
done

这是一个循环嵌套的简单示例。我们在循环中添加一个倒数循环,你以前计数到九个 -

#!/bin/sh

a=0
while [ "$a" -lt 10 ]    # this is loop1
do
   b="$a"
   while [ "$b" -ge 0 ]  # this is loop2
   do
      echo -n "$b "
      b=`expr $b - 1`
   done
   echo
   a=`expr $a + 1`
done

输出结果如下。重要的是要注意echo -n在这里的工作原理。这里-n选项允许echo避免打印新的行字符。

0
1 0
2 1 0
3 2 1 0
4 3 2 1 0
5 4 3 2 1 0
6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0

Unix - Shell循环控制

在本章中,我们将探讨Unix中的shell循环控制。到目前为止,您已经看到创建循环并使用循环来完成不同的任务。有时您需要停止循环或跳过循环的迭代。

在本章中,我们将学习以下两个用于控制shell循环的语句 -

  • 声明

  • 继续发言

无限循环

所有的循环都有一个有限的使用寿命,一旦条件为false或者根据循环,它们就会出现。

如果不满足要求的条件,循环可能会永久持续。永远执行而不终止执行无限次的循环。因此,这种循环称为无限循环。

这是一个简单的例子,它使用while循环显示零到九的数字 -

#!/bin/sh

a=10

until [ $a -lt 10 ]
do
   echo $a
   a=expr $a + 1`
done

此循环永远持续,因为a始终大于等于10,并且永远不会小于10。

休息声明

休息语句用于终止整个循环的执行,完成所有的代码行的执行到break语句之后。然后在循环结束之后,逐步降低代码。

用法

以下的break语句被用来摆脱一个循环 -

break

break命令也可以用于使用此格式退出嵌套循环 -

break n

这里n指定出口的 n 包围循环。

下面是一个简单的例子,其示出了环路尽快终止为一个变为5 -

#!/bin/sh

a=0

while [ $a -lt 10 ]
do
   echo $a
   if [ $a -eq 5 ]
   then
      break
   fi
   a=`expr $a + 1`
done

执行后,您将收到以下结果 -

0
1
2
3
4
5

这是嵌套for循环的一个简单示例。如果var1等于2,并且var2等于0则这个脚本会断开两个循环-

#!/bin/sh

for var1 in 1 2 3
do
   for var2 in 0 5
   do
      if [ $var1 -eq 2 -a $var2 -eq 0 ]
      then
         break 2
      else
         echo "$var1 $var2"
      fi
   done
done

执行后,您将收到以下结果。在内部循环中,您有一个带有参数2的break命令。这表示如果满足条件,则应该从外部循环中脱离出来,最终也从内部循环中脱离出来。

1 0
1 5

继续声明

继续语句是类似休息命令,但是它会导致循环的当前迭代退出,而不是整个循环。

当发生错误但是您想尝试执行循环的下一个迭代时,此语句很有用。

用法

continue

与break语句一样,可以向continue命令给出整数参数,以从嵌套循环中跳过命令。

continue n

这里n指定第n 包围循环继续。

以下循环使用从continue语句返回的continue语句,并开始处理下一条语句 -

#!/bin/sh

NUMS="1 2 3 4 5 6 7"

for NUM in $NUMS
do
   Q=`expr $NUM % 2`
   if [ $Q -eq 0 ]
   then
      echo "Number is an even number!!"
      continue
   fi
   echo "Found odd number"
done

执行后,您将收到以下结果 -

Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number

Unix - 壳牌替换

什么是替代?

当shell遇到包含一个或多个特殊字符的表达式时,shell将执行替换。

这里,变量的打印值由其值代替。同时,“ n”被新行代替 -

#!/bin/sh

a=10
echo -e "Value of a is $a 
"

您将收到以下结果。这里使用-e选项可以解释反斜杠转义。

Value of a is 10

以下是没有-e选项的结果-

Value of a is 10

以下是可以在echo命令中使用的转义序列 -

S.No. 逃避说明
1

\

反斜线

2

一个

警报(BEL)

3

b

退格

4

C

禁止尾随的换行符

F

表单Feed

6

n

新队

7

r

回车

8

t

水平标签

9

符 v

垂直标签

您可以使用-E选项禁用反斜杠转义的解释(默认)。

您可以使用-n选项禁用插入新行。

命令替代

命令替换是shell执行给定的一组命令的机制,然后将其输出替换为命令的位置。

用法

当命令给出时执行命令替换 -

`command`

执行命令替换时,请确保使用反引号,而不是单引号。

命令替换通常用于将命令的输出分配给变量。以下每个示例演示了命令替换 -

#!/bin/sh

DATE=`date`
echo "Date is $DATE"

USERS=`who | wc -l`
echo "Logged in user are $USERS"

UP=`date ; uptime`
echo "Uptime is $UP"

执行后,您将收到以下结果 -

Date is Thu Jul  2 03:59:57 MST 2009
Logged in user are 1
Uptime is Thu Jul  2 03:59:57 MST 2009
03:59:57 up 20 days, 14:03,  1 user,  load avg: 0.13, 0.07, 0.15

变量替代

变量替换使shell程序员能够根据其状态来操纵变量的值。

以下是所有可能的替换的下表:

S.No. 表格和说明
1

$ {VAR}

替换var的值

2

$ {VAR:-word}

如果VAR为空或取消,代替变种var的值不会改变。

3

$ {VAR:=词}

如果var为null或未设置,则将var设置为word的值

4

$ {VAR:消息}

如果var为null或未设置,消息将打印到标准错误。这检查变量设置是否正确。

$ {VAR:+词}

如果VAR设置,代替变种。var的值不会改变。

以下是显示上述替代的各种状态的示例:

#!/bin/sh

echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"

echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"

unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"

var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"

echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"

执行后,您将收到以下结果 -

Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set

3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix

Unix - Shell引用机制

在本章中,我们将详细探讨壳引用机制。我们将首先探讨元字符。

元字符

Unix Shell提供了在任何Shell脚本中使用它们时具有特殊含义的各种元字符,并引起终止一个单词,除非引用。

例如,与单个字符匹配,同时列出目录中的文件,*匹配多个字符。以下是大部分shell特殊字符(也称为元字符)的列表 -

* ? [ ] \" "  $ ; & ( ) | ^ < > new-line space tab

的字符可能被引用(即,由放置本身)通过用它前面

以下示例显示如何打印*-

#!/bin/sh

echo Hello; Word

执行后,您将收到以下结果 -

Hello
./test.sh: line 2: Word: command not found

shell returned 127

让我们现在尝试使用引用的字符 -

#!/bin/sh

echo Hello; Word

执行后,您将收到以下结果 -

Hello; Word

$符号是元字符之一,所以它必须被引用,以避免外壳特殊处理-

#!/bin/sh

echo "I have $1200"

执行后,您将收到以下结果 -

I have $1200

下表列出了四种引用形式 -

S.No. 报价和说明
1

单引号

这些引号之间的所有特殊字符都失去了特殊的含义。

2

双引号

这些引号之间的大多数特殊字符都会失去其特殊的含义,

  • $
  • `
  • $
  • \
3

反斜杠

反斜杠后面的任何字符都会失去其特殊含义。

4

返回报价

返回引号之间的任何内容都将被视为一个命令,并被执行。

单行情

考虑一个包含许多特殊shell字符的echo命令 -

echo <-$1500.**>; (update?) [y|n]

在每个特殊字符之前放置反斜杠是乏味的,使线条难以阅读 -

echo <-$1500.**>; (update?) [y|n]

有一个简单的方法来引用一大群人物。在字符string的开头和结尾放一个单引号(\")

echo \"<-$1500.**>; (update?) [y|n]\"

单引号中的字符被引用,就好像反斜杠在每个字符前面一样。这样,echo命令以正确的方式显示。

如果单个引号出现在要输出的字符string中,则不应将整个字符string放在单引号内,而应该使用反斜杠(),如下所示:

echo \"It\"s Shell Programming\"

双引号

尝试执行以下shell脚本。这个shell脚本使用单引号 -

VAR=ZARA
echo \"$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]\"

执行后,您将收到以下结果 -

$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]

这不是必须显示的。很明显,单引号可以防止变量替换。如果要替换变量值并使反向逗号正常工作,那么您需要将命令放在双引号中,如下所示:

VAR=ZARA
echo "$VAR owes <-$1500.**>; [ as of (`date +%m/%d`) ]"

执行后,您将收到以下结果 -

ZARA owes <-$1500.**>; [ as of (07/02) ]

双引号除去以下所有字符的特殊含义 -

  • $用于参数替换

  • 命令替换的反引号

  • $启用文字美元符号

  • `来启用文字反引号

  • 启用嵌入式双引号

  • \启用嵌入式反斜杠

  • 所有其他字符都是文字(不是特别的)

单引号中的字符被引用,就好像反斜杠在每个字符前面一样。这有助于echo命令正常显示。

如果单个引号出现在要输出的字符string中,则不应将整个字符string放在单引号内,而应该使用反斜杠(),如下所示:

echo \"It\"s Shell Programming\"

背面

将任何Shell命令放在反引号之间执行命令。

用法

以下是将Shell 命令放在反引号之间的简单语法-

用法

var = `command`

日期命令在下面的示例中执行,并且所产生的结果被存储在DATA变量。

DATE=`date`

echo "Current Date: $DATE"

执行后,您将收到以下结果 -

Current Date: Thu Jul  2 05:28:45 MST 2009

Unix - Shell输入/输出重定向

在本章中,我们将详细探讨Shell输入/输出重定向。大多数Unix系统命令从您的终端接收输入,并将结果输出发回您的终端。命令通常从标准输入读取其输入,默认情况下它是您的终端。类似地,命令通常将其输出写入标准输出,默认情况下它也是终端。

输出重定向

通常用于标准输出的命令的输出可以轻松地转移到文件。此功能称为输出重定向。

如果符号>文件附加到通常将其输出写入标准输出的任何命令,则该命令的输出将被写入文件而不是终端。

检查以下who命令将用户文件中的命令的完整输出重定向。

$ who > users

请注意,终端没有输出。这是因为输出已经从默认标准输出设备(终端)重定向到指定的文件。您可以检查用户文件的完整内容 -

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

如果命令的输出重定向到一个文件,并且该文件已经包含一些数据,则该数据将丢失。考虑以下示例 -

$ echo line 1 > users
$ cat users
line 1
$

您可以使用>>运算符将输出附加到现有文件中,如下所示:

$ echo line 2 >> users
$ cat users
line 1
line 2
$

输入重定向

正如命令的输出可以重定向到文件一样,命令的输入也可以从文件重定向。由于大于字符>用于输出重定向,少于字符<用于重定向命令的输入。

通常从标准输入输入的命令可以以这种方式从文件中重定向其输入。例如,要计算上面生成的文件用户的行数,可以执行以下命令:

$ wc -l users
2 users
$

执行后,您将收到以下输出。您可以通过从文件用户重定向wc命令的标准输入来计算文件中的行数-

$ wc -l < users
2
$

请注意,两种形式的wc命令产生的输出有差异。在第一种情况下,用行计数列出文件用户的名称; 在第二种情况下,它不是。

在第一种情况下,wc知道它正在从文件用户读取其输入。在第二种情况下,它只知道它正在从标准输入读取其输入,因此它不显示文件名。

这里文件

一个here文档用于输入重定向到一个交互的shell脚本或程序。

我们可以通过提供交互式程序或交互式shell脚本所需的输入,在shell脚本中运行交互式程序,无需用户操作。

对于一般形式在这里的文件是-

command << delimiter
document
delimiter

这里,shell将<<操作符解释为读取输入的指令,直到找到包含指定分隔符的行。直到包含分隔符的行的所有输入行然后被馈送到该命令的标准输入。

分界符告诉了壳在这里的文件已经完成。没有它,shell将永远读取输入。分隔符必须是不包含空格或制表符的单个单词。

以下是输入命令wc -l以计算总行数 -

$wc -l << EOF
   This is a simple lookup program 
	for good (and bad) restaurants
	in Cape Town.
EOF
3
$

您可以使用这里的文档使用脚本打印多行,如下所示:

#!/bin/sh

cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF	

执行后,您将收到以下结果 -

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

以下脚本使用vi文本编辑器运行会话,并将输入保存在文件test.txt中

#!/bin/sh

filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

如果您使用vim作为vi运行此脚本,那么您可能会看到如下所示的输出 -

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

运行脚本之后,您应该看到以下内容添加到文件test.txt中 -

$ cat test.txt
This file was created automatically from
a shell script
$

舍弃输出

有时你需要执行一个命令,但是你不希望在屏幕上显示输出。在这种情况下,您可以将输出重定向到文件/ dev / null -

$ command > /dev/null

这里的命令是要执行的命令的名称。文件/ dev / null是一个特殊文件,可以自动丢弃所有的输入。

要丢弃命令的输出及其错误输出,请使用标准重定向将STDERR重定向STDOUT -

$ command > /dev/null 2>&1

这里2表示STDERR1表示STDOUT您可以通过将STDOUT重定向到STDERR来显示一条消息到STDERR,如下所示:

$ echo message 1>&2

重定向命令

以下是可用于重定向的完整命令列表 -

S.No. 命令与说明
1

pgm>文件

pgm的输出被重定向到文件

2

pgm <文件

程序pgm从文件读取其输入

3

pgm >>文件

pgm的输出附加到文件

4

n>文件

来自具有描述符n的流的输出重定向到文件

n >>文件

从描述符n附加到文件的流的输出

6

n>&m

将流n的输出与流m合并

7

n <&m

将流n的输入与流m合并

8

<<标签

标准输入从这里开始通过下一个标签

9

|

从一个程序或进程输出,并将其发送到另一个程序

注意,文件描述符0通常是标准输入(STDIN),1是标准输出(STDOUT),2是标准错误输出(STDERR)。

Unix - Shell函数

在本章中,我们将详细探讨shell函数。功能使您能够将脚本的整体功能分解成较小的逻辑子部分,然后可以在需要时执行其各自的任务。

使用函数执行重复性任务是创建代码重用的好方法这是现代面向对象编程原理的重要组成部分。

Shell函数类似于其他编程语言中的子例程,过程和函数。

创建功能

要声明一个函数,只需使用以下语法 -

function_name () { 
   list of commands
}

您的函数的名称是function_name,这是您将用于从脚本中的其他地方调用它的。功能名称后面必须括号,后跟括在括号内的命令列表。

以下示例显示了使用函数 -

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World"
}

# Invoke your function
Hello

执行后,您将收到以下输出 -

$./test.sh
Hello World

将参数传递给函数

您可以定义一个在调用该函数时接受参数的函数。这些参数将由$ 1$ 2代表,等等。

以下是我们通过两个参数ZaraAli的示例,然后我们在函数中捕获和打印这些参数。

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
}

# Invoke your function
Hello Zara Ali

执行后,您将收到以下结果 -

$./test.sh
Hello World Zara Ali

从函数返回值

如果从函数内部执行exit命令,其效果不仅仅是终止函数的执行,而且也是终止调用该函数的shell程序。

如果你只想终止函数的执行,那么有一种方法可以从定义的函数中出来。

根据情况,您可以使用返回命令从函数返回任何值,其语法如下:

return code

这里的代码可以是您在此处选择的任何内容,但显然,您应该选择在整个脚本的上下文中有意义或有用的内容。

以下函数返回值1 -

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
   return 10
}

# Invoke your function
Hello Zara Ali

# Capture value returnd by last command
ret=$?

echo "Return value is $ret"

执行后,您将收到以下结果 -

$./test.sh
Hello World Zara Ali
Return value is 10

嵌套函数

功能更有趣的特征之一是它们可以称之为自己,也可以称其他功能。称为自身的函数称为递归函数

以下示例演示了两个函数的嵌套 -

#!/bin/sh

# Calling one function from another
number_one () {
   echo "This is the first function speaking..."
   number_two
}

number_two () {
   echo "This is now the second function speaking..."
}

# Calling function one.
number_one

执行后,您将收到以下结果 -

This is the first function speaking...
This is now the second function speaking...

功能来电提示

您可以将常用的功能定义您的内部.profile文件这些定义将在您登录时可用,您可以在命令提示符下使用它们。

或者,您可以将定义分组在文件中,例如test.sh,然后通过键入以执行当前shell中的文件 -

$. test.sh

这样做会导致在test.sh中定义的函数被读取并定义到当前shell中,如下所示:

$ number_one
This is the first function speaking...
This is now the second function speaking...
$

要从shell中删除函数的定义,请使用带有.f选项的unset命令此命令也用于将变量的定义删除到shell。

$unset .f function_name

Unix - Shell手册帮助

所有的Unix命令都带有一些可选和强制性的选项。忘记这些命令的完整语法是非常常见的。

因为没有人可以记住每个Unix命令及其所有选项,所以当Unix处于开发阶段时,我们可以使用在线帮助来减轻这个权限。

Unix的帮助文件版本称为手册页如果有命令名称,并且您不确定如何使用它,那么“手册页”可帮助您了解每一步。

用法

这是一个简单的命令,可以帮助您在使用系统时获取任何Unix命令的详细信息 -

$man command

假设有一个命令要求你得到帮助; 假设你想知道pwd,那么你只需要使用以下命令 -

$man pwd

以上命令可以帮助您获取有关pwd命令的完整信息请在命令提示符下自行尝试以获取更多详细信息。

您可以使用以下命令获取man命令本身的完整详细信息-

$man man

人页部分

手册页面一般分为几个部分,通常按照手册页作者的偏好来改变。下表列出了一些常见的部分 -

S.No. 部分和说明
1

name

命令的名称

2

概要

命令的一般使用参数

3

描述

描述命令的作用

4

OPTIONS

描述命令的所有参数或选项

也可以看看

列出与手册页中的命令直接相关的其他命令或与其功能非常相似的命令

6

BUGS

解释命令或其输出中存在的任何已知问题或错误

7

例子

通常的使用示例,让读者了解如何使用命令

8

作者

手册页/命令的作者

总而言之,手册页是一个重要的资源,是在Unix系统中需要有关命令或文件的信息时的第一个研究途径。

有用的Shell命令

以下链接为您提供了最重要且非常常用的Unix Shell命令的列表。

如果您不知道如何使用任何命令,请使用手册页获取有关该命令的完整详细信息。

以下是Unix Shell - 有用命令的列表

Unix - SED的正则表达式

在本章中,我们将在Unix中详细探讨SED的正则表达式。

正则表达式是可用于描述几个字符序列的字符string。正则表达式是由几个不同的Unix的命令,包括sed的AWKgrep的,并且到更有限的程度上,VI

在这里SED代表s tream ed itor。这个面向流的编辑器专门用于执行脚本。因此,您输入的所有输入将通过并进入STDOUT,并且不会更改输入文件。

调用sed

在我们开始之前,让我们确保我们有一个/ etc / passwd文本文件的本地副本来使用sed

如前所述,sed可以通过管道向其发送数据,如下所示:

$ cat /etc/passwd | sed
Usage: sed [OPTION]... {script-other-script} [input-file]...

  -n, --quiet, --silent
                 suppress automatic printing of pattern space
  -e script, --expression = script
...............................

命令转储的内容/ etc / passwd的的sed通过管道进入的sed的模式空间。模式空间是sed用于其操作的内部工作缓冲区。

sed通用语法

以下是sed的一般语法 -

/pattern/action

这里,pattern是一个正则表达式,action是下表中给出的命令之一。如果省略了图案就像上面已经看到的那样,对每一行执执行作

包围该模式的斜杠字符(/)是必需的,因为它们用作分隔符。

S.No. 范围和说明
1

p

打印行

2

ð

删除该行

3

S /模式1 / PATTERN2 /

用pattern2代替pattern1的第一次出现

用sed删除所有行

现在我们将了解如何使用sed删除所有行。再次调用sed 但战略经济对话现在应该使用编辑命令来删除行,由单字母表示ð -

$ cat /etc/passwd | sed \"d\"
$

可以通过管道向其发送文件而不是调用sed,而是可以指示sed从文件读取数据,如下例所示。

以下命令与上一个示例完全相同,没有cat命令 -

$ sed -e \"d\" /etc/passwd
$

sed地址

sed还支持地址。地址是文件中的特定位置或应用特定编辑命令的范围。当sed遇到没有地址时,它会对文件中的每一行执行操作。

以下命令为您使用的sed命令添加了一个基本地址 -

$ cat /etc/passwd | sed \"1d\" |more
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$

请注意,在删除编辑命令之前添加数字1 这将指示sed在文件的第一行执行编辑命令。在这个例子中,sed将删除/ etc / password的第一行,并打印文件的其余部分。

sed地址范围

现在我们将了解如何使用sed地址范围那么如果你想从文件中删除多行呢?您可以使用sed指定一个地址范围,如下所示:

$ cat /etc/passwd | sed \"1, 5d\" |more
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$

上述命令将应用于从1到5开始的所有行。这将删除前五行。

尝试以下地址范围 -

S.No. 范围和说明
1

\"4,10d\"

从4和开始直到10 被删除

2

\"10,4D”

只有 10 行被删除,因为sed不能反向工作

3

\"4 + 5D\"

这匹配文件中的第4行,删除该行,继续删除接下来的五行,然后停止删除并打印其余的

4

\"2,5!D\"

除了从第二第五开始,这会删除一切

\"1〜3d的\"

这将删除第一行,在接下来的三行中逐步删除,然后删除第四行。Sed继续应用此模式直到文件结束。

6

\"2〜2D\"

这告诉sed删除第二行,重复下一行,删除下一​​行,然后重复,直到文件结束

7

\"4,10p\"

印刷从4 到10 的行

8

\"4,D\"

这会生成语法错误

9

\"10D\"

这也会产生语法错误

注意 - 使用p操作时,应使用-n选项以避免重复行打印。检查以下两个命令之间的区别 -

$ cat /etc/passwd | sed -n \"1,3p\"

检查上述命令,而不使用-n,如下所示:

$ cat /etc/passwd | sed \"1,3p\"

替代命令

替换命令(由s表示)将用您指定的任何其他字符string替换您指定的任何字符string。

要用一个字符string替换另一个字符string,sed需要有关于第一个字符string结束位置和替换字符string开始的信息。为此,我们继续使用正斜杠(/)字符预订两个字符string

以下命令使用字符stringamrood替换字符string的一行上的第一个出现

$ cat /etc/passwd | sed \"s/root/amrood/\"
amrood:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
..........................

非常重要的是注意到,sed仅替代了一行中的第一个事件。如果字符string根在一行上出现多次,只有第一个匹配将被替换。

要使sed执行全局替换,请将字母g添加到命令的末尾,如下所示:

$ cat /etc/passwd | sed \"s/root/amrood/g\"
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
...........................

替换标志

除了g标志之外,还可以传递一些其他有用的标志,您可以一次指定多个标志。

S.No. 标志和说明
1

G

替换所有比赛,而不仅仅是第一场比赛

2

仅替换 NUMBER 匹配

3

p

如果进行替换,则打印图案空间

4

w FILENAME

如果替换,则将结果写入FILENAME

我还是我

匹配不区分大小写

6

M或m

除了特殊正则表达式字符^和$的正常行为之外,此标志会使^与换行符之后的空字符string匹配,而在换行之前要匹配空字符string

使用替代字符string分隔符

假设您必须对包含正斜杠字符的字符string进行替换。在这种情况下,您可以通过在s之后提供指定的字符来指定其他分隔符

$ cat /etc/passwd | sed \"s:/root:/amrood:g\"
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh

在上面的例子中,我们使用了作为分隔符而不是斜杠/,因为我们试图搜索/ root而不是简单的根。

用空的空间替换

使用空的替换字符string来完全删除/ etc / passwd文件中的根字符string-

$ cat /etc/passwd | sed \"s/root//g\"
:x:0:0::/:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh

地址替换

如果要将字符stringsh替换为仅在第10行的静音,则可以如下指定:

$ cat /etc/passwd | sed \"10s/sh/quiet/g\"
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/quiet

同样,要做一个地址范围替换,你可以做一些类似下面的内容 -

$ cat /etc/passwd | sed \"1,5s/sh/quiet/g\"
root:x:0:0:root user:/root:/bin/quiet
daemon:x:1:1:daemon:/usr/sbin:/bin/quiet
bin:x:2:2:bin:/bin:/bin/quiet
sys:x:3:3:sys:/dev:/bin/quiet
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

从输出中可以看出,前五行的字符stringsh改为静音,但其余的行保持不变。

匹配命令

您可以使用p选项以及-n选项来打印所有匹配的行,如下所示:

$ cat testing | sed -n \"/root/p\"
root:x:0:0:root user:/root:/bin/sh
[root@ip-72-167-112-17 amrood]# vi testing
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

使用正则表达式

在匹配模式时,可以使用提供更多灵活性的正则表达式。

请检查以下示例,它与从守护程序开始的所有行匹配,然后将其删除 -

$ cat testing | sed \"/^daemon/d\"
root:x:0:0:root user:/root:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

以下是删除以sh结尾的所有行的示例

$ cat testing | sed \"/sh$/d\"
sync:x:4:65534:sync:/bin:/bin/sync

下表列出了在正则表达式中非常有用的四个特殊字符。

S.No. 字符和描述
1

^

匹配行的开始

2

$

匹配行尾

3

匹配任何单个字符

4

*

匹配上一个字符的零个或多个出现次数

[字符]

匹配char中给出的任何一个字符,其中chars是一系列字符。您可以使用 - 字符来指示一系列字符。

匹配字符

再看几个表达式来演示使用元字符例如,以下模式 -

S.No. 表达和描述
1

/ AC /

匹配包含字符string(如+ cacabcmatcha3c)的行

2

/ A * C /

匹配相同的字符string以及诸如aceyacc北极的字符string

3

/ [TT]他/

匹配字符stringThe and the

4

/ ^ $ /

匹配空白行

/^.*$/

匹配整条线,无论它是什么

6

/ * /

匹配一个或多个空格

7

/ ^ $ /

匹配空白

下表显示了一些常用的字符集 -

S.No. 套装说明
1

[AZ]

匹配单个小写字母

2

[AZ]

匹配单个大写字母

3

[A-ZA-Z]

匹配单个字母

4

[0-9]

匹配单个数字

[A-ZA-Z0-9]

匹配单个字母或数字

字符类关键字

一些特殊的关键字通常可用于正则表达式,特别是使用正则表达式的 GNU实用程序这些对于sed正则表达式非常有用,因为它们简化了事情并提高了可读性。

例如,字符a到z和字符A到Z构成一个这样的类型的具有关键字[[:alpha:]]的字符

使用字母字符类关键字,此命令仅打印/etc/syslog.conf文件中以字母表字母开头的行,

$ cat /etc/syslog.conf | sed -n \"/^[[:alpha:]]/p\"
authpriv.*                         /var/log/secure
mail.*                             -/var/log/maillog
cron.*                             /var/log/cron
uucp,news.crit                     /var/log/spooler
local7.*                           /var/log/boot.log

下表是GNU sed中可用的字符类关键字的完整列表。

S.No. 字符类和说明
1

[[:alnum:]]

字母数字[az AZ 0-9]

2

[[:α:]]

字母[az AZ]

3

[[:空白:]]

空白字符(空格或制表符)

4

[[:CNTRL:]]

控制字符

[[:数字:]]

数字[0-9]

6

[[:图形:]]

任何可见的字符(不包括空格)

7

[[:降低:]]

小写字母[az]

8

[[:打印:]]

可打印字符(非控制字符)

9

[[:PUNCT:]]

标点符号

10

[[:空间:]]

空白

11

[[:上:]]

大写字母[AZ]

12

[[:xdigit:]]

十六进制数字[0-9 af AF]

Aampersand参考

的sed元字符&代表被匹配的模式的内容。例如,说你有一个名为phone.txt的文件,其中包含以下电话号码:

5555551212
5555551213
5555551214
6665551215
6665551216
7775551217

你想要区域代码(前三位数)被括号包围,以便阅读。为此,您可以使用&符号替换字符 -

$ sed -e \"s/^[[:digit:]][[:digit:]][[:digit:]]/(&)/g\" phone.txt
(555)5551212
(555)5551213
(555)5551214
(666)5551215

(666)5551216
(777)5551217

在这个模式部分,你匹配的前3位数,然后使用你正在替换这3个数字与周围的括号

使用多个sed命令

您可以在单个sed命令中使用多个sed命令,如下所示:

$ sed -e \"command1\" -e \"command2\" ... -e \"commandN\" files

这里命令1通过commandN是前面探讨的类型的sed命令。这些命令被应用于由文件给出的文件列表中的每一行。

使用相同的机制,我们可以写上述电话号码的例子如下 -

$ sed -e \"s/^[[:digit:]]{3}/(&)/g\"   
   -e \"s/)[[:digit:]]{3}/&-/g\" phone.txt 
(555)555-1212 
(555)555-1213 
(555)555-1214 
(666)555-1215 
(666)555-1216 
(777)555-1217

注意 - 在上面的例子中,三次不再重复字符类关键字[[:digit:]],我们用 {3 }替换它,这意味着前面的正则表达式被匹配三次。我们还使用来给予换行符,并且必须在命令运行之前删除它。

返回参考

和号元字符是有用的,但更有用的是在正则表达式中定义特定区域的能力。这些特殊区域可以用作替换字符string中的参考。通过定义正则表达式的特定部分,您可以使用特殊的参考字符返回到这些部分。

要做回引用,你必须首先定义一个区域,然后再返回到该区域。要定义区域,请在每个感兴趣的区域周围插入反斜杠括号用反斜杠围绕的第一个区域由 1引用,第二个区域由 2引用,依此类推。

假设phone.txt有以下文字 -

(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(666)555-1216
(777)555-1217

尝试以下命令 -

$ cat phone.txt | sed \"s/(.*))(.*-)(.*$)/Area  
   code: 1 Second: 2 Third: 3/\" 
Area code: (555) Second: 555- Third: 1212 
Area code: (555) Second: 555- Third: 1213 
Area code: (555) Second: 555- Third: 1214 
Area code: (666) Second: 555- Third: 1215 
Area code: (666) Second: 555- Third: 1216 
Area code: (777) Second: 555- Third: 1217

注意 - 在上面的示例中,括号内的每个正则表达式将被 1 2引用我们已经用在这里给予换行。在运行命令之前应该删除这个。

Unix - 文件系统基础

文件系统是分区或磁盘上的文件的逻辑集合。分区是一个信息的容器,如果需要,可以跨越整个硬盘驱动器。

您的硬盘驱动器可以具有通常只包含一个文件系统的各种分区,例如一个存放/文件系统的文件系统或另一个包含/ home文件系统的文件系统

每个分区的一个文件系统允许不同文件系统的逻辑维护和管理。

Unix中的所有内容都被认为是一个文件,包括DVD-ROM,USB设备和软盘驱动器等物理设备。

目录结构

Unix使用分层文件系统结构,就像一个倒置的树,在文件系统的基础上使用root(/),所有其他目录从那里扩展。

Unix文件系统是具有以下属性的文件和目录的集合:

  • 它有一个根目录(/),其中包含其他文件和目录。

  • 每个文件或目录都由其名称,其驻留的目录以及通常称为inode的唯一标识符唯一标识

  • 根据惯例,根目录的索引节号为2,而lost + found目录的索引节点号为3不使用Inode编号01文件inode编号可以通过指定可见-i选项ls命令

  • 它是独立的。一个文件系统与另一个文件系统之间没有依赖关系。

这些目录具有特定目的,并且通常保存相同类型的信息以便于定位文件。以下是主要版本的Unix上存在的目录 -

S.No. 目录和说明
1

/

这是根目录,只能包含文件结构顶层所需的目录

2

/箱

这是可执行文件所在的位置。这些文件可供所有用户使用

3

的/ dev

这些是设备驱动程序

4

/等等

Supervisor目录命令,配置文件,磁盘配置文件,有效用户列表,组,以太网,主机,发送关键消息的位置

/ lib目录

包含共享库文件,有时还包含其他与内核相关的文件

6

/启动

包含用于引导系统的文件

7

/家

包含用户和其他帐户的主目录

8

到/ mnt

用于安装其他临时文件系统,如CD-ROM软驱CD-ROM驱动器和软盘驱动器分别

9

/ proc中

包含根据进程号或其他对系统动态的信息标记为文件的进程

10

/ tmp目录

保留在系统引导之间使用的临时文件

11

在/ usr

用于各种用途,可供许多用户使用。包括管理命令,共享文件,库文件等

12

/ VAR

通常包含可变长度的文件,如日志和打印文件以及可能包含可变数据量的任何其他类型的文件

13

/ sbin目录

包含二进制(可执行)文件,通常用于系统管理。例如,fdiskifconfig utlities

14

/核心

包含内核文件

浏览文件系统

现在您了解文件系统的基础知识,可以开始浏览所需的文件。以下命令用于导航系统 -

S.No. 命令与说明
1

猫文件名

显示文件名

2

cd dirname

将您移动到标识的目录

3

cp file1 file2

将一个文件/目录复制到指定的位置

4

文件名

标识文件类型(二进制,文本等)

找到文件名dir

查找文件/目录

6

头文件名

显示文件的开头

7

少文件名

从最后或开始浏览文件

8

ls dirname

显示指定目录的内容

9

mkdir dirname

创建指定的目录

10

更多的文件名

从头到尾浏览文件

11

mv file1 file2

移动文件/目录的位置或重命名

12

PWD

显示用户所在的当前目录

13

rm文件名

删除文件

14

rmdir目录名

删除目录

15

尾文件名

显示文件的结尾

16

触摸文件名

创建一个空白文件或修改现有文件或其属性

17

whereis文件名

显示文件的位置

18

哪个文件名

显示文件位于PATH中的位置

您可以使用Manpage帮助来查看此处提到的每个命令的完整语法。

df命令

管理分区空间的第一种方式是使用df(disk free)命令。命令df -k(无磁盘)以千字节显示磁盘空间使用情况,如下所示:

$df -k
Filesystem      1K-blocks      Used   Available Use% Mounted on
/dev/vzfs        10485760   7836644     2649116  75% /
/devices                0         0           0   0% /devices
$

某些目录(如/ devices)在kbytes,used和avail列中显示0,容量为0%。这些是特殊的(或虚拟)文件系统,虽然它们驻留在/下的磁盘上,但它们本身并不占用磁盘空间。

所有Unix系统上df -k输出通常相同。这是它通常包括的 -

S.No. 列和说明
1

文件系统

物理文件系统名称

2

千字节

存储介质上可用空间的总千字节数

3

用过的

所用空间的总千字节(按文件)

4

可供使用的总千字节

容量

文件占用总空间的百分比

6

镶嵌在

安装文件系统

您可以使用-h(可读取)选项以以更容易理解的符号显示大小的格式显示输出。

杜司令

杜(磁盘使用率)命令,可以指定目录,以显示在特定目录的磁盘空间使用情况。

如果要确定特定目录占用多少空间,则此命令很有帮助。以下命令显示每个目录消耗的块数。根据您的系统,单个块可能需要512字节或1千字节。

$du /etc
10     /etc/cron.d
126    /etc/default
6      /etc/dfs
...
$

-h选项使输出更容易理解-

$du -h /etc
5k    /etc/cron.d
63k   /etc/default
3k    /etc/dfs
...
$

安装文件系统

必须安装文件系统才能由系统使用。要查看系统上当前安装(可使用)的内容,请使用以下命令 -

$ mount
/dev/vzfs on / type reiserfs (rw,usrquota,grpquota)
proc on /proc type proc (rw,nodiratime)
devpts on /dev/pts type devpts (rw)
$

根据Unix惯例,/ mnt目录是临时安装(如CDROM驱动器,远程网络驱动器和软盘驱动器)所在的位置。如果需要安装文件系统,可以使用带有以下语法的mount命令 -

mount -t file_system_type device_to_mount directory_to_mount_to

例如,如果要将CD-ROM安装到目录/ mnt / cdrom,可以键入 -

$ mount -t iso9660 /dev/cdrom /mnt/cdrom

这假设您的CD-ROM设备称为/ dev / cdrom,并且您要将其安装到/ mnt / cdrom有关更多具体信息,请参阅安装手册页,或在命令行中键入mount -h以获取帮助信息。

安装后,您可以使用cd命令通过您刚刚创建的安装点导航新可用的文件系统。

卸载文件系统

要从系统卸载(删除)文件系统,请通过标识安装点或设备来使用umount命令。

例如,要卸载cdrom,请使用以下命令 -

$ umount /dev/cdrom

mount命令使您能够访问你的文件系统,但在大多数现代Unix系统中,自动安装功能,使这个过程对用户不可见的,不需要干预。

用户和组配额

用户和组配额提供了单个用户或特定组中的所有用户使用的空间量可以被限制为由管理员定义的值的机制。

配额操作大约两个限制,允许用户采取一些措施,如果磁盘块的空间或数量开始超过管理员定义的限制 -

  • 软限制 - 如果用户超过定义的限制,则有宽限期允许用户释放一些空间。

  • 硬限制 - 当达到硬限制时,无论宽限期如何,都不能分配更多文件或块。

有许多管理配额的命令 -

S.No. 命令与说明
1

配额

显示组用户的磁盘使用情况和限制

2

使用edquota

这是一个配额编辑器。可以使用此命令编辑用户或组配额

3

配额检查

扫描文件系统以进行磁盘使用,创建,检查和修复配额文件

4

setquota

这是一个命令行配额编辑器

使用quotaon

这将向系统通知应在一个或多个文件系统上启用磁盘配额

6

quotaoff

这会向系统通知一个或多个文件系统应禁用磁盘配额

7

repquota

这将打印指定文件系统的光盘使用情况和配额的摘要

您可以使用Manpage帮助来查看此处提到的每个命令的完整语法。

Unix - 用户管理

在本章中,我们将在Unix中详细探讨用户管理。

Unix系统上有三种类型的帐户 -

根帐户

这也称为超级用户,并将对系统进行完全和不受约束的控制。超级用户可以不受任何限制地运行任何命令。该用户应该被假定为系统管理员。

系统帐号

系统帐户是系统特定组件(例如邮件帐户和sshd帐户)的操作所需的帐户。这些帐户通常需要您的系统上的某些特定功能,并且对它们的任何修改可能会对系统产生不利影响。

用户帐号

用户帐户为用户和用户组提供对系统的交互式访问。一般用户通常分配给这些帐户,通常对关键系统文件和目录的访问受限。

Unix支持组帐户的概念,逻辑上分组了多个帐户。每个帐户都将是另一个组帐户的一部分。Unix组在处理文件权限和进程管理方面起着重要作用。

管理用户和组

有四个主要的用户管理文件 -

  • / etc / passwd - 保存用户帐号和密码信息。该文件保存有关Unix系统上帐户的大部分信息。

  • / etc / shadow - 保存相应帐号的加密密码。并非所有系统都支持该文件。

  • / etc / group - 此文件包含每个帐户的组信息。

  • / etc / gshadow - 此文件包含安全组帐户信息。

使用cat命令检查所有上述文件

下表列出了大多数Unix系统可用于创建和管理帐户和组的命令 -

S.No. 命令与说明
1

useradd的

将帐户添加到系统

2

usermod命令

修改帐户属性

3

则userdel

从系统中删除帐户

4

GROUPADD

将组添加到系统

groupmod

修改组属性

6

命令groupdel

从系统中删除组

您可以使用Manpage帮助来查看此处提到的每个命令的完整语法。

创建一个组

我们现在将了解如何创建一个组。为此,我们需要在创建任何帐户之前创建组,否则我们可以利用系统中的现有组。我们拥有/ etc / groups文件中列出的所有

所有默认组是系统帐户特定的组,不建议将其用于普通帐户。因此,以下是创建新组帐户的语法 -

 groupadd [-g gid [-o]] [-r] [-f] groupname

下表列出了参数 -

S.No. 选项和说明
1

-g GID

组ID的数值

2

-o

此选项允许添加具有非唯一GID的组

3

-r

该标志指示groupadd添加系统帐户

4

-F

如果指定的组已经存在,此选项将导致成功状态退出。使用-g,如果指定的GID已经存在,则选择其他(唯一)GID

GROUPNAME

要创建的实际组名

如果不指定任何参数,系统将使用默认值。

以下示例使用默认值创建开发人员组,这对于大多数管理员来说是非常可以接受的。

$ groupadd developers

修改组

要修改组,请使用groupmod语法 -

$ groupmod -n new_modified_group_name old_group_name

要将developers_2组名更改为开发人员,请键入 -

$ groupmod -n developer developer_2

以下是您如何将财务GID更改为545 -

$ groupmod -g 545 developer

删除组

现在我们将了解如何删除组。要删除现有组,您需要的是groupdel命令组名称要删除财务组,命令是 -

$ groupdel developer

这将仅删除组,而不删除与该组关联的文件。文件仍可由其所有者访问。

创建一个帐户

让我们看看如何在您的Unix系统上创建一个新帐户。以下是创建用户帐户的语法 -

useradd -d homedir -g groupname -m -s shell -u userid accountname

下表列出了参数 -

S.No. 选项和说明
1

-d homedir

指定帐户的主目录

2

-g组名

指定此帐户的组帐户

3

-m

创建主目录(如果不存在)

4

-s shell

指定此帐户的默认shell

-u userid

您可以为此帐户指定用户ID

6

用户名

要创建的实际帐户名称

如果不指定任何参数,系统将使用默认值。useradd的命令修改/ etc / passwd文件/ etc / shadow文件/ etc / group的文件,并创建一个主目录。

以下是创建一个帐户mcmohd的示例,将其主目录设置为/ home / mcmohd,该组作为开发人员该用户将会分配Korn Shell。

$ useradd -d /home/mcmohd -g developers -s /bin/ksh mcmohd

在发出上述命令之前,请确保已经有使用groupadd命令创建开发人员

创建帐户后,您可以使用passwd命令设置其密码,如下所示:

$ passwd mcmohd20
Changing password for user mcmohd20.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

当您键入passwd帐户名时,如果您是超级用户,则可以选择更改密码。否则,您可以使用相同的命令更改密码,但不指定您的帐户名称。

修改帐号

usermod命令命令,可以更改命令行的现有帐户。它使用与useradd命令相同的参数,加上-l参数,允许您更改帐户名称。

例如,要将帐户名mcmohd更改mcmohd20并相应地更改主目录,则需要发出以下命令 -

$ usermod -d /home/mcmohd20 -m -l mcmohd mcmohd20

删除一个帐户

则userdel命令可以用来删除现有用户。如果不小心使用,这是一个非常危险的命令。

只有一个参数或选项可用于命令.r,用于删除帐户的主目录和邮件文件。

例如,要删除帐户mcmohd20,请发出以下命令 -

$ userdel -r mcmohd20

如果要保留主目录进行备份,请忽略-r选项。您可以随时删除主目录。

Unix - 系统性能

在本章中,我们将详细探讨Unix系统的性能。

我们将向您介绍一些可用于监控和管理Unix系统性能的免费工具。这些工具还提供了有关如何在Unix环境中诊断和解决性能问题的指导。

Unix有以下主要资源类型需要被监视和调整 -

  • 中央处理器

  • 记忆

  • 磁盘空间

  • 通讯线路

  • I / O时间

  • 网络时间

  • 应用程序

性能组件

下表列出了占用系统时间的五个主要组件 -

S.No. 组件和说明
1

用户状态CPU

CPU花费在用户状态下运行用户程序的实际时间。它包括执行库调用所花费的时间,但不包括代表内核花费的时间

2

系统状态CPU

这是代表此程序CPU花费在系统状态的时间。所有I / O例程都需要内核服务。程序员可以通过阻止I / O传输来影响该值

3

I / O时间和网络时间

这是移动数据和维护I / O请求所花费的时间

4

虚拟内存性能

这包括上下文切换和交换

申请程序

运行其他程序的时间 - 当系统没有为这个应用程序服务时,因为另一个应用程序当前有CPU

性能工具

Unix提供以下重要工具来测量和微调Unix系统性能 -

S.No. 命令与说明
1

漂亮/ renice只能

运行具有修改的调度优先级的程序

2

netstat的

打印网络连接,路由表,接口统计信息,伪装连接和组播成员资格

3

时间

帮助时间简单的命令或资源使用

4

运行时间

这是系统负载平均

PS

报告当前进程的快照

6

vmstat的

报告虚拟内存统计信息

7

gprof的

显示呼叫图表配置文件数据

8

教授

促进流程分析

9

最佳

显示系统任务

您可以使用Manpage帮助来查看此处提到的每个命令的完整语法。

Unix - 系统日志

在本章中,我们将详细探讨Unix中的系统日志记录。

Unix系统具有非常灵活和强大的日志记录系统,可以让您记录几乎任何可以想象的内容,然后操作日志来检索所需的信息。

许多版本的Unix提供了一个名为syslog的通用日志记录工具需要记录信息的各个程序,将信息发送到syslog。

Unix syslog是一个主机可配置的统一系统日志记录工具。系统使用运行程序/ etc / syslogd/ etc / syslog的集中式系统日志记录进程

系统记录器的操作非常简单。程序将其日志条目发送到syslogd,该文件查询配置文件/etc/syslogd.conf/ etc / syslog,当发现匹配时,将日志消息写入所需的日志文件。

你应该了解四个基本的syslog术语,

S.No. 期限和描述
1

设施

用于描述提交日志消息的应用程序或进程的标识符。例如,邮件,内核和ftp。

2

优先

消息的重要性的指标。级别在syslog中定义为从调试信息到关键事件的指导。

3

选择

一个或多个设施和级别的组合。当传入事件与选择器匹配时,将执行一个操作。

4

执行

与选择器匹配的传入消息会发生什么 - 操作可以将消息写入日志文件,将消息回显到控制台或其他设备,将消息写入登录的用户,或将消息发送到另一个syslog服务器。

Syslog设施

我们现在将了解到syslog设施。以下是选择器的可用设施。所有版本的Unix都不存在所有的设施。

设施 描述
1

AUTH

与请求名称和密码有关的活动(getty,su,login)

2

authPriv时

与验证相同,但记录到只能由选定用户读取的文件

3

安慰

用于捕获通常指向系统控制台的消息

4

cron的

来自cron系统调度程序的消息

守护进程

系统守护程序全部接收

6

FTP

与ftp守护程序相关的消息

7

克恩

内核消息

8

local0.local7

每个站点定义的本地设施

9

LPR

来自线条打印系统的消息

10

邮件

与邮件系统有关的消息

11

标记

用于在日志文件中生成时间戳的伪事件

12

新闻

有关网络新闻协议(nntp)的消息

13

NTP

有关网络时间协议的消息

14

用户

常规用户进程

15

UUCP

UUCP子系统

系统优先级

syslog优先级总结在下表中 -

S.No. 优先级和说明
1

EMERG

紧急情况,如即将发生的系统崩溃,通常广播给所有用户

2

警报

应立即更正的情况,例如系统数据库已损坏

3

暴击

严重的条件,如硬件错误

4

普通错误

警告

警告

6

注意

条件不是错误,但可能需要特殊处理

7

信息

信息消息

8

调试

调试程序时使用的消息

9

没有

用于指定不记录消息的伪级别

设施和级别的组合使您能够辨别记录内容以及信息的位置。

由于每个程序都将其消息全部发送给系统记录器,所以记录器根据选择器中定义的级别决定要跟踪哪些内容以及要丢弃的内容。

当您指定级别时,系统将跟踪该级别和更高级别的所有内容。

/etc/syslog.conf文件

/etc/syslog.conf文件文件控制记录消息的位置。一个典型的syslog.conf文件可能看起来像这样 -

*.err;kern.debug;auth.notice /dev/console
daemon,auth.notice           /var/log/messages
lpr.info                     /var/log/lpr.log
mail.*                       /var/log/mail.log
ftp.*                        /var/log/ftp.log
auth.*                       @prep.ai.mit.edu
auth.*                       root,amrood
netinfo.err                  /var/log/netinfo.log
install.*                    /var/log/install.log
*.emerg                      *
*.alert                      |program_name
mark.*                       /dev/console

该文件的每一行包含两部分 -

  • 一个消息选择器,指定要记录的消息类型。例如,所有错误消息或内核中的所有调试消息。

  • 说明应该用消息做什么动作字段例如,将其放在一个文件中,或者将消息发送到用户的终端。

以下是上述配置的显着要点 -

  • 消息选择器有两个部分:设施优先级例如,kern.debug选择内核(工具)生成的所有调试消息(优先级)。

  • 消息选择器kern.debug选择大于调试的所有优先级。

  • 代表设施或优先级的星号表示“全部”。例如* .debug表示所有调试消息,而kern。*表示内核生成的所有消息。

  • 您也可以使用逗号来指定多个设施。可以使用分号将两个或多个选择器分组在一起。

记录操作

操作字段指定五个操作之一 -

  • 将消息记录到文件或设备。例如,/ var / log / lpr.log/ dev / console

  • 向用户发送消息。您可以通过用逗号分隔来指定多个用户名; 例如,root,amrood。

  • 向所有用户发送消息。在这种情况下,动作字段由星号组成; 例如, *。

  • 将消息传送到程序。在这种情况下,程序在Unix管道符号(|)之后指定。

  • 将消息发送到另一个主机上的syslog。在这种情况下,操作字段由一个主机名组成,前面带有一个at符号; 例如@ tutorialspoint.com。

记录器命令

Unix提供了logger命令,这是一个非常有用的命令来处理系统日志记录。所述记录器命令发送日志消息到syslogd守护进程,并且因此引发系统日志记录。

这意味着我们可以随时从命令行检查syslogd守护程序及其配置。logger命令提供了一种从命令行将一行条目添加到系统日志文件的方法。

命令的格式是 -

logger [-i] [-f file] [-p priority] [-t tag] [message]...

这里是参数的细节 -

S.No. 选项和说明
1

-f文件名

使用文件名的内容作为消息记录。

2

-一世

使用每行记录日志记录进程的进程ID。

3

-p优先

以指定的优先级(指定的选择器条目)输入消息; 消息优先级可以以数字形式指定,或者作为facility.priority对。默认优先级为user.notice。

4

-t标签

将使用指定标签添加到日志中的每一行标记。

信息

其内容以指定顺序并置在一起的字符string参数,以空格分隔。

您可以使用Manpage帮助来检查此命令的完整语法。

记录旋转

日志文件的发展速度非常快,消耗大量的磁盘空间。要启用日志轮换,大多数发行版都使用诸如newsysloglogrotate等工具

应该使用cron守护进程在频繁的时间间隔内调用这些工具查看newsysloglogrotate的手册页了解更多详细信息。

重要日志位置

所有系统应用程序在/ var / log及其子目录中创建日志文件以下是几个重要的应用程序及其相应的日志目录 -

应用 目录
的httpd 在/ var /日志/的httpd
桑巴 在/ var /日志/桑巴
cron的 在/ var /日志/
邮件 在/ var /日志/
MySQL的 在/ var /日志/

Unix - 信号和陷阱

在本章中,我们将详细探讨Unix中的信号和陷阱。

信号是发送到程序的软件中断,指示发生了重要事件。事件可能因用户请求而异,内存访问错误不正确。一些信号,例如中断信号,表示用户已经要求程序做一些不在通常的控制流程中的事情。

下表列出了您可能遇到并希望在程序中使用的常见信号 -

信号名称 信号号码 描述
SIGHUP 1 在控制终端检测到挂断或控制进程死亡
SIGINT 2 如果用户发送中断信号(Ctrl + C)
SIGQUIT 3 如果用户发送退出信号(Ctrl + D),则发出
SIGFPE 8 如果尝试非法数学运算,则发出
SIGKILL 9 如果一个进程获得这个信号,它必须立即退出,不执行任何清理操作
SIGALRM 14 闹钟信号(用于定时器)
SIGTERM 15 软件终止信号(默认情况下由kill发送)

信号列表

有一个简单的方法来列出系统支持的所有信号。只需发出kill -l命令,它将显示所有支持的信号 -

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

Solaris,HP-UX和Linux之间的实际信号列表有所不同。

默认动作

每个信号都有与之相关的默认动作。信号的默认操作是脚本或程序在接收到信号时执行的操作。

一些可能的默认动作是 -

  • 终止进程。

  • 忽略信号。

  • 转储核心 这将创建一个名为core的文件,其中包含当进程收到信号时的内存映像。

  • 停止进程。

  • 继续停止进程。

发送信号

向程序或脚本传递信号有几种方法。最常见的一个是用户在脚本执行时键入CONTROL-CINTERRUPT键

当您按Ctrl + C键时,会将SIGINT发送到脚本,并根据定义的默认操作脚本终止。

传递信号的另一种常见方法是使用kill命令,其语法如下:

$ kill -signal pid

这里的信号是要传递的信号的数量或名称,而pid是信号应发送到的进程ID。例如 -

$ kill -1 1001

上述命令将HUP或挂起信号发送到正在运行进程ID 1001的程序要将kill信号发送到同一个进程,请使用以下命令 -

$ kill -9 1001

这会导致进程ID 1001运行的进程死机

陷阱信号

执行shell程序期间按住Ctrl + C或Break键,通常该程序将立即终止,并且您的命令提示符返回。这可能并不总是令人满意的。例如,您可能会最终留下一堆不会被清理的临时文件。

捕获这些信号是很容易的,trap命令具有以下语法 -

$ trap commands signals

这里命令可以是任何有效的Unix命令,甚至是用户定义的函数,并且信号可以是您想要捕获的任何数量的信号的列表。

shell脚本中的陷阱有两个常见的用途:

  • 清理临时文件
  • 忽略信号

清理临时文件

作为trap命令的示例,以下显示了如何删除某些文件,然后如果有人尝试从终端中止程序,则退出 -

$ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2

从shell程序中这个陷阱被执行的那一点,如果程序接收到信号2 ,那么两个文件work1 $$dataout $$将被自动删除。

因此,如果用户在执行此陷阱之后中断程序的执行,则可以放心这两个文件将被清除。rm之后退出命令是必要的,因为没有它,执行将在程序中在接收到信号时停止的时候继续执行。

产生信号号1用于挂机有人故意挂断线或线意外断开连接。

您可以通过将信号号1添加到信号列表中来修改上述陷阱,以便在这种情况下删除两个指定的文件 -

$ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2

现在这些文件将被删除,如果该行被挂起或按Ctrl + C键。

指定为trap的命令必须用引号括起来,如果它们包含多个命令。还要注意,shell在执行陷阱命令时也会在接收到列出的信号之一时扫描命令行。

因此,在前面的示例中,在执行陷阱命令时,WORKDIR$$的值将被替换。如果您希望在接收到信号1或2时发生此替换,则可以将命令放在单引号内 -

$ trap \"rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit\" 1 2

忽略信号

如果为trap列出的命令为空,则在接收到指定的信号时将被忽略。例如,命令 -

$ trap \"\" 2

这表明中断信号将被忽略。执行不希望中断的操作时,可能需要忽略某些信号。您可以按如下方式指定要忽略的多个信号 -

$ trap \"\" 1 2 3 15

请注意,必须为要忽略的信号指定第一个参数,并且不等同于写入以下内容,它具有自己的独立意义 -

$ trap  2

如果忽略一个信号,所有的子shell也忽略该信号。但是,如果您指定在接收到信号时采取的操作,则所有子shell在接收到该信号时仍将采取默认操作。

重置陷阱

在更改了接收到信号后要执行的默认操作之后,如果您只是省略第一个参数,则可以使用陷阱重新进行更改。所以 -

$ trap 1 2

这会将接收到信号1或2的操作重置为默认值。

Copyright © 2002-2017 vue5.com 版权所有

Top