这本《Linux 命令完全手册》将涵盖你作为开发者需要用到的 60 个核心 Bash 命令。每个命令都附有代码示例和用法提示。
这本手册遵循二八定律:你花两成的时间学习一个主题,便可获得其中八成的知识。
我觉得这种方式能给你一个全面的概述。
这本手册并不试图涵盖所有关于 Linux 及其命令的内容,而是专注于那些你在大部分时间里都会用到的小型核心命令,同时试着简化更复杂命令的用法。
以下介绍的命令,在 Linux、macOS、WSL 和其他类 UNIX 环境均可使用。
我希望这本手册的内容可以帮助你达成你想要的目标:熟练掌握 Linux 。
你可以收藏本页,这样就能在以后随时参考这本手册。
你也可以免费下载这本书的 PDF、ePUB、Mobi 版本。
尽情享受吧!
basename
命令dirname
命令ps
命令top
命令kill
命令killall
命令jobs
命令bg
命令fg
命令type
命令which
命令nohup
命令xargs
命令vim
编辑器命令emacs
编辑器命令nano
编辑器命令whoami
命令who
命令su
命令sudo
命令passwd
命令ping
命令traceroute
命令clear
命令history
命令export
命令crontab
命令uname
命令env
命令printenv
命令basename
命令假设有一个文件路径,比如 /Users/flavio/test.txt
。
执行
basename /Users/flavio/test.txt
会返回 text.txt
字符串:
如果你在任一指向目录的路径字符串上执行 basename
,你会得到路径的最后一节。在以下例子中,/Users/flavio
是一个目录:
dirname
命令假设有一个文件路径,比如 /Users/flavio/test.txt
。
执行
dirname /Users/flavio/test.txt
会返回 /Users/flavio
字符串:
ps
命令电脑每时每刻都在运行大量不同的进程。
你可以用 ps
命令检查它们:
这是当前会话中运行的,由用户发起的进程列表。
此处我打开了一些 fish
Shell 实例,大多数是在 VS Code 编辑器内部启动的,还运行了一个 Hugo 实例,用来生成网站的开发预览。
这些只是分配给当前用户的命令。要列出所有进程,我们需要给 ps
传递一些参数。
我最常使用的命令是 ps ax
:
a
参数用来同时列出其他用户的进程。x
显示那些未与终端相连的进程(不是由用户通过终端发起的)。
如你所见,较长的命令被截断了。使用 ps axww
继续在新的行上列出命令,而非截断。
我们需要输入
w
两次来应用这个设置(这不是笔误)。
你可以配合使用 grep
和管道符来搜索特定的进程,比如像这样:
ps axww | grep 'Visual Studio Code'
ps
返回的列表达了一些重要信息。第一个信息是 PID
,也就是进程 ID。当你想在另一个命令中引用这个进程时,比如说要杀死它,这是关键的。
然后是 TT
,它告诉我们进程所使用的终端 ID。
接下来 STAT
告诉我们进程的状态:
I
代表闲置的进程(睡眠时间超过约 20 秒)R
代表可运行的进程S
代表睡眠时间少于 20 秒的进程T
代表已停止的进程U
代表处于不间断等待中的进程Z
代表已死亡的进程(zombie,即僵尸进程)
如果出现一个以上的字母,那么第二个字母代表进一步的、可能非常有技术性的信息。
常见的是 +
,它代表相应进程在终端中处于前台。而 s
代表相应进程是一个 会话领头进程(session leader)。
TIME
则告诉我们进程已经运行了多长时间。
top
命令top
命令用来显示系统中正在运行的进程的动态实时信息。
如果要了解系统发生了什么,这条命令真的很方便。
它的用法很简单。你只需要输入 top
,终端会完全沉浸到新的视图中:
q
或按下 ctrl-C
。它给出了很多信息:进程数量、有多少进程在运行或休眠、系统负载、CPU 使用率,还有更多信息。
在下方,占用 CPU 和内存资源最多的进程列表不断刷新。
默认情况下,进程按 CPU 使用率排列,正如你在高亮标记的 %CPU
列中看到的那样。
你可以添加一个参数,要求进程列表按内存利用率排列:
top -o mem
kill
命令Linux 进程可以接收信号并做出反应。
这是我们与运行中进程打交道的一种方式。
kill
程序可以向任一程序发送多种信号。
虽然这个命令的名字暗示了它的主要功能,但它不只是用来终止程序的。
它的用法是:
kill <PID>
默认情况下,它会向指定的进程 ID 发送 TERM
信号。
我们可以使用参数来发送其它信号,包括以下这些:
kill -HUP <PID>
kill -INT <PID>
kill -KILL <PID>
kill -TERM <PID>
kill -CONT <PID>
kill -STOP <PID>
HUP
代表 hang up(挂起)。如果在终止进程之前,先关闭了启动它的终端窗口,这一信号将被自动发送。
INT
代表 interrupt(干扰),这个信号和在终端中按下 ctrl-C
组合键的作用一样,常常用来终结进程。
KILL
信号并不直接发送给进程,而是发送到操作系统内核,内核会让指定进程立刻停止并终结。
TERM
代表 terminate(终结)。这是本命令的默认信号,进程收到它会自主终结。
CONT
代表 continue(继续)。它可以用来恢复一个被停止的进程。
STOP
信号并不直接发送给进程,而是发送到操作系统内核,内核会让指定进程立刻停止(但不终结)。
有时你也会见到用数字表示状态的情况,例如 kill -1 <PID>
。在这种情况下,
1
对应 HUP
2
对应 INT
9
对应 KILL
15
对应 TERM
18
对应 CONT
15
对应 STOP
killall
命令与 kill
命令类似, killall
也向进程发送状态信号,但区别是后者可以同时向多个进程发送信号,而非前者只能向单个进程 ID 发送信号。
这是它的命令语法:
killall <name>
name
也就是进程的名字。例如,假设有多个 top
程序的实例在运行, killall top
命令将完全终结它们。
你可以指定某一个信号,就像使用 kill
命令那样(请向上翻阅 kill
命令的指南以了解更多具体可以发送的信号),例如:
killall -HUP top
jobs
命令当我们在 Linux / macOS 中运行命令时,我们可以在末尾加入 &
符号,使其在后台运行。
例如,让 top
命令在后台运行:
top &
这对于需要长时间运行的程序来说很方便。
要返回切入后台的程序,可以使用 fg
命令。如果后台只有一个作业进程,那么直接使用就好;否则要在后面加上作业进程的号码,如:fg 1
、fg 2
,以此类推。
要获取作业进程号,我们可以使用 jobs
命令。
假设我们运行了 top &
,之后再运行 top -o mem &
,因而我们有两个 top 实例在运行。此时 jobs
命令会这样告诉我们:
fg <作业号>
切回任意一个实例。要再次终止程序,可以按下 cmd-Z
。运行 jobs -l
也会列出每一个作业的进程 ID。
bg
命令当命令执行时,你可以按下 ctrl-Z
暂停它。
按下后,命令会即刻停止,并将你带回到 Shell 终端。
你可以恢复命令在后台的执行,这样既可以使命令保持运行,同时又不会妨碍你在终端中做其他工作。
在这一例子中,有 2 个命令停止了:
bg 1
即可在后台恢复作业 #1 的执行。我也可以不带任何参数执行 bg
命令,它会默认选取作业列表中的 #1 项。
fg
命令当命令在后台运行时,由于此前你已经在命令末尾加上了 &
(例如 top &
,或是使用了 bg
命令将命令放到后台),此时你可以用 fg
命令将其切换回前台。
执行
fg
它将在前台恢复最后被暂停的作业。
你也可以加上作业号,即可指定任一你想在前台恢复的作业,作业号可以使用 jobs
命令获得。
执行 fg 2
将恢复作业 #2:
type
命令命令可分为以下四种类型:
如果你很想知道或只是很好奇,type
命令可以帮你分清这些。它会告诉你某一命令如何被解析。
输出根据 Shell 的类型而有所不同,这是在 Bash 中的样子:
这是在 Zsh 中的样子:
这是在 Fish 中的样子:
ll
显示为一个别名,而在 Fish 中,由于 ll
是默认提供的,所以它会告诉你这是内置的 Shell 功能。which
命令假定你有一个可直接执行的命令,因为它处在 Shell 路径中,但你想知道它的具体位置。
你可以用 which
来做这件事。这个命令会返回指定命令的路径。
which
只对存储在磁盘上的可执行文件起作用,对别名或内置 Shell 功能无效。nohup
命令有时你必须在远程机器上运行一个长时间活跃的进程,但之后你需要断开连接。
或者,你只是想防止当本地和服务器之间有任何网络问题时,命令被停止执行。
要让任一命令在登出或关闭服务器会话后继续运行,可以使用 nohup
命令。
执行 nohup <命令>
可以让某个进程在你登出后继续工作。
xargs
命令在 UNIX Shell 中,xargs
命令用来将标准输入的数据转换成命令的参数。
换句话说,使用 xargs
,可以将一条命令的输出,用作另一条命令的输入。
下面是你将会用到的语法:
command1 | xargs command2
我们使用管道符(|
)将输出传递给 xargs
。它将负责运行 command2
命令,使用 command1
的输出作为参数。
我们来做个简单的例子。假设你要删除某个目录下的一些特定文件。这些文件列在一个文本文件中。
我们有三个文件:file1
、 file2
、 file3
。
在 todelete.txt
中,我们有一份想要删除的文件列表,在这一例子中是 file1
和 file3
:
我们将通过 xargs
把 cat todelete.txt
的输出引向 rm
命令。
就像这样:
cat todelete.txt | xargs rm
以下是执行结果,我们列出的文件现在已经被删除:
它的工作方式是:xargs
会运行 rm
2次,为 cat
返回的每一行运行一次。
这是 xargs
最简单的用法。我们还可以使用以下的一些参数。
在我看来,其中最有用的是 -p
(特别是刚开始学习 xargs
时)。使用这个选项将使 xargs
打印出一个确认提示,说明它要采取的行动:
-n
选项令 xargs
每次执行若干个迭代,因此你可以用 -p
单独确认它们。这里我们用 -n1
告诉 xargs
一次执行一个迭代:
另一个广泛应用的参数是 -I
。它可以将输出内容放入占位符,之后你可以用来做各种事。
其中一件事是同时运行多个命令,例如:
command1 | xargs -I % /bin/bash -c 'command2 %; command3 %'
你可以将上方的
%
符号换成其他任何东西——它只是个变量。
vim
编辑器命令vim
是一个非常流行的文件编辑器,特别是在程序员中。它被积极开发且经常更新,且有巨大的社区力量围绕着。甚至还有一个 Vim 会议!
在现代系统中,vi
只是 vim
的一个别名,意思是“改进的 vi
”(即 “vi
im
proved”)。
你可以在命令行运行 vi
启动它。
调用时指定一个文件名,你就可以编辑对应的文件:
vi test.txt
你需要了解的是,Vim 有两个主要的模式:
当你启动编辑器时,默认处于命令模式。这时你无法像期望的那样,在基于图形界面的编辑器中输入文本。你需要进入插入模式。
可以按下 i
键进入插入模式。当你这样做之后, 在编辑器下方会出现 -- 插入 --
(或 INSERT)字样:
现在你可以开始输入了,用文件内容来填充终端屏幕:
你可以用方向键在文件中移动光标,或者使用 h
- j
- k
- l
四个键。h-l
代表左和右,j-k
代表上和下。
当完成编辑时,按下 esc
键即可退出插入模式,回到命令模式。
现在你可能想知道如何保存文件。可以按下 :
(冒号),然后输入 w
,即 :w
要保存并退出,可以按下 :
然后输入 w
和 q
,即 :wq
要退出但不保存文件,可以按下 :
然后输入 q
和 !
,即 :q!
要撤销某一个更改并再次编辑,可以在命令模式中按下 u
。如果要重做 (取消上次的撤销操作),可以按下 ctrl-r
。
以上是使用 Vim 工作的基本操作。接下来是一个无底洞,这篇简短的介绍是无法讲完的。
下面我只会提到那些能让你入门 Vim 编辑的命令:
x
键,删除当前光标高亮的字符A
跳转到当前选择行的末尾0
跳转到行的开头d
,然后按 w
即可删除相应单词。如果输入 e
而非 w
,后一个单词前的空白处将被保留d
和 w
之间加入一个数字,即可删除多个单词,例如使用 d3w
来向前删除 3 个单词d
然后再按一次 d
,即可删除整行。按下 d
然后再按 $
,即可删除以光标为开头,直至当前行末尾的整行内容。如需了解更多 Vim 的内容,我推荐参阅 Vim 常见问题。你还可以运行 vimtutor
命令,它应该已经安装到系统中,可以对你开始探索 vim
有很大帮助。
emacs
编辑器命令emacs
是一个很棒的编辑器,它在历史上被认作是专为 UNIX 系统而生的。更著名的是:围绕 vi
与 emacs
之间的火热纷争与激烈论战曾给全世界的开发者带来许多无益的时光。
emacs
非常强大。一些人将其当作一种操作系统,全天候都在使用它 (https://news.ycombinator.com/item?id=19127258)。我们在此处只谈及一些基础的用法。
你可以调用 emacs
来开启新的 emacs 会话:
macOS 用户们,现在请停一下。如果你当前在使用 Linux,那就没有什么问题,但 macOS 并未搭载使用 GPLv3 协议的应用程序,且每个内置的 UNIX 命令也没有更新到 GPLv3 版本。
虽然这对于我以上已经列出的命令来说,只是个小问题,但就本例而言,使用 2007 年的 emacs 版本与使用经过十余年改进和变化的版本,体验并不完全相同。
对于时常更新的 Vim 来说,这也不算什么。但想要解决 emacs 的问题,你需要运行 brew install emacs
,之后再运行 emacs
,即可使用 Homebrew 提供的新版本(确保 Homebrew 已安装)。
与 Vim 类似,你也可以调用 emacs <文件名>
来编辑已有的文件:
现在你可以开始编辑。当你完成编辑,先按下 ctrl-x
,然后按下 ctrl-w
。先确认文件夹:
而 Emacs 会告诉你这个文件已存在,并询问是否要覆盖它:
回答 y
,你会得到一条操作成功的确认信息:
ctrl-x
,然后再按 ctrl-c
。或者先按下 ctrl-x
之后再按 c
(期间按住 ctrl
不放)。Emacs 还有很多要了解的地方,限于篇幅,我在这篇简短教程中不便展开。我鼓励诸位按下 ctrl-h
r
打开内置参考手册,或按下 ctrl-h
t
打开官方教程以继续学习。
nano
编辑器命令nano
是一个对初学者友好的编辑器。
输入 nano <文件名>
即可运行。
你可以直接向文件中输入字符,而不必担心所在的模式。
想退出而不修改,你可以直接按下 ctrl-X
。如果你已经编辑了文件缓冲区,编辑器会弹出确认提示,你可以选择保存或放弃更改。
底部的帮助栏为你显示了一部分用于处理文件的键盘命令:
pico
与它大致相同,不过 nano
其实是 pico
的 GNU 版本,后者在一段历史时期内并未开源。于是人们克隆出 nano
以满足 GNU 操作系统的许可要求。whoami
命令键入 whoami
即可将当前登录终端会话的用户名打印出来:
注意:这和可以输出更多信息的
who am i
命令并不一样。
who
命令who
命令显示当前已登录系统的用户。
除非你在使用多人访问的服务器,否则你可能是唯一的登录用户,并且登录了多次:
为什么说是多次呢?因为每打开一次 Shell,都会被算作一次访问。
你可以在此看到使用的终端名,以及会话的起始时间/日期。
参数 -aH
将使 who
显示更多的信息,包括空载的时间与终端的进程 ID:
特殊的 who am i
命令会列出当前终端会话的详情:
su
命令当你用一个用户登录到终端 Shell 时,可能需要切换到另一个用户。
例如,你以 root 身份登录,进行了维护工作,但之后你想切换到别的用户账户。
你可以用 su
命令来完成:
su <用户名>
例如:su flavio
.
如果你以用户身份登录,且不带参数运行 su
命令,它会遵从默认行为——提示你输入 root
用户的密码。
su
会以另一个用户的身份,开启新的 Shell。当你完成操作,执行 exit
即可关闭新开的 Shell,并回到当前用户的 Shell。
sudo
命令sudo
通常用来以 root 身份运行命令。
你必须先启用当前身份才能使用 sudo
,启用之后,你可以直接输入你自己的登录密码( 而非 root 用户的密码)来以 root 身份运行命令。
这种权限是高度可配置的,在多用户的服务器环境中尤其有用。一些用户可以通过 sudo
被授予运行特定命令的权限。
例如,你可以用它编辑任一系统配置文件:
sudo nano /etc/hosts
这在普通模式下是无法实现的,因为你没有相应的权限。
你可以执行 sudo -i
,以 root 身份启动一个 Shell:
还可以使用 sudo
以其他任何用户身份运行命令。默认情况是 root
, 但加上 -u
参数即可指定使用其他用户:
sudo -u flavio ls /Users/flavio
passwd
命令在 Linux 中,用户都有一个指定的密码。你可以使用 passwd
命令修改这个密码。
这里有两种情况。
第一种情况是:你想要修改自己的密码,此时你可以输入:
passwd
交互式提示会先询问你的旧密码,之后要求你输入新密码:
当你处于 root
身份(或是其他具有超级用户权限的用户)时,你可以设置你想要更改密码的用户名:
passwd <username> <new password>
此时你无需输入旧密码。
ping
命令ping
命令可以在本地网络或互联网上探测一个特定的网络主机。
它的语法是 ping <host>
,其中 <host>
可以是域名或 IP 地址。
以下是探测 google.com
的例子:
ping
在默认情况下,每秒持续发送请求,只有按下 ctrl-C
时才会停止。你可以用 -c
参数指定想要的尝试次数:ping -c 2 google.com
。
一旦 ping
结束运行,它将输出一些结果:例如数据包丢失的百分比,以及其他关于网络性能的统计数据。
你可以看到,屏幕上输出了主机的 IP 地址,以及得到响应所花的时间。
并不是所有的服务器都可以探测,此时会出现请求超时:
有时这是为了“隐藏”服务器,或是减低服务器负载而故意设置的。为了探测所发送的数据包也可以被防火墙过滤。
ping
使用 ICMP 协议 (全称 Internet Control Message Protocol ,互联网控制报文协议)工作。ICMP 与 TCP 和 UDP 一样,是网络层协议。
探测请求向服务器发送一个含有 ECHO_REQUEST
信息的数据包,服务器则会返回 ECHO_REPLY
信息。此处我将不展开讲述,但这是最基本的概念。
用 Ping 探测,在测试主机是否可以访问时非常有用(此处假设主机支持探测),还可以从主机返回信息的时长,获知它的距离有多远。
通常,服务器在地理上离你越近,它向你返回信息的时间就越短。简单的物理规律则告诉我们:电缆越长,数据延迟越高。
traceroute
命令当你想要在互联网上到访某个主机时,数据首先会经过家庭路由器,然后到达你的运营商网络,再穿过上层的网络路由器,以此类推,直到最终连通主机。
你是否曾想过:数据包需要经过哪些步骤才能做到这一点?
traceroute
命令就是为此而生的。
你可以调用
traceroute <host>
它将会(缓慢地)在数据包旅行时收集所有相关信息。
以下的例子中,我将尝试用 traceroute flaviocopes.com
到访我的博客:
通常,我们可以看到主机名、IP 地址以及一些性能指标。但并不是所有经过的路由器都会向我们返回信息,此时,traceroute
会输出 * * *
。
每个路由器都可以看到 3 个样本,这意味着 traceroute 默认尝试了 3 次,让你很好地了解到达主机所需的时间。
这就是对服务器执行 traceroute
比简单地执行 ping
要花更多时间的原因。
你可以用 -q
参数自定义尝试的次数:
traceroute -q 1 flaviocopes.com
clear
命令输入 clear
来清除当前终端之前执行的所有命令。
此时屏幕会被清理,你将只看到顶部的提示:
提示:这个命令有个好用的快捷键:
ctrl-L
不过,一旦使用了这个命令,你将不能用鼠标滚轮查看此前输入的命令。
因此你可能更想使用 clear -x
,这个参数可以在清理屏幕的同时,保留之前的终端输入,向上滚动鼠标即可回溯查看。
history
命令每次运行命令,都会在历史中保存一条记录。
你可以输入下面的命令来查看所有历史记录:
history
这会显示带有序号的历史记录:
你可以使用 !<命令序号>
重现已经储存在历史记录中的命令。以上的例子中,输入 !121
会重现 ls -al | wc -l
命令。
通常,历史记录会保留最后执行的 500 条命令。
你可以将这个命令与 grep
结合使用,以找到之前运行的命令:
history | grep docker
history -c
即可。export
命令export
命令用来向子进程输出变量。
这是什么意思呢?
假设你像下面这样定义一个 TEST 变量:
TEST='test'
你可以用 echo $TEST
输出它的值:
但如果你尝试用以上命令,定义一个名为 script.sh
的 Bash 脚本:
然后设定 chmod u+x script.sh
,并输入 ./script.sh
执行脚本。此时,再执行 echo $TEST
将不会输出任何内容!
这是因为在 Bash 中,TEST
被定义为局部变量。当执行一个 Shell 脚本或其他命令时,Bash 会为其单独启动一个子 Shell,这个子 Shell 不会包含当前 Shell 的局部变量。
如果想让变量在子 Shell 中仍然起作用,则不能使用以下命令定义 TEST
:
TEST='test'
而是要这样:
export TEST='test'
尝试以上命令,然后执行 ./script.sh
,现在 'test' 应该可以输出了:
PATH
变量。此时就需要像下面这样:export PATH=$PATH:/new/path
当你在终端中直接建立新变量时,通常会使用 export
。此外,当你在 Bash 的 .bash_profile
或 .bashrc
配置文件,或 Zsh 的 .zshenv
配置文件中定义变量时,也可以使用它
要想删除一个变量,使用 -n
参数即可:
export -n TEST
不带参数调用 export
,会列举当前已经输出的所有变量。
crontab
命令Cron 作业通常指定期运行的作业。凭借它们,你可以让任一命令在每小时、每天、每两周或是周末执行。
它们非常强大,特别是在服务器上执行维护或自动化任务时。
crontab
命令是处理 Cron 作业的入口。
你能够做的第一件事是探索你定义了哪些 Cron 作业:
crontab -l
此处你可能像我一样,什么都没见到:
运行
crontab -e
来编辑已有的 Cron 作业,或是添加新的作业。
默认情况下,它会用系统默认编辑器(通常是 vim
)打开。我更喜欢 nano
。你可以用下面这条命令切换不同的编辑器:
EDITOR=nano crontab -e
现在,你可以为每个 Cron 作业添加一行配置。
定义作业的语法有些吓人。因此我常用一个网站来帮助我生成配置而不出错:https://crontab-generator.org/
此处,你为 Cron 作业选择一个时间间隔,之后输入要执行的命令。
我选择每 12 小时运行来自 /Users/flavio/test.sh
的脚本。以下是我需要执行的 crontab 配置行:
* */12 * * * /Users/flavio/test.sh >/dev/null 2>&1
我运行 crontab -e
:
EDITOR=nano crontab -e
然后添加以上配置行,之后按下 ctrl-X
然后再按 y
保存。
如果一切顺利,那么 Cron 作业就设置好了:
一旦完成,你可以运行以下命令查看当前激活的 Cron 作业列表:
crontab -l
要删除 Cron 作业,只需再一次运行 crontab -e
,删除相应配置行,保存并退出编辑器即可。
uname
命令不带任何参数执行 uname
将会返回当前操作系统的代号:
参数 m
可以显示硬件名称(本例中为 x86_64
),而参数 p
会输出处理器架构名称(本例中为 i386
):
参数 s
输出操作系统名称,参数 r
输出当前发布版本的名称,而参数 v
输出版本号:
参数 n
输出网络节点,也就是当前主机的名称:
参数 a
则会输出所有可用的信息:
在 macOS 上,你还可以使用 sw_vers
命令,输出更多关于操作系统的信息。注意这和上方 Darwin (内核)的版本 19.6.0
不同。
Darwin 是 macOS 内核的名称。内核是操作系统的“核心”,而操作系统作为一个整体称为 macOS。在 Linux 中,Linux 是内核名称,而 GNU/Linux 才是操作系统名称(尽管我们会习惯性称其为 'Linux')。
env
命令env
命令可以用来传递环境变量,而不需要在外部环境(例如当前 Shell 中)设置它们。
假设你想运行一个 Node.js 应用,同时要为它设置名为 USER
的变量。
你可以运行
env USER=flavio node app.js
此时,Node.js 应用可以通过 Node 的 process.env
接口访问 USER
这个环境变量。
你也可以通过附加 -i
参数,清除所有已经设置的环境变量:
env -i node app.js
这种情况下,你有可能得到一个错误提示 env: “node”: 没有那个文件或目录
,这是由于 Shell 用来查找共用命令路径的 PATH
变量已被卸除,导致 node
命令无法找到。
因此你需要把完整的路径传递给 node
程序:
env -i /usr/local/bin/node app.js
我们用带有以下内容的 app.js
文件来试试:
console.log(process.env.NAME)
console.log(process.env.PATH)
你将会看到这样的输出:
undefined
此时你可以传递一个 env 变量:
env -i NAME=flavio node app.js
然后输出会变成:
flavio
undefined
去掉 -i
参数会让 PATH
变量在应用中再次可用:
如果不带参数运行 env
命令,它还可以用来列出所有环境变量:
env
它会返回已设置的环境变量的列表,例如:
HOME=/Users/flavio
LOGNAME=flavio
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
PWD=/Users/flavio
SHELL=/usr/local/bin/fish
你还可以使用 -u
参数,即可让某个变量在你运行的应用中无法访问。例如,下面的命令移除了当前环境中的 HOME
变量:
env -u HOME node app.js
printenv
命令以下是 printenv
命令的快速指南,他可以用来输出环境变量对应的值。
任何 Shell 中都有大量的环境变量,有的是系统设置的,有的是你自己的 Shell 脚本或配置所产生的。
你可以使用 printenv
命令,将它们全部打印到终端中。输出大概就像下面这样:
HOME=/Users/flavio
LOGNAME=flavio
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
PWD=/Users/flavio
SHELL=/usr/local/bin/fish
通常还会多几行。
你可以传递一个变量名作为参数,只显示指定变量的值:
printenv PATH
感谢你阅读这份命令指南。
我希望它会激发你去学习更多关于 Linux 及其能力的知识。这些知识就像是一棵常青树,不会很快过时。
请记住,如果你愿意,随时可以免费下载这本书的 PDF、ePUB、Mobi 版本!
如果想查看更多类似的精彩内容,我每天会在我的网站 flaviocopes.com 上发布编程教程。
原文链接:https://www.freecodecamp.org/news/the-linux-commands-handbook/
作者:Flavio Copes
联系客服