1、如何查看文件是否是二进制呢?

  1. # file /bin/bash
  2. ELF 64-bit LSB executable....

注意,这里的elf就是可执行文件的意思。它用于存储linux程序,内部的信息大概包括,计算机指令、数据,计算机在需要的时候把这个文件读取到内存中,cpu就可以从内存一条一条的读取指令来执行了。

  1. # file /etc/init.d/network
  2. Bourne-Again shell script, ASCII text exectable

Bourne-Again表示你的脚本上面第一行声明了#!/bin/bash。如果你将脚本的第一行拿掉,那不管network是什么权限,它只显示ASCII文本文件的信息。

我们可以实验一下:

  1. echo '#!/usr/bin/env node' >> a.js
  2. file a.js # 显示:b.js: Node.js script text executable, ASCII text

这里需要明白ehco 后面的单引号的作用,下面为专门讲解这一块内容

引号和转义

单引号

Bash 允许字符串放在单引号或双引号之中,加以引用。
单引号用于保留字符的字面含义,各种特殊字符在单引号里面,都会变为普通字符,比如星号(*)、美元符号($)、反斜杠(\)等。

  1. $ echo '*'
  2. *
  3. $ echo '$USER'
  4. $USER
  5. $ echo '$((2+2))'
  6. $((2+2))
  7. $ echo '$(echo foo)'
  8. $(echo foo)

上面命令中,单引号使得 Bash 扩展、变量引用、算术运算和子命令,都失效了。如果不使用单引号,它们都会被 Bash 自动扩展。
由于反斜杠在单引号里面变成了普通字符,所以如果单引号之中,还要使用单引号,不能使用转义,需要在外层的单引号前面加上一个美元符号($),然后再对里层的单引号转义。

  1. # 不正确
  2. $ echo it's
  3. # 不正确
  4. $ echo 'it\'s'
  5. # 正确
  6. $ echo $'it\'s'

不过,更合理的方法是改在双引号之中使用单引号。

  1. $ echo "it's"
  2. it's

双引号

双引号比单引号宽松,大部分特殊字符在双引号里面,都会失去特殊含义,变成普通字符。

  1. $ echo "*"
  2. *

上面例子中,通配符*是一个特殊字符,放在双引号之中,就变成了普通字符,会原样输出。这一点需要特别留意,这意味着,双引号里面不会进行文件名扩展。
但是,三个特殊字符除外:美元符号($)、反引号(``)和反斜杠(`)。这三个字符在双引号之中,依然有特殊含义,会被 Bash 自动扩展。

  1. $ echo "$SHELL"
  2. /bin/bash
  3. $ echo "`date`"
  4. Mon Jan 27 13:33:18 CST 2020

上面例子中,美元符号($)和反引号(```)在双引号中,都保持特殊含义。美元符号用来引用变量,反引号则是执行子命令。

  1. $ echo "I'd say: \"hello!\""
  2. I'd say: "hello!"
  3. $ echo "\\"
  4. \

上面例子中,反斜杠在双引号之中保持特殊含义,用来转义。所以,可以使用反斜杠,在双引号之中插入双引号,或者插入反斜杠本身。
换行符在双引号之中,会失去特殊含义,Bash 不再将其解释为命令的结束,只是作为普通的换行符。所以可以利用双引号,在命令行输入多行文本。

  1. $ echo "hello
  2. world"
  3. hello
  4. world

上面命令中,Bash 正常情况下会将换行符解释为命令结束,但是换行符在双引号之中就失去了这种特殊作用,只用来换行,所以可以输入多行。echo命令会将换行符原样输出,显示的时候正常解释为换行。
双引号的另一个常见的使用场合是,文件名包含空格。这时就必须使用双引号,将文件名放在里面。

  1. $ ls "two words.txt"

上面命令中,two words.txt是一个包含空格的文件名,否则就会被 Bash 当作两个文件。
双引号会原样保存多余的空格。

  1. $ echo "this is a test"
  2. this is a test

双引号还有一个作用,就是保存原始命令的输出格式。

  1. # 单行输出
  2. $ echo $(cal)
  3. 一月 2020 1 2 3 ... 31
  4. # 原始格式输出
  5. $ echo "$(cal)"
  6. 一月 2020
  7. 1 2 3 4
  8. 5 6 7 8 9 10 11
  9. 12 13 14 15 16 17 18
  10. 19 20 21 22 23 24 25
  11. 26 27 28 29 30 31

上面例子中,如果$(cal)不放在双引号之中,echo就会将所有结果以单行输出,丢弃了所有原始的格式。

转义

某些字符在 Bash 里面有特殊含义(比如$&*)。

  1. $ echo $date
  2. $

上面例子中,输出$date不会有任何结果,因为$是一个特殊字符。
如果想要原样输出这些特殊字符,就必须在它们前面加上反斜杠,使其变成普通字符。这就叫做“转义”(escape)。

  1. $ echo \$date
  2. $date

上面命令中,只有在特殊字符$前面加反斜杠,才能原样输出。
反斜杠本身也是特殊字符,如果想要原样输出反斜杠,就需要对它自身转义,连续使用两个反斜线(\\)。

  1. $ echo \\
  2. \

上面例子输出了反斜杠本身。
反斜杠除了用于转义,还可以表示一些不可打印的字符。

  • \a:响铃
  • \b:退格
  • \n:换行
  • \r:回车
  • \t:制表符

如果想要在命令行使用这些不可打印的字符,可以把它们放在引号里面,然后使用echo命令的-e参数

  1. $ echo a\tb
  2. atb
  3. $ echo -e "a\tb"
  4. a b

上面例子中,命令行直接输出不可打印字符\t,Bash 不能正确解释。必须把它们放在引号之中,然后使用echo命令的-e参数。
换行符是一个特殊字符,表示命令的结束,Bash 收到这个字符以后,就会对输入的命令进行解释执行。换行符前面加上反斜杠转义,就使得换行符变成一个普通字符,Bash 会将其当作空格处理,从而可以将一行命令写成多行。

  1. $ mv \
  2. /path/to/foo \
  3. /path/to/bar
  4. # 等同于
  5. $ mv /path/to/foo /path/to/bar

上面例子中,如果一条命令过长,就可以在行尾使用反斜杠,将其改写成多行。这是常见的多行命令的写法。

3. 反引号(``)

命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。shell中有两种方法作命令替换:把shell命令用反引号或者$(…)结构括起来,其中,$(…)格式受到POSIX标准支持,也利于嵌套。

  1. # echo The date and time is `date`
  2. The date and time is 6 15 06:10:35 CST 2005
  3. # echo Your current working directory is $(pwd)
  4. Your current working directory is /home/howard/script

开放源代码:就是程序代码,写给人类看的语言,机器并不懂,所以无法执行
编译器:将程序代码转译成为机器看得懂的语言,就类似翻译者的角色
可执行文件:经过编译器变成二进制文件,机器看得懂,所以可以执行

2、函数库

类似子程序的角色,是可以被调用来执行一段功能的函数

3、什么是make与configure

当执行make时,make会在当前的目录下查找Makefile这个文本文件,而Makefile里面则记录了源代码如何编译的详细信息。make会自动地判别源代码是否经过变动了,而自动更新执行文件。

make是一个程序,会去找makefile,那makefile怎么写?通常软件开发商都会写一个检测程序来检测用户的操作环境,以及该操作环境是否有软件开发商所需要的其他功能,该检测程序检测完毕后,就会主动地建立这个makefile的规则文件,通常这个检测程序的文件名为configure

一般来说,检测程序会检测的内容大约有下面这些:

  • 是否有适合的编译器可以编译本软件的程序代码
  • 是否已经存在本软件需要的函数库和其他依赖文件
  • 操作系统平台是否合适
  • 内核的头文件是否存在

4、什么是Tarball的软件

其实就是讲软件的源代码先以tar打包,然后以压缩技术压缩,通常最常见的是gzip来压缩。利用tar与gzip的功能,所以tarball文件一般的拓展名就会写成.tar.gz 和.tgz,不过近来由于bizp2和xz的压缩更佳,因此文件名也会变为tar.bz2\tar.xz之类的