吉游网提供最新游戏下载和手游攻略!

Linux 命令行小技巧菜鸟大哥

发布时间:2024-07-06浏览:6

这里有一些您可能没有注意到的有用的 Linux 命令行命令。

如今,构建网站和移动应用最重要的就是推广。推广做好了,就成功了一半。如果产品没有曝光度,再好的产品也难以继续下去。从这个角度来看,大多数 Linux 命令行的推广简直糟透了。很多好用的 Linux 命令行工具都静静地躺在你发行版中默认安装的软件包中。很多时候,你遇到什么问题,只能通过在线搜索才能找到它们。更让人恼火的是,一旦你知道了其中很多东西,你就会想,没有它们我是怎么活下去的。所以这里我会列出一些我用过的东西,它们在大多数发行版中都是默认提供的,或者可以使用包管理工具轻松获得。

本文只讨论 Linux 环境下的东西,显然也适用于 MacOS。其实,虽然很多东西在 Windows 上也能找到,但配置更复杂,所以这里就不细说了。很多东西对于 Linux 老手来说会显得太基础了。但在这里写 cd、ls、mkdir 之类的基础又显得太业余了,所以这里就省略了很多很常用的命令。我觉得我没法把 git 之类的重量级工具,以及 sed、awk 之类的东西讲得一清二楚,这些都能出一本书了,所以这里就讲一些功能简单的小东西吧。不过,这些小问题就别提了……

如果你有更多时间

...那为什么不看看这本书呢:。这本书的内容就如同书名一样,深入浅出地介绍了所谓“Linux 命令行”的方方面面。本文的很多内容也出自这本书。网站上有免费的 PDF 下载。这本书写得很好,你可以随便读一读,不会感到太大的压力。最重要的是,如果你是 Linux 新手,那么这可能是最好的入门教程。我真的很后悔不知道这本书。说起来,另一本 Linux 入门高手教程应该是鸟哥的私房菜,它太出名了,我觉得没什么好说的。

如果你没有时间

以下是我认为很棒的一些命令行工具,按随机顺序列出。我不会在这里详细介绍各种参数,您应该使用 man xxx 查看文档。如果您的发行版中未安装这些程序,请手动搜索。Mac 用户应该可以在 homebrew 中找到它们。

tmux

虽然顺序是随机的,但是这个必须排在第一位。很多人在 Windows 机器上使用 Linux,用 putty 连接 Linux 服务器进行工作。这样,每次断开连接,你正在运行的程序就会被杀死。你也许希望退出时保留打开的程序在那里,下次连接时自动回到之前的工作状态。tmux 就是这个问题的终极解决方案。一方面,它们的功能是在一个 Terminal 中创建多个“窗口”。另一方面,如果你关闭连接或者不小心断开连接,它们默认不会关闭。下次连接时,你可以使用 tmux attachment 恢复之前的工作状态。

如果您没有听说过这个或类似的屏幕,你应该给我一些现金。

ls 可能是你最常用的命令之一。tree 可以递归列出目录中的所有文件,并以树形格式显示:

$ tree 
.
├── b
├── c
│ └── d
└── what

相应的,还有pstree也可以这样显示进程树。

确认

记得在一次面试中被问到,“请写出如何调用 grep 列出当前目录下所有文件中含有某个字符串的行”。我对这个问题的回答是“用 ack 就行”。ack 的官方域名是。由于在当前目录下载的所有文件中搜索某个字符串是如此常见的操作,因此执行 ack foo 可以在当前目录下的所有文件中搜索 foo。默认情况下,ack 会跳过很多无用的目录和文件,使得搜索更快,输出更准确。另外,默认开启的彩色显示用起来也很舒服。

ack 在大多数发行版中不可用。如果你使用的是 Ubuntu,它的软件包名称是 ack-grep,可执行文件名也一样。你可以在此处查看文档了解详细信息。

同步

比如你有一台本地电脑和一台远程服务器,你想把你的所有文件夹复制到对方的一个地方,这个文件夹需要经常更新,你希望用某种方式快速同步更新的部分。这该怎么做呢?如果你不懂 rsync,你可能会想用 git,建一个 ftp,或者用 scp 什么的。但其实 rsync 就是为了精准解决这个问题而诞生的软件。rsync 最棒的地方就是差异更新,也就是只传输对方缺少的部分,而且不需要任何额外的配置,速度极快。举个例子:

rsync -arvuzp --chmod=g+rx ./built/ me@example.com:/var/www/site

阿斯佩尔

作为一名程序员,总有一天要写英文文档。对于我这种母语不是英语的人来说,拼写错误是很常见的。如果用Word的话,会有下划线提醒,但如果在代码里写注释,或者在Linux里写markdown的话,好像就没有办法解决了。其实这也是一个已经解决的问题。Aspell就是用来做这件事的。Aspell可以对任何纯文本进行拼写检查。作为程序员的工具,它可以检测文件类型。比如对于C++程序,它只检查注释里的单词。

球座

有时候一些命令运行的结果会很长,你可能用less来从上到下读一遍。或者用>来重定向到文件。但是有时候程序可能要求你输入y来确认,或者有些程序运行时间很长,你不确定如果只是重定向的话是否运行正常。tee可以同时输出到屏幕和重定向到文件。举个简单的例子:

$ echo waht | tee out.txt

输出将会在屏幕上,并写入 out.txt 文件中。另外,tee 的意思其实就是 T,这是一种非常形象的表达输入输出的方式。

值得一提的是,vim还可以使用管道符,如下所示:

$ echo waht | vim -

你一定知道,你可以用键盘上的上下方向键来在历史记录中前后搜索。比如说,有一个你很久以前输入的命令,你可能需要按一下才能找到它。其实,这时候只要输入一部分,然后按一下 bash 就可以帮你往回搜索。连续按一下,就可以按顺序向前搜索。(或者直接按一下,再按一下回车)。继续上面的例子,输入 echo,按一下效果如下:

鸟哥私房菜_菜鸟大哥_鸟哥的私房菜电子书

(reverse-i-search)`echo': echo waht | vim -

有向前搜索的话一般也会有向后搜索,可惜向后搜索的快捷键是,你尝试按一下就会发现……好像机器没反应,这是因为大多数情况下默认是XOFF,也就是暂停接收输入,按一下就可以恢复。当然你也可以把向前搜索绑定到其他键上,请自行搜索。

克洛克

虽然代码行数并不能告诉你什么,但有时你就是想知道。cloc 可以精确统计代码行数,区分注释和空格。如果你是一位传奇项目经理,从今天开始使用 cloc 来计算你手下程序员的薪水吧!以下是截图:

$ cloc /usr/include/ 
9628 text files.
9308 unique files.
434 files ignored.

T=39.0 s (227.6 files/s, 39948.2 lines/s)
-------------------------------------------------
Language files blank comment code
-------------------------------------------------
C/C++ Header 8875 217366 287013 1053368
Teamcenter def 1 48 0 186
-------------------------------------------------
SUM: 8876 217414 287013 1053554
-------------------------------------------------

打印环境

使用 set 可以查看所有 shell 变量,包括 shell 函数,但有些变量只在当前 shell 中有效。经常需要查找 export 定义的环境变量。printenv 就是用来做这件事的。

设置-o vi

Bash 或者大多数常见的 shell 其实都支持使用 vi 进行命令行编辑。例如设置 set -o vi 后,可以使用熟悉的 hjkl 进行移动,使用 w,b 跳过单词等等。

同样的,如果你设置了EDITOR环境变量,那么你可以通过输入fc将之前输入的命令行放入编辑器中进行编辑,保存的话就会执行,反之不保存就相当于放弃了。

寻找

读完上面提到的那本书,最大的收获之一就是终于学会了如何使用 find。这已经成为我几乎每天都会用到的一个命令。比如我要把某个目录中的所有 png 文件都添加到本次 git commit 中,我可以使用:

find . -name '*.png' -exec git add {} ';'

如果你熟悉 find,你就会知道最后的 ; 可以用 + 代替以获得更好的结果,但它是有目的的。虽然这个命令看起来很简单,但如果省略单引号或用双引号代替,命令就会失败。这些涉及“shell 变量扩展”和引号转义规则。虽然感觉很烦人,但只有几个简单的规则,而且非常一致。所以只要你愿意花点时间弄清楚相关的东西,这个简单的问题就可以轻松解决。

类型

如果 foo 是一个可以直接从命令行运行的程序,那么您应该知道可以使用 which foo 来查找 foo 的可执行文件路径。但是,可以从命令行执行的命令不一定对应于特定的可执行文件。它们可以是别名、shell 函数、用户定义函数等。因此,当您使用 which 找不到任何东西时,有时会感到困惑。实际上,您可以使用 type foo 来查看 foo 是什么类型。

帮助

上面说的“builtin command”就是内置命令,是shell提供的基本命令,或者是外部程序无法做到的命令。正常情况下,可以使用man来查看文档,但是对于内置命令,man会跳转到shell自带的manpage。在某些系统中,它是一个巨大的页面,你必须在里面寻找想要查看的内容。在某些系统中,根本没有相关信息。这时,内置命令help可以解决这个问题:例如,如果你想查看set接受的选项,可以使用help set轻松找到。

环境

您应该知道,脚本第一行中的 #! (shebang) 用于指定其“运行时”。例如,如果您想编写一个 Python 脚本,但您并不真正关心它的版本,或者您不确定它的可执行文件在不同机器上的位置,那么 env 可以派上用场。您可以编写 #!/usr/bin/env python,这样在执行时,将使用在当前 PATH 中找到的 python。另一方面,这也让您有机会在不修改代码的情况下重新选择“运行时”。

文件

如果你想知道某个路径下的文件类型,那么 file 是最好的选择。它可以对一切给出有意义的解释,并且会列出很多关于二进制文件的重要信息。

字符串

“我把我的秘密放在这个用 C++ 编写的程序里。运行它并输入正确的密码即可看到它。”事实上,如果你遇到这种情况,你可以运行 strings program-written-in-cxx,你很可能会看到它。它可以更准确地列出二进制文件中包含的 C 样式字符串。这似乎毫无意义,但实际上,这完全取决于你。例如,如果你想知道某个程序是由哪个版本的 GCC 编译的,使用 strings 可能会给你结果。

外径

全名应该是“object dump”,它可以以八进制、十六进制或其他格式显示文件。我认为大多数人使用 od -c 以 ASCII 转储文件。一个用例是查看文件的行尾是什么。例如,运行 od -c foo.txt 将显示以下内容:

$ od -c foo.txt 
0000000 h e l l o \t w o r l d \r \n y e a
0000020 h
0000021

可以清楚地看到 \t 是制表符,而 \r\n 是 Windows 风格的换行符。

终于

没什么特别的,但如果我稍后遇到有用的命令行工具,我会将它们添加到这里。

热点资讯