目前来说,其实玩如 ubuntu 或者 openSUSE 这类的发行版,如果只是看看网页之类的,基本不需要 shell 了。但是很多时候还是因为 shell 的优点,尤其是写程序或者服务器管理之类的,shell 还是十分方便而且高效的。一般来说,linux 下面可以用图形界面来搞掂的事情,都可以通过 shell 界面来搞掂,而且 shell 界面可以搞掂的非常漂亮。
** 从用户界面的角度 **
首先学习 shell 需要意识到,shell 和普通的图形化界面是不一样的。一般来说,图形化是通过点鼠标,拖动等等事情来让电脑知道你要做什么,而 shell 是通过打字,或者叫做输入命令来搞掂。跟鼠标的左键右键不同,用 shell 来跟计算机沟通,都可以表示成一个很简单的形式:
command arg0 arg1 arg2 ...
其中,command 是你要做的事情,也就是你要执行的 shell 命令,或者你要执行的程序的位置。而 arg1, arg2, arg3。。。就是你要执行的参数
。什么是参数呢,可以类比成图形界面里面的选项
,也就是执行这条命令(执行这个程序),还需要告诉计算机的额外的事情。
举一个具体的例子,我要复制一个文件。容易想到,就是要用到复制命令。这个命令在 linux 下面是cp
。一般的,这样复制一个文件:
cp src dest
表示把 src 这个文件,复制为 dest。上面看到的 cp 就是一个命令,src 和 dest 就是两个参数。
好了,那么我们就可以知道,大概学习 shell,就是去学习这些命令,然后就可以用 shell 来搞掂我们的日常生活了。然后我们怎么知道要哪些命令呢?一般的方法是记,自己去了解哪些要用的,然后要用的时候就知道要用哪些了。事实上,要记的不多啦。
但是……我知道要用什么命令,我还要记住这些命令的参数吗?这太坑爹了!!当然不用。这时候你学会翻手册和文档,看帮助就可以了。一般来说,只传入一个 --help
就可以看这个命令的帮助(当然这个命令不一定有)。比如cp
的:
mo@linux-9pgf:~> cp --help
Usage: cp [OPTION]... -T] SOURCE DEST
or: cp [OPTION]... SOURCE... DIRECTORY
or: cp [OPTION]... -t DIRECTORY SOURCE...
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.
...
这里就会给出 cp 的简要说明啦!!!Usage 就是这个 cp 的用法。然后另外一个常说的,就是有问题找男人
,也即是man
这个命令啦!
man cp
然后你就会看到完整版的 cp 命令的手册了!
**shell 的状态 **
我们考虑一下,在图形界面下面,我们首先打开了一个文件夹 A,然后又开了文件夹 B,我们发现现在我们虽然打开的都是一个程序,但是两个程序的显示的是不一样的对啵?换而言之,我们来看文件夹那个程序也是有状态的,这个例子里面,就是当前目录
不同啦!一个当前目录是 A,一个当前目录是 B。那当然的,shell 也是有状态的咯!
以 bash 来说,比较值得注意的是:当前目录,执行的用户,变量值。
__ 当前目录 __
什么是当前目录呢?我们来看pwd
命令和ls
命令。
$ pwd
// 你会看到当前目录的位置
$ cd ..
$ pwd
// 你会发现当前目录改变了!
然后 cd
命令就是切换当前目录啦!为什么当前目录这么重要呢?因为有些程序是很依赖当前目录的哟,比如ls
命令就是显示当前目录
下面有哪些文件的。
$ ls
// 列出当前目录下面有哪些文件
好了,自己玩玩 cd
ls
和 pwd
吧。有同学走过的时候,你拼命地乱 cd 和 ls,他们就会觉的你好厉害的 :-)
__ 执行的用户 __
我们看看 shell 开头的那段:
mo@linux-9pgf:~>
这个 mo 就是当前用户的名字啦!你的机子上不是 mo?当然啦,你的机子显示的就是你的用户的名字咯!这个有什么用呢?主要是,有时候别人的文件,可能不给你看或者让你 papapa,然后通过当前用户是谁,系统会不让你 papapa 的,也即是权限问题
。每个跑的程序都是会记录这个程序是谁跑的,然后一般就是用你 shell 里面的那个身份咯!
当然也有命令是更改当前用户的,比如 su
命令。
$ su root
表示切换到 root 用户!非常危险哟!用的比较多的可能是 sudo
$ sudo zypper
表示,用某个用户的身份来执行 zypper
,默认就是 root 啦。所以这句话就是用管理身份执行 zypper 的意思啦!
__ 环境变量 __
有时候参数不够用的时候,或者某些时候,会需要用到环境变量
这个东西。程序跑的时候,除了可以通过参数,也可以通过环境变量来告诉程序一点东西啦!
比如,我们说过,command
除了可以是命令,也可以是程序的名字。比如,火狐~
$ firefox
这样就会吧火狐开起来了哟!怎么办到的呢!这里用到了一个叫 PATH 的环境变量哟!我们先来看看这个咚咚是什么。
$ echo $PATH
是不是看到一串长长的东西,里面用冒号隔开?对了,当你输入一个 command,如果这个 command 不是 shell 内建的,就会去这些目录里面找哟!然后如果找到了,就会执行之。
我们能不能改环境变量呢!其实是可以的哟,但这里就不说了。另外,要看全部的环境变量,就用 env 命令:
$ env
** 管道和重定向 **
我们知道,unix 的哲学是做一件事并把他做到最好
。基本上,linux 下面的软件都是这个样子的。而 shell 是干什么呢?shell 要干的,就是把这些软件粘合起来,然后形成一个完成的系统,或者说就是用来提供用户界面。shell 一般提供了管道和流重定向机制,如果要学 shell,这两个也是必学的哟。
我们知道,程序可以接受输入,产生输出。我们把一个程序想象成一个水池,可以在一个口把水放进去,也可以在另外一个口把水放出来。在 shell 的底层,这些东西都是通过无格式的字符串来表示的,然后我们把流入的水的那个孔叫做”标准输入流“,流出水的那个孔叫做”标准输出流“。
然后,我们可以通过 shell,在两个程序直接连接一条管道,然后把第一个程序流出的水引到第二个程序的入水口里面!
cat lover | grep today
cat
命令是把一个文件输出到输出流,grep
在这里的效果是输出,输入里面带有today
的行。好吧这个有点拗口,不过以后就会理解的。
然后重定向就是直接把输入或者输出的东西在一个文件里面流入,或者流进一个文件里面!
grep < lover # 把 lover 作为输入,执行 grep
ls > my_ls.txt # 把 ls 命令的输出流入到 my_ls.txt 里面
好吧这节挺多咚咚的,不理解就跳过,去寻找更详细的文档吧……
** 最后……**
我们小结一下我们说了什么吧:
[list=] 1. shell 是通过输入形式如 command arg0 arg1 ...
的东西来让计算机干活的。
2. man
和 --help
获得帮助。
3. 当前目录:可以通过cd
和pwd
来查看。
4. 当前用户:可以通过sudo
和su
来改变。
5. 环境变量:可以通过env
来改变,以及了解 $PATH 环境变量。
6. 管道和重定向: |
<
>
[/list]
最后列一下常用的命令吧~~
目录和文件管理: `mv` `cp` `cd` `pwd` `rm` `mkdir` `ls`
权限管理: `chmod` `chown`
还有一些几乎必学的咚咚(以 openSUSE 为例)~~
解压缩和压缩: `tar`
文本分析: `grep`
软件包管理: `zypper` `yast`的软件包管理
系统设置:`yast`
尤其是软件包管理,是 linux 里面非常先进而高效的咚咚哟!基本上看一个会不会用他用的发行版的软件包管理,就知道是不是彻底的水货了!
然后如果是程序员,建议学一下 gcc
gdb
make
,学一个编辑器 vim
或者emacs
啦。还记得 C 程序里面那个 main 么,main 函数也可以带参数的,传入的就是在 shell 里面输入的字符串哟。
最后推荐一个很好玩的东西,跟着我们来输入 (openSUSE):
sudo zypper in figlet
// 输入你们的管理员密码,一般就是你登录密码
figlet I love openSUSE
附:推荐一下《鸟哥的 linux 私房菜》 linux.vbird.org/