Linux基础(1)

来源:互联网 发布:java编程兵书 pdf 编辑:程序博客网 时间:2024/05/17 03:40

使用shell之前的第一个命令:

$ echo $SHELL
/bin/bash

如果上面的命令行报错或者不会类似地响应我们的示例,那么您可能正在运行一个不同于 bash 的 shell。

使用shell最重要的命令:cd,看看能不能知道下面的shell命令的意思?

$ cd /                   #跳转到根目录下

$ pwd                   #显示到当前目录

$ cd ..                   #跳转到上前目录的上一层目录

$ cd ../usr/share/zoneinfo     #相对路径的跳转

$ cd ../bin/../bin    #等价于$ cd ../bin 

$ cd         #没有参数,cd 将转到主目录

$ vim ~/myfile.txt      #打开一个主目录下的文件

$vim ~fred/fredsfile.txt  #打开其他用户主目录下的文件

使用shell最重要的命令:ls, 看看能不能知道下面的shell命令的意思?

$ cd /usr
$ ls
X11R6       doc       i686-pc-linux-gnu lib    man      sbin ssl
bin      gentoo-x86 include           libexec portage   share tmp
distfiles i686-linux info          local portage.old src
$ ls -a
.    bin    gentoo-x86        include libexec portage  share tmp
.. distfiles i686-linux      info local portage.old src
X11R6 doc        i686-pc-linux-gnu lib    man    sbin    ssl
$ ls -l /usr
drwxr-xr-x    7 root  root   168 Nov 24 14:02 X11R6
drwxr-xr-x    2 root  root  14576 Dec 27 08:56 bin
drwxr-xr-x    2 root  root  8856 Dec 26 12:47 distfiles
lrwxrwxrwx     1 root  root    9 Dec 22 20:57 doc -> share/doc
drwxr-xr-x   62 root   root  1856 Dec 27 15:54 gentoo-x86
drwxr-xr-x    4 root  root   152 Dec 12 23:10 i686-linux
drwxr-xr-x    4 root  root   96 Nov 24 13:17 i686-pc-linux-gnu
drwxr-xr-x   54 root   root  5992 Dec 24 22:30 include
lrwxrwxrwx     1 root  root   10 Dec 22 20:57 info -> share/info
drwxr-xr-x   28 root   root 13552 Dec 26 00:31 lib
drwxr-xr-x    3 root  root   72 Nov 25 00:34 libexec
drwxr-xr-x    8 root  root   240 Dec 22 20:57 local
lrwxrwxrwx     1 root  root    9 Dec 22 20:57 man -> share/man
lrwxrwxrwx     1 root  root   11 Dec 8 07:59 portage -> gentoo-x86
drwxr-xr-x   60 root   root  1864 Dec 8 07:55 portage.old
drwxr-xr-x    3 root  root  3096 Dec 22 20:57 sbin
drwxr-xr-x   46 root   root  1144 Dec 24 15:32 share
drwxr-xr-x    8 root  root   328 Dec 26 00:07 src
drwxr-xr-x    6 root  root   176 Nov 24 14:25 ssl
lrwxrwxrwx     1 root  root   10 Dec 22 20:57 tmp -> ../var/tmp

有时,您想要查看目录本身,而不是目录内部。对于这种情况,您可以指定 -d 选项,它将告诉 ls 查看所有目
录,否则在通常情况下,ls 要查看目录内部:
$ ls -dl /usr /usr/bin /usr/X11R6/bin ../share
drwxr-xr-x 4 root root            96 Dec 18 18:17 ../share
drwxr-xr-x 17 root root           576 Dec 24 09:03 /usr
drwxr-xr-x 2 root root           3192 Dec 26 12:52 /usr/X11R6/bin
drwxr-xr-x 2 root root          14576 Dec 27 08:56 /usr/bin

文件系统的每个对象都分配到一个独一无二的索引,叫做索引节点号。这可能看起来微不足道,但是理解索引
节点对于理解许多文件系统操作来说很重要。例如,请考虑出现在每个目录中的 . 和 .. 链接。为了完全理解 ..
目录实际上是什么,我们将先来看一看 /usr/local 的索引节点号:
$ ls -id /usr/local
  5120 /usr/local

/usr/local 目录有一个 5120 索引节点号。现在,我们来看一看 /usr/local/bin/.. 的索引节点号:
$ ls -id /usr/local/bin/..
  5120 /usr/local/bin/..
也就是说/usr/local/bin/..和/usr/local具有相同的索引节点。

指向一个特定索引节点的连接可以有多个。

事实上,通过使用 ls -dl 命令,我们可以看到索引节点 5120 被引用的总次数:
$ ls -dl /usr/local
drwxr-xr-x 8 root    root     240 Dec 22 20:57 /usr/local
如果我们看一看从左起的第二栏,我们可以看到目录 /usr/local(索引节点 5120)被引用了 8 次。在我的系统
中,引用该索引节点的不同路径有这些:
/usr/local
/usr/local/.
/usr/local/bin/..
/usr/local/games/..
/usr/local/lib/..
/usr/local/sbin/..
/usr/local/share/..
/usr/local/src/..

使用shell最重要的命令:mkdir

$ cd /tmp
$ mkdir tic tac toe
缺省情况下,mkdir 不会为您创建父目录;邻接的上一元素的完整路径必须存在。因此,如果您想要创建目录
won/der/ful,您将需要发出三个单独的 mkdir 命令:
$ mkdir won/der/ful
mkdir: cannot create directory `won/der/ful': No such file or directory
$ mkdir won
$ mkdir won/der
$ mkdir won/der/ful

然而,mkdir 有一个很方便的 -p 选项,该选项告诉 mkdir 创建所有缺少的父目录,如下所示:
$ mkdir -p easy/as/pie
总之,非常简单。要学习更多关于 mkdir 命令的知识,请输入 man mkdir 来阅读手册页。除 cd(它内置在
bash 中)之外,这几乎适用于这里所涉及的所有命令(比如 man ls)。

现在,我们将要快速地看一看 cp 和 mv 命令,这些命令用来复制、重命名以及移动文件和目录。为了开始该
概述,我们将首先用 touch 命令在 /tmp 中创建一个文件:
$ cd /tmp
$ touch copyme
如果文件存在,touch 命令将更新文件的“mtime”(请回想 ls -l 输出中的第六栏)。如果文件不存在,那么
将创建一个新的空文件。现在您应该有一个大小为零的 /tmp/copyme 文件。

使用shell最重要的命令:echo

带有输出重定向的同样的 echo 命令为:
$ echo "firstfile" > copyme
大于符号告诉 shell 将 echo 的输出写到名为 copyme 的文件中。如果该文件不存在,将创建这个文件;如果该
文件存在,将覆盖这个文件。通过输入 ls -l,我们可以看到 copyme 文件为 10 个字节长,因为它包括 firstfile
这个词和换行符:
$ ls -l copyme
-rw-r--r-- 1 root     root   10 Dec 28 14:13 copyme
为了在终端显示文件的内容,要使用 cat 命令:
$ cat copyme
firstfile
现在,我们可以使用 cp 命令的基本调用来由原始的 copyme 文件创建 copiedme 文件:
$ cp copyme copiedme
通过观察,我们发现它们确实是相互独立的文件;它们的索引节点号不同:
$ ls -i copyme copiedme
  648284 copiedme 650704 copyme
现在,我们来用“mv”命令将“copiedme”重命名为“movedme”。其索引节点号将仍然是同一个;但是,
指向该索引节点的文件名将改变。
$ mv copiedme movedme
$ ls -i movedme
  648284 movedme
只要目标文件和源文件驻留在同一文件系统上,被移动的文件的索引节点号就将仍然不变。
当谈及目录条目和索引节点之间关系时,我们提到了链接这个术语。Linux 实际有两种链接。到此为止我们所
讨论的这种链接叫硬链接。一个给定的索引节点可以有任意数目的硬链接,该索引节点一直存在于文件系统,
直到所有的硬链接消失。可以使用 ln 命令来创建新的硬链接:
$ cd /tmp
$ touch firstlink
$ ln firstlink secondlink
$ ls -i firstlink secondlink
  15782 firstlink 15782 secondlink

您可以看到,硬链接工作于索引节点级别,指向特殊的文件。在 Linux 系统上,硬链接有几个局限性。第一,
您只能给文件建立硬链接,而不能给目录建立硬链接。的确如此;即便 . 和 .. 是系统给目录创建的硬链接,也
不允许您(“root”用户也不行)创建任何您自己的硬链接。
硬链接的第二个局限性是它们不能跨文件系统。这意味着,如果您的 / 和 /usr 存在于不同的文件系统,您不能
创建从 /usr/bin/bash 到 /bin/bash 的链接。
实际上,符号链接(symbolic link,或“symlinks”)比硬链接更常用到。符号链接是一种专门的文件类型,
在这种文件类型中,链接通过名称引用另一个文件,而不是直接引用索引节点。符号链接不阻止文件被删除;
如果目标文件消失,那么符号链接仅仅是不可用,或“被破坏”。

通过将 -s 选项传给 ln,可以创建符号链接。
$ ln -s secondlink thirdlink
$ ls -l firstlink secondlink thirdlink
-rw-rw-r-- 2 agriffis agriffis        0 Dec 31 19:08 firstlink
-rw-rw-r-- 2 agriffis agriffis        0 Dec 31 19:08 secondlink
lrwxrwxrwx 1 agriffis agriffis         10 Dec 31 19:39 thirdlink -> secondlink
在 ls -l 输出中,可以用三种方式区分符号链接和一般文件。第一,请注意第一栏包含一个 l 字符的输出表明是
符号链接。第二,符号链接的大小是目标文件(本例是 secondlink)的字符数。第三,输出的最后一栏显示目
标文件名。

作为 root 用户,您可能想要给“keychain”创建一个别名,比如“kc”。在这个示例中,我们有 root 访问权
,由 bash 提示符改变为“#”可以证明。我们之所以需要 root 访问权是因为一般用户不能在 /usr/bin 中创建文
件。作为 root 用户,我们可以像下面这样给 keychain 创建一个别名:
# cd /usr/bin
# ln -s /usr/bin/keychain kc
当这个解决方法起作用时,如果我们想要把两个文件都移到 /usr/local/bin 时,它将会出现问题。
# mv /usr/bin/keychain /usr/bin/kc /usr/local/bin
因为在符号链接中,我们使用了绝对路径,而我们的 kc 符号链接仍然指向 /usr/bin/keychain,它已不存在了
— 另一个被破坏的符号链接。符号链接中的相对路径和绝对路径都各具优点,您应该使用适合于您的特殊应
用的路径类型。一般情况下,相对路径或绝对路径都能工作得很好。在这种情况下,下面的示例将起作用:
# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx 1 root   root 8 Jan 5 12:40 kc -> keychain
既然我们知道怎样使用 cp、mv 和 ln,现在我们该学习怎样把对象从文件系统中删除了。通常,这用 rm 命令
来完成。要删除文件,只需在命令行中指定它们:
$ cd /tmp
$ touch file1 file2
$ ls -l file1 file2
-rw-r--r-- 1 root root             0 Jan 1 16:41 file1
-rw-r--r-- 1 root root             0 Jan 1 16:41 file2
$ rm file1 file2
$ ls -l file1 file2
ls: file1: No such file or directory
ls: file2: No such file or directory
要删除目录,您有两种选择。您可以删除目录中所有的对象,然后使用 rmdir 来删除目录本身:
$ mkdir mydir
$ touch mydir/file1
$ rm mydir/file1
$ rmdir mydir
或者,您可以使用 rm 命令的 recursive force 选项来告诉 rm 删除您指定的目录以及目录中包含的所有对象:
$ rm -rf mydir
一般情况下,rm -rf 是删除目录树的首选方法。在使用 rm -rf 时要十分小心,因为它的功能可以被很好地利用
,也可能会因使用不当造成恶果。

? 与任何单个字符匹配。例子:

myfile? 与文件名为 myfile 后跟单个字符的任何文件匹配。
/tmp/notes?txt 将与 /tmp/notes.txt 和 /tmp/notes_txt 都匹配,如果它们存在。
[]
该通配符与 ? 相似,但允许指定得更确切。要使用该通配符,把您想要匹配的所有字符放在 [] 内。结果的表达
式将与 [] 中任一字符相匹配。您也可以用 - 来指定范围,甚至还可以组合范围。例子:
myfile[12] 将与 myfile1 和 myfile2 匹配。只要当前目录中至少有一个这样的文件存在,该通配符就可以进行扩
展。
[Cc]hange[Ll]og 将与 Changelog、ChangeLog、changeLog 以及 changelog 匹配。您可以看到,与大写形式
的变形匹配时,使用括弧通配符很有用。
ls /etc/[0-9]* 将列出 /etc 中以数字开头的所有文件。
ls /tmp/[A-Za-z]* 将列出 /tmp 中以大写字母或小写字母开头的所有文件。
[!]
除了不与括弧中的任何字符匹配外,[!] 构造与 [] 构造类似,只要不是列在 [! 和 ] 之间的字符,它将与任何字符
匹配。例子:
rm myfile[!9] 将删除除 myfile9 之外的名为 myfile 加一个字符的所有文件。
这里有一些使用通配符时应该注意的告诫说明。由于 bash 对与通配符相关的字符(?、[、]、*)进行特别处理
,因此您将包含这些字符的参数输入到命令中时,需要特别小心。例如,如果您想要创建一个包含字符串 [fo]*
的文件,下面这个命令可能不会执行您想要做的事:
$ echo [fo]* > /tmp/mynewfile.txt
如果 [fo]* 这个模式与当前工作目录中的任何文件匹配,那么您将在 /tmp/mynewfile.txt 内发现那些文件的名称
,而不是您所期望的文字 [fo]*。解决方法是什么呢?嗯,一种方法是用单引号把这些字符括起来,这将告诉
bash 单纯地执行,而不会对其进行通配符扩展:
$ echo '[fo]*' > /tmp/mynewfile.txt
采用这种方法,您的新文件将包含所期望的文字的 [fo]*。另一种方法是,您可以使用反斜杠,告诉 bash [、]
和 * 应该被当成文字处理,而不是被当成通配符处理:
$ echo /[fo/]/* > /tmp/mynewfile.txt
两种方法都能同样地起作用。既然我们谈到反斜杠扩展,那么现在是时候提一提了,为了指定文字 /,您可以
将它放入单引号中,或者也可以输入 //(它将被扩展为 /)。

 

 

 

原创粉丝点击