与 Shell 千丝万缕的牵绊

本文前沿

上学那会儿精力旺盛一路折腾 Windows,后来接触了OS X系统,这才使我更专注于做一件事情,而不是时常伴随着折腾,有点啰嗦,那么我们进入正题,当我们在开发软件的时候,常常会用一些命令行来快速执行一些操作,从而提高我们的生产效率,这不得不是去学习一些命令,这里我们说的命令我想没有一个开发者没使用过吧,它其实就是Shell里的概念。

当我在用Windows的时候,为了快速的检测当前主机与目标主机是否联通,会打开”运行”对话框(Win+R),输入 CMD 打开控制台命令窗口,输入命令ping 10.0.0.99,然后就能得到答案,其实这时我们就在使用命令行,CMD就是Command shell的简写,其本质就是一个解释器性的Shell(壳),目的是将用户的语言(即命令)解释翻译成机器能理解的语言,它包含了一组内置命令,你可以用这些命令来完成一些操作,就如刚才我检测目标主机连通性一样。

对Shell有个大概的印象之后,我们正式来聊聊它。

新手一般有几个疑惑名词:ShellShell命令行提示符Shell脚本Shell编程语言

我们先来说说 Shell

Shell 是用来解决用户如何与操作系统通信的问题,形象的表示: User ↔ Shell ↔ OS

Shell 包含了一组内置命令,可以用这些命令来完成一些操作,例如复制文件、移动文件、重命名文件以及显示和终止系统上正运行的程序。Shell 也允许我们在命令行提示符中输入程序的名称,它会将程序的名称传递给内核以启动它,这里说的一组内置命令也即Shell命令行提示符

我们也可以将 Shell 命令放入文件中作为程序执行。这些文件被称作Shell脚本。我们在命令行上执行的任何命令都可放进一个shell脚本中作为一组命令执行,这为创建那种需要把几个命令放在一起来工作的工具提供了便利,可实现软件工程自动化。

最后一个名词Shell编程语言,它不是单纯的Shell命令,像其它编程语言如: C、JavaScript、Python 等一样,也有变量、函数、运算符、if语句、循环控制,这样复杂化之后,就上升为称之为一门「语言」了。

理清 Shell 编程语言与 Shell 之间的关系

你可能听说过这些玩意儿: sh、bash、csh、zsh,我们也把它们叫做 Shell,但准确的来说应该叫 Shell解释器,这里所说的 Shell 是一种应用程序, 负责解释执行你编写的 Shell 脚本, 跟 Windows 系统里的 CMD 本质差不多,Mac 默认就自带了sh、bash、csh、zsh、tcsh、ksh, 如果你使用 Mac ,那么可以这样打印出来:

cat /etc/shells

目前这个地球上一共存在着约 50 多种不同的Shell解释器,为什么解释器五花八门呢?可能因为牛逼的程序员太多,看到不爽的Shell,就自己重写一套轮子,慢慢的就形成了一些标准。

当前绝大部分 Unix/Linux 和 OS X 操作系统里的默认的 Shell 都是 bash,虽然这么多解释器,不同 Shell解释器 的用法基本相同,但有些 Shell 提供了一些新特性, 比如我现在在用的就是Zsh

想了解更多关于Zsh的使用,请自行搜索Zshoh my zsh关键字。

写一个 Shell 脚本

明白以上名词之间的关系后,我们正式来说说 Shell脚本,打开文本编辑器,新建一个文件 node.sh,扩展名为 sh,代表这个文件是shell,但并不影响脚本执行,顾名思义的作用。

写一个 Node Shell 脚本:

#!/usr/bin/env node
console.log('Hello World!');

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell,依国际惯例这里以在终端里打印一句Hello World !

如何运行 shell 程序

默认终端处于 node.sh 当前目录

  • chmod +x 使文件具有可执行权限, 直接运行

    chmod +x ./node.sh  #使脚本具有执行权限
    ./node.sh #执行脚本,注意路径
  • 直接调用解释器, 将脚本文件作为参数传入 (比如bash node.sh)

    bash node.sh
    # 或者
    /bin/node node.sh

    这种方式运行的脚本,在脚本的第一行指定解释器信息失效

  • 使用source(也可用 . 代替)执行文件

    source node.sh
    # 或者
    . ./node.sh #注意路径

    使用source执行shell脚本时,不会创建子进程,而是在父进程中直接执行!

更多使用方法本文就不详细给出,请参考以下链接:

Shell脚本编程30分钟入门
应该知道的LINUX技巧
Shell脚本编程总结及速查手册
高效 Node.js 开发环境之命令行工具篇

坚持原创技术分享,您的支持将鼓励我继续创作!