Bash Shell运行程序

你需要在 Linux 或 Unix 系统上执行某个命令

解决方案

使用 bash 并在提示符下输入命令名。

$ someprog

讨论

这看起来相当简单,某种程度上也的确如此,但是你根本无从知晓其中大量的幕后处理。bash 的基本操作就是载入并运行程序,理解这一点很重要。余下的都是些准备工作。确实,还有 shell 变量、循环控制语句、if/then/else 分支以及各种控制输入和输出的方法,但这些只不过是为程序运行锦上添花而已。
那么从哪里运行程序呢?

bash 使用名为 PATH 的 shell 变量来定位可执行文件。PATH 变量包含了一个目录列表。各个目录之间以冒号(:)分隔。bash 在这些目录中查找命令行上指定的可执行文件。目录的顺序很重要:bash 按照变量中所列出的目录顺序依次查找,选择所找到的第一个同名的可执行文件。

$ echo $PATH
/bin:/usr/bin:/usr/local/bin:.
$

这里显示出 PATH 变量中包含了 4 个目录,其中最后一个目录就是一个点号(称为点号目录,或者干脆就叫点号),代表 Linux 或 Unix 文件系统的当前目录,也就是你当前所处的目录。例如,如果你将文件从别处复制到点号目录(如 cp /other/place/file .),其实就是将该文件复制到当前目录。将点号目录也包含在PATH 变量中是为了告诉 bash,不仅要在其他目录中查找命令,同时也别漏了当前目录(.)。

很多人觉得将点号放进 $PATH 是一种很大的安全风险:别有用心的人会欺骗你执行同名命令的恶意版本(如 ls)。如果将点号放在目录列表的最前面,那么他人的 ls 版本的优先级就高于正常的 ls,你可能不知不觉间就执行了前者。不信?来试试。

$ bash
$ cd
$ touch ls
$ chmod 755 ls
$ PATH=".:$PATH"
$ ls
$

主目录下的 ls 好像突然不工作了。没有看到任何输出。如果用 cd 切换到其他位置(如 cd /tmp),ls 又一切正常了。原因何在?这是因为主目录下有一个名为 ls 的空文件,你执行的其实就是这个 ls(什么都不做,本来就是个空文件),而不是位于 /bin 下正常的 ls 命令。我们演示这个例子时启动的是 bash 的新副本,退出该子 shell 就能摆脱这种混乱的局面,不过你可能想先删除这个伪造的 ls 命令。

$ cd
$ rm ls
$ exit
$

如果进入陌生的目录,同时又将 PATH 设置为先搜索点号目录,是存在潜在危险的,现在你明白了吧?

如果将点号作为PATH 变量中的最后一个目录,至少不会那么容易被骗。当然,要是压根就不将它列入目录列表,那肯定更安全,而且你仍然可以执行当前目录中的命令,在前面加上点号和斜线即可,如下所示:

./myscript

究竟用哪种方法,就看你自己了。

 绝不要将点号目录或可写目录放进 root 的 $PATH 变量中。
 
在调用脚本前,别忘记给脚本文件设置执行权限。

chmod +x myscript

只需要设置一次权限,以后就可以像其他命令一样调用该脚本了。

一些 bash 用户的常见做法是创建个人 bin 目录,这类似于保存可执行文件的系统目录 /bin 和 /usr/bin。你可以将自己喜欢的 shell 脚本和其他定制或私有命令放入个人的 bin 目录中(如果创建于主目录,则路径为~/bin)。然后将该目录加入 $PATH,甚至可以放在目录列表的最前面(PATH=~/bin:$PATH)。这样一来,你既可以拥有自己偏好的定制工具,也不存在误执行陌生人命令的安全风险。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!