cd (change directory)

切换到某个目录

cd /to/path

回到用户主目录

cd

返回前一个目录

只会记录一个前一个目录的记录,并不会记录所有的记录。

cd -

pwd (present working directory)

查看当前目录

pushd & popd (push to directory, pop back)

cd有一个缺点就是它无法保存导航的记录,如果切换到某几个文件夹之后想回到之前的路径就有点困难。特别是在写某一些脚本的时候,切换到某个目录下执行一些任务以后希望能够回到之前的目录。

pushd可以很简单的解决这个问题。pushd命令将导航的历史记录利用栈的数据结构进行存储,可以push n层目录,然后逐级的pop出来。

push到某个目录

pushd /to/path

pop会导航栈中上一个目录

popd

交换栈上最上面的两个路劲

pushd

旋转导航栈[1]

pushd +2

参考资料

  1. Stack Wikipedia

预备知识

文件描述符( File Descriptor )

在Unix 系统中文件描述符是用于访问文件、输入输出、管道、网络套接字的一个抽象概念[3]。文件描述符是一个非负的正整数,每一个Unix进程中都会有三个与标准流所对应的的POSIX文件描述符,分别为:

  1. stdin - 标准输入,提供给应用的标准输入。文件描述符为0
  2. stdout - 标准输出,程序的输出,在非重定向的情况下为终端。文件描述符为1
  3. stderr - 标准错误输出,程序的错误输出。文件描述符为2

关于文件描述符的详细,见文章

输出重定向

有两种方式可以将输出重定向:

  • n> file
    将文件描述符n重定向到文件file中,如果文件不存在则会创建文件,如果存在的话将会覆盖原有内容。

  • n>> file
    将文件描述符n重定向到文件file中,如果文件不存在将会创建文件,如果存在则会在文件的结尾开始写入输出。

如果我们没有指定文件描述符,则默认为1,即标准输出。

重定向到不同的文件

我们可以把stdoutstderr输出到不同的文件,例子:

1
2
3
4
5
6
7
8
9
zhengyi$ ls
file1 file2 file3
zhengyi$ ls f* e* 1>out.txt 2>err.txt
zhengyi$ cat out.txt
file1
file2
file3
zhengyi$ cat err.txt
ls: e*: No such file or directory

重定向到一个文件

很多情况下我们需要将stdoutstderr输出到同一个文件中,这个时候我们可以使用 &> or &>>,它们会把标准输出和标准错误输出到一起。

另外一种方法是利用m>&n,将某一个输出重定向到另一个输出中来。这个时候需要注意的是使用它们的顺序,比如下面这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
zhengyi$ ls f* z* 1>out.txt 2>&1
zhengyi$ cat out.txt
ls: z*: No such file or directory
file1
file2
file3
zhengyi$ ls f* z* 2>&1 1>out.txt
ls: z*: No such file or directory
zhengyi$ cat out.txt
file1
file2
file3

ls f* z* 1>out.txt 2>&1这个例子是先将标准输出重定向到文件out.txt中,然后将标准错误重定向到标准输出中,这个是可以工作的。ls f* z* 2>&1 1>out.txt这个例子中,先将标准错误重定向到了标准输入,这个时候的标准输入指向的是默认的标准输入,而当后面将标准输入重定向到文件out.txt时,并不会改变标准错误的输出目标。

忽略某一些输出

比如说我们想要过滤输出中的错误,那么我们可以将标准错误输出到/dev/null中。

1
2
3
4
5
zhengyi$ ls f* z*
ls: z*: No such file or directory
file1 file2 file3
zhengyi$ ls f* z* 2>/dev/null
file1 file2 file3

输入重定向

与输出重定向相反,输入重定向是利用”<”符号来表达的。例子:

1
2
3
4
5
6
7
8
9
10
11
12
zhengyi$ cat out.txt 
err.txt
file1
file2
file3
out.txt
zhengyi$ sort -r < out.txt
out.txt
file3
file2
file1
err.txt

输出重定向可以和输入重定向组合起来一起使用,比如:

1
zhengyi$ sort -r < out.txt > sorted.txt

这个是将out.txt作为输入,然后把sort的结果重定向到sorted.txt中。同时使用输入和输出重定向的时候需要注意一点就是尽量避免使用同一个文件。比如说上面这个sort的例子,如果指向同一个文件,那么一开始输出重定向会先把out.txt文件清空。

参考资料

  1. Learn Linux, 101: Streams, pipes, and redirects
  2. I/O Redirection
  3. Wikipedia - File Descriptor

阅读更多

Mac/Linux 命令学习

基本

cat基本用途是把指定文件读取出来,并输出到STDOUT中。

cat [-benstuv] [file ...]

常用功能

-b 打印出行数,不包含空白行,从1开始
-n 打印出行数,包括空白航,从1开始
-e 显示不能打印的字符,每行结尾打印$符号
-t 显示不能打印的字符,制表符显示为^I

使用场景

打印一个文件到终端来查看其中内容

cat file

打印文件到另一个文件中

cat file1 > file2

打印文件到另一个文件结尾

cat file1 >> file2

参考输入输出重定向

非洲三万里-封面

书评

毕淑敏对于我来说是一个既熟悉又陌生的作家,熟悉是因为在初高中的时候语文老师经常会将其散文、短文给我们当做阅读材料。陌生呢,是因为我记不起来任何一篇她的作品,也没有主动地去读过她任何一本书。非洲加上毕淑敏,这个组合吸引了我去阅读这本书,我想看看一位作家是如何写她的游记的。

阅读全文

知识对于一个人有三种状态,不知道的,知道的,做到的。本文不讨论不知道的情况。

知行合一

我认为大多数的知识停留在知道这个层面。我们可以通过很多途径学习、吸收知识,但是我们在做一件事情的时候,驱动我们的不是这些知识,而是习惯和潜意识。比如说学打羽毛球,一个新手通过看视频、看动作要领等学习到了很多关于打羽毛球的要领,但是这跟打好羽毛球其实并没有直接的关系。只能说掌握了这些知识可能能让你学打羽毛球的过程变得简单一些,等你最终学会了打羽毛球的时候,你脑子里想的绝对不是动作要领,因为这些复杂的动作已经转化成你脑子里的一个memory chunk。所以从小到大从书本上学到了很多大道理,知道了很多励志的故事,但绝大多数仅仅只是停留在知道的层面上。

我们做一件事情的时候,很多时候是带着一种惯性去做的。一个在某一方面很牛逼的人,你如果问他你为什么这么牛?他可能会跟你说出很多点,但是这并不意味着你知道了这些点你就能成为跟他一样的人。一是因为你觉的很牛逼事情,在他看来可能只是一件随随便便就能做到的事情,他背后包含的是他长期以来形成的惯性。而他给出的一些点往往只是他做出来的一个不完全的总结,你不可能完全重复他的成长轨迹。

往往越高层次的人给出的一些建议约精炼。如果你问你的manager让他给你一些建议,他可能会跟你说一堆如果在工作中做好的一些技巧。如果你问你们公司老板,他可能会跟你说一些人生小建议,而不涉及到一些具体的东西。而如果你去问乔布斯,他可能就跟你说一句话,“Stay Hungry Stay Foolish”。

从知道到做到是有一个巨大的鸿沟的,而从做到到知道往往只有咫尺之遥。

那是不是说知道这个层面就不重要呢?并不然。我们的行为系统是需要知识系统支撑的,如果你什么都不知道你能做的事情其实很少。我们需要做的就是尽可能的把我们知道的内化成我们自己的一部分,融入到我们的行为当中。届时,即使你可以把所有的技巧知识都忘了,你依然可能随时从你的大脑深处召唤出来。这就像倚天屠龙记里面张三丰教张无忌太极剑法,教完问其记得么?当张无忌说全忘了的时候,也就是他全部融会贯通的时候。

纵然我们没有张无忌这般天赋异禀,但我们也可以通过多练习和思考慢慢的去忘掉那些讨人厌的各种技巧、各种道理。 我觉得可以通过以下几种方法进行修炼:

  1. 当你在做一件你需要提高的事情的时候,给自己提一些更高的要求,并尽可能的去思考如何才能做得更好。可以观察自身的一些特点习惯中找到进步的点,也可以尽可能的去回想你所知道的知识中有哪一些可以帮助你提高。
  2. 在做的过程中,以及做完之后要经常的用一个“上帝视角”看看你做的事情。有哪些做的不好?为什么做不好?是因为旧的习惯还是说某些知识的缺乏。
  3. 通过阅读等方法拓宽自己知识体系,并积极将其跟自己的实践结合起来思考。如果你在下一次做这个事情的时候能够注意到这个点这就够了。何况这样可以让我们站在前人的肩膀上,为什么不呢?

我不知道王阳明当时提出“知行合一”的原意是什么,但是我理解的“知行合一”是通过行动将你知道的和你能做到的进行统一,从而达到一个”忘记”的境界。

[end]