创建Linux外部命令,linux 内建命令内部命令 pidof echo 文件系统类 cd push

内建命令指的就是包含在Bash

工具集中的命令.这主要是考虑到执行效率的问题--

内建命令将比外部命令的执行得更快,

外部命令通常需要fork 出一个单独的进程来执行.

另外一部分原因

是特定的内建命令需要直接存取 shell 内核部分.

当一个命令或者是 shell 本身需要初始化(或者创建)

一个新的子进程来执行一个任务的时候,这

种行为被称为 forking.这个新产生的进程被叫做子进程,

并且这个进程是从父进程中分离出来

的.当子进程执行它的任务时,同时父进程也在运行.

注意:当父进程取得子进程的进程ID 的时候,父进程可以传递给子进程参数,而反过来则不行.

这将产生不可思议的并且很难追踪的问题.

pidof

是Linux系统中用来查找正在运行进程的进程号(pid)的工具,功能类似pgrep和ps

什么是pidof命令?

#man pidof中的解释:

pidof — find the process ID of a running program.

pidof–用于查找一个运行的程序的PID。

pidof is actually the same program as killall5;

[root@GoGo ~]# ls -l /sbin/pidof

lrwxrwxrwx. 1 root root 8 Aug 25 00:40 /sbin/pidof -> killall5

//的确如此。

参数:

-s 表示只返回1个 pid

-x 表示同时返回运行给定程序的 shell 的 pid

-o 表示告诉 piod 表示忽略后面给定的 pid ,可以使用多个 -o 。

pidof is simply a (symbolic) link to the killall5 program, which

should also be located in /sbin.

When pidof is invoked with a full pathname to the program it

should find the pid of, it is reasonably safe. Otherwise it

is possible that it returns pids of running programs that happen

to have the same name as the program you’re after but are

actually other programs.

如果 是一个 fullpath 则 pidof 不会出错,但如果不是则有可能返回和给定同名的程序。

还是看实例吧。

[root@GoGo ~]# pidof nginx

1476 1475 1473 1472 1471 1470 1469 1467 1466

[root@GoGo ~]# ps -ef | grep nginx

[root@GoGo ~]# ps -ef | grep nginx | awk ’{print $2}’

1450

1451

1452

1453

1454

1466

1467

1469

1470

1471

1472

1473

1475

1476

2237

[root@GoGo ~]# pidof -s nginx

[root@GoGo ~]# pidof sshd

[root@GoGo ~]# ps -ef | grep sshd

Script#########################################

一般的,脚本中的内建命令在执行时将不会fork

出一个子进程.但是脚本中的外部或过滤命令

通常会 fork 一个子进程.

关键字的意思就是保留字.对于shell

来说关键字有特殊的含义,并且用来构建shell 的语法结构.

比如,"for","while","do"和"!"都是关键字.与内建命令相同的是,关键字也是Bash 的骨干部分,

但是与内建命令不同的是,关键字自身并不是命令,而是一个比较大的命令结构的一部分.[1]

echo

打印(到stdout)一个表达式或变量(见Example 4-1).

1 echo Hello

2 echo $a

echo 需要使用-e 参数来打印转移字符.见Example 5-2.

一般的每个 echo 命令都会在终端上新起一行,但是-n 选项将会阻止新起一

$IFS(内部域分隔符)一般都会将\n(换行符)包含在它的空白字符集合中.Bash 因此会根据

参数中的换行来分离命令的输出.然后echo 将以空格代替换行来输出这些参数.

bash$ ls -l /usr/share/apps/kjezz/sounds

-rw-r--r-- 1 root root 1407 Nov 7 2000 reflect.au

-rw-r--r-- 1 root root 362 Nov 7 2000 seconds.au

Script#########################################

注意: 这个命令是shell 的一个内建命令,与/bin/echo 不同,虽然行为相似.

bash$ type -a echo

echo is a shell builtin

echo is /bin/echo

printf

printf 命令,格式化输出,是echo 命令的增强.它是C 语言printf()库函数的一个有限的变形,

并且在语法上有些不同.

printf format-string... parameter...

这是 Bash 的内建版本,与/bin/printf 或/usr/bin/printf 命令不同.想更深入的了解,请

察看 printf(系统命令)的man 页.

28 echo

29

30 Pi12=$(printf "%1.12f" $PI)

31 echo "Pi to 12 decimal places = $Pi12"

32

33 Msg=`printf "%s %s \n" $Message1 $Message2`

34 echo $Msg; echo $Msg

35

36 # 向我们看到的一样,现在'sprintf'函数可以

使用 printf

的最主要的应用就是格式化错误消息.

1 E_BADDIR=65

2

3 var=nonexistent_directory

4

5 error()

6 {

7 printf "$@" >&2

8 # 格式化传递进来的位置参数,并把它们送到stderr.

9 echo

10 exit $E_BADDIR

11 }

12

13 cd $var || error $"Can't cd to %s." "$var"

14

15 # Thanks, S.C.

read

read

从 stdin 中读取一个变量的值,也就是与键盘交互取得变量的值.使用-a 参数可以取得数组

一个不带变量参数的 read 命令,将把来自键盘的输入存入到专用变量$REPLY 中.

Example

9 echo "\"var\" = "$var""

10 # 到这里为止,都与期望的相同.

11 # -------------------------- #

12

13 echo

14

15 #

-------------------------------------------------------------------

#

16 echo -n "Enter another value: "

17 read # 没有变量分配给'read'命令,因此...

18 #+ 输入将分配给默认变量,$REPLY.

19 var="$REPLY"

20 echo "\"var\" = "$var""

21 # 这部分代码和上边的代码等价.

22 #

-------------------------------------------------------------------

#

23

24 echo

read -r var2 # -r

选项将会让"\"转义.

read 命令有些有趣的选项,这些选项允许打印出一个提示符,然后在不输入的情况

下,可以读入你的按键字符.

1 # Read a keypress without hitting ENTER.

1 # 不敲回车,读取一个按键字符.

2

3 read -s -n1 -p "Hit a key " keypress

4 echo; echo "Keypress was "\"$keypress\""."

5

6 # -s 选项意味着不打印输入.

7 # -n N 选项意味着直接受N 个字符的输入.

6 # -s 选项意味着不打印输入.

7 # -n N 选项意味着直接受N 个字符的输入.

8 # -p 选项意味着在读取输入之前打印出后边的提示符.

read 的-n 选项也可以检测方向键,和一些控制按键.

19 #

如果不是上边列表所列出的按键,可能还是需要按回车.(译者:因为一般按键是一个字符)

20 read -n3 key # 读3 个字符.

注意: 对read 命令来说,-n 选项将不会检测ENTER(新行)键.

read 命令的-t 选项允许时间输入(见Example 9-4).

read 命令也可以从重定向的文件中读入变量的值.如果文件中的内容超过一行,那么只有第

一行被分配到这个变量中.如果read 命令有超过一个参数,那么每个变量都会从文件中取得

以定义的空白分隔的字符串作为变量的值.小心!

功能说明:显示文字。

语   法:echo [-ne][字符串]或 echo [--help][--version]

补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。

参   数:-n 不要在最后自动换行

-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般

文字输出:

\a 发出警告声;

\b 删除前一个字符;

\c 最后不加上换行符号;

\f 换行但光标仍旧停留在原来的位置;

\n 换行且光标移至行首;

\r 光标移至行首,但不换行;

\t 插入tab;

\v 与\f相同;

\\ 插入\字符;

\nnn 插入nnn(八进制)所代表的ASCII字符;

--help 显示帮助

--version 显示版本信息

文件系统类

cd

cd,修改目录命令,在脚本中用得最多的时候就是,命令需要在指定目录下运行时,需要用cd

修改当前工作目录.

1 (cd /source/directory && tar cf - . ) | (cd

/dest/directory && tar xpvf -)

[之前有个例子,Alan Cox 写的]

-P(physical)选项的作用是忽略符号连接.

cd - 将把工作目录改为$OLDPWD,就是之前的工作目录.

注意:当我们用两个/来作为cd 命令的参数时,结果却出乎我们的意料.

bash$ cd //

bash$ pwd

//

输出应该,并且当然是/.无论在命令行下还是在脚本中,这都是个问题.

pwd

打印当前的工作目录.这将给用户(或脚本)当前的工作目录(见Example 11-9).使用这个

命令的结果和从内键变量$PWD 中读取的值是相同的.

pushd, popd, dirs

这几个命令可以使得工作目录书签化,就是可以按顺序向前或向后移动工作目录.

压栈的动作可以保存工作目录列表.选项可以允许对目录栈作不同的操作.

pushd dir-name 把路径dir-name 压入目录栈,同时修改当前目录到dir-name.

popd 将目录栈中最上边的目录弹出,同时修改当前目录到弹出来的那个目录.

dirs 列出所有目录栈的内容(与$DIRSTACK 便两相比较).一个成功的pushd 或者popd 将会

自动的调用 dirs 命令.

对于那些并没有对当前工作目录做硬编码,并且需要对当前工作目录做灵活修改的脚本来说

,使用这些命令是再好不过的了.注意内建$DIRSTACK 数组变量,这个变量可以在脚本内存取,

并且它们保存了目录栈的内容.

Example

变量类

let

let 命令将执行变量的算术操作.在许多情况下,它被看作是复杂的expr 版本的一个简化版.

eval

eval arg1 [arg2] ... [argN]

将表达式中的参数,或者表达式列表,组合起来,并且评估它们.包含在表达式中的任何变量

都将被扩展.结果将会被转化到命令中.这对于从命令行或者脚本中产生代码是很有用的.

bash$ process=xterm

bash$ show_process="eval ps ax | grep $process"

bash$ $show_process

1867 tty1 S 0:02 xterm

2779 tty1 S 0:00 xterm

2886 pts/1 S 0:00 grep xterm

set

set 命令用来修改内部脚本变量的值.一个作用就是触发选项标志位来帮助决定脚本的行

为.另一个应用就是以一个命令的结果(set `command`)来重新设置脚本的位置参数.脚本

将会从命令的输出中重新分析出位置参数.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值