Contents
  1. 1. 可执行文件

写属于你的命令行(CLI)工具

可执行文件

我们在平时使用Linux和类Linux的终端时,一般对一些系统指令的使用觉得十分自然,比如查看当前目录下的文件:

1
2
/usr » ls xana@localhost
X11 X11R6 adic bin lib libexec local sbin share standalone

一些非系统指令更是能让我们的操作如鱼得水。

1
2
3
4
5
6
7
8
9
10
11
12
13
~/Documents/lua » tree xana@localhost
.
├── a.lua
├── b.lua
├── f.lua
├── for.lua
├── hw.lua
├── local.lua
├── recursion.lua
├── snake
└── table.lua
1 directory, 8 files

我们知道可以通过编译执行脚本文件

1
2
~/Documents/lua » lua hw.lua xana@localhost
hello world!

也可以通过改变文件权限把文件直接变成可执行文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
~/Documents/lua » chmod a+x hw.lua xana@localhost
------------------------------------------------------------
~/Documents/lua » l xana@localhost
total 80
drwxr-xr-x 12 xana staff 408B 11 2 16:09 .
drwx------+ 42 xana staff 1.4K 11 2 11:01 ..
-rw-r--r--@ 1 xana staff 6.0K 9 11 10:33 .DS_Store
-rw-r--r-- 1 xana staff 31B 9 10 23:34 a.lua
-rw-r--r-- 1 xana staff 34B 9 10 23:37 b.lua
-rw-r--r-- 1 xana staff 58B 9 11 00:01 f.lua
-rw-r--r-- 1 xana staff 91B 9 11 00:28 for.lua
-rwxr-xr-x 1 xana staff 41B 11 2 16:09 hw.lua
-rw-r--r-- 1 xana staff 86B 9 11 00:03 local.lua
-rw-r--r-- 1 xana staff 152B 9 11 00:43 recursion.lua
drwxr-xr-x 2 xana staff 68B 9 11 10:32 snake
-rw-r--r-- 1 xana staff 45B 9 11 01:03 table.lua
------------------------------------------------------------
~/Documents/lua » ./hw.lua xana@localhost
hello world!

-rwxr-xr-x 就表示现在此文件可以执行了。

当然文件中需要加上一行用于脚本解释器
hw.lua

1
2
#!/usr/bin/env lua
print("hello world!")

但是我们现在只能通过

1
./hw.lua

这种 路径/文件 方式执行文件,要是我想通过文件名直接执行文件怎么办?

我们尝试

1
2
3
4
5
6
7
8
9
10
~/Documents/lua » where ls xana@localhost
ls: aliased to ls -G
/bin/ls
------------------------------------------------------------
~/Documents/lua » where cd xana@localhost
cd: shell built-in command
/usr/bin/cd
------------------------------------------------------------
~/Documents/lua » where mkdir xana@localhost
/bin/mkdir

发现一些系统级命令存在于 /bin 和 /usr/bin 目录下,进入文件夹后发现其内容无法进行更改,这些命令数量有限,受到系统的保护。
然后我们尝试一些非系统级命令。

1
2
3
4
5
~/Documents/lua » where node xana@localhost
/usr/local/bin/node
------------------------------------------------------------
~/Documents/lua » where tree xana@localhost
/usr/local/bin/tree

我们把脚本文件移动至 /usr/local/bin 文件夹中

1
~/Documents/lua » mv hw.lua /usr/local/bin

发现可以执行了。

1
2
~/Documents/lua » hw.lua xana@localhost
hello world!

其实文件并不需要文件名,可去掉后缀名。

1
2
~/Documents/lua » hw xana@localhost
hello world!

我们总结一下全过程
1、新建一个脚本文件,文件名为你想要执行的脚本名称
2、脚本首行添加一行 脚本解释器目录
3、次行开始写脚本语言
4、修改文件权限,变成可执行文件
5、将文件移动至 /usr/local/bin

实际上我们查看系统环境变量

1
2
~/Documents/lua » env $PATH xana@localhost
env: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Server.app/Contents/ServerRoot/usr/bin:/Applications/Server.app/Contents/ServerRoot/usr/sbin:/Users/xana/Documents/quick-3.5/templates:/Users/xana/Documents/quick-3.5:/Users/xana/Documents/quick-3.5/tools/cocos2d-console/bin: No such file or directory

发现它是按照这个顺序查找路径的。所以覆盖等问题转换为路径优先问题。

——————————11.10更新——————————-

从上次听了东豪的讲座之后,发现其实过程5是有更好的替代方案的,就是把脚本路径添加到系统环境中去,比如当前的路径是url,则执行

1
export PATH=$PATH: /url/

这样就可以直接在/url/中执行了脚本文件了(临时
想要永久加入系统环境的话,把这句话加到 /etc/profile 中。记得使用管理员权限

Contents
  1. 1. 可执行文件