原题目地址:http://bbs.chinaunix.net/viewthread.php?tid=476260
[ SHELL 水平测试 ][ OVERVIEW 篇 ]
1. 有很多种 shell, 你熟悉几种? 各个 shell 的 home page 在那里?
请参考:
UNIX shells
Bourne shell (sh)
Almquist shell (ash)
Debian Almquist shell (dash)
Bourne-Again shell (bash)
Friendly interactive shell (fish)
Korn shell (ksh)
C shell (csh) http://netlab.cse.yzu.edu.tw/~statue/freebsd/docs/csh http://www.grymoire.com/Unix/CshTop10.txt
TENEX C shell (tcsh)
Es shell (es)
esh (Unix) Easy Shell
rc shell (rc) - shell for Plan 9 and Unix
runscript The initial shell interpreter used to process startup scripts in Gentoo
scsh (Scheme Shell)
Stand-alone Shell (sash)
Z shell (zsh)
2. 为什么说 zsh 是目前为止功能最为强大的 shell.
请参考:
3. 为什么说 pdksh 功能较弱?
请参考:
4. ksh88 与 ksh93 有何区别?
请参考:
5. 为什么 shell 编程最好用 ksh?
它完全向上兼容 Bourne shell 并包含了 C shell 的很多特性。
6. 你的系统都有哪些 shell? 版本是多少?
(1)Bourne Shell是AT&T Bell实验室的 Steven Bourne为AT&T的Unix开发的,它是Unix的默认Shell,也是其它Shell的开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户的交互方面不如其它几种Shell。
(2)C Shell是加州伯克利大学的Bill Joy为BSD Unix开发的,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。
(3)Korn Shell是AT&T Bell实验室的David Korn开发的,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。
(4)Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。
(2)C Shell是加州伯克利大学的Bill Joy为BSD Unix开发的,与sh不同,它的语法与C语言很相似。它提供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与BourneShell并不兼容。
(3)Korn Shell是AT&T Bell实验室的David Korn开发的,它集合了C Shell和Bourne Shell的优点,并且与Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和编程交互界面都很好。
(4)Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。
7. 你知道 POSIX 吗?最新版本是多少?和你的 shell 有什么关系?
POSIX是IEEE为要在各种UNIX操作系统上运行的软件而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE 1003
,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由Richard Stallman应
IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统界面)的
缩写,而X则表明其对Unix API的传承。
Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。
微软的Windows NT至少部分实现了POSIX兼容。
POSIX在源代码级别上定义了一组最小的Unix(类Unix)操作系统接口。
8. /sbin/sh 和 /bin/sh 有何区别?
/sbin/sh and /usr/bin/sh shells 都是 Bourne shells.
/sbin/sh is statically linked
/usr/bin/sh is dynamically linked.
/bin/sh /bin目录是到/usr/bin的链接
9. 你分析过 1000 行以上的 shell 程序吗?
略
10. 各种 shell 的变量名长度有何限制?
请参考:
11. 各种 shell 的 array size 有何限制?
请参考:
12. FIFO 比 co-process 有什么优点?
FIFO is an acronym for First In, First Out
It copys one specified file to multiple "unique"(filter those different pathnames which in fact point to the same
physical path) paths with parallelism in bash. In contrast to sequential copy processes, it performs well under
multiprocessor systems.
The efficiency of Co-process is normally determined by three factors:
1.Whether CPU bound or not
2.Whether scientific data processing or not
3.Whether I/O or not
13. (..) 产生的 subshell 与调用另一个脚本产生的 subshell 有何不同?
执行shell script与subshell
两种方法:
唤起新shell再执行shell scripts
在目前shell执行shell scripts
唤起另一个shell来执行的scripts在scripts档头最前面前要加
#! /bin/sh
第一种方法是在shell script 文字档前指出shell scripts解读的程式在那(也就是 我们的shell)然后把文字档的执行权限打开,照一般执行可执行档方式执行或者叫 一个shell来解释文字档test.sh。
$ test.sh
$ /bin/sh test.sh
$ ( . test.sh; )
$ exec test.sh
第二种方法是用命令''.''或者source执行。
$ . test.sh
$ source test.sh
$ { test.sh; }
$ eval '. test.sh'
差别在於一些设定只有在这个shell下的才算数,而唤起另一个shell就是另一个 不相干的世界, 也就是用第一种方法执行的script中变数的设定,不会影响到原来的shell变数。 这个相当重要。ksh没有source这个命令,所以最好不要用source。 中括号( )表示用另一个subshell大括号,{ }表示用目前shell。例如
$ ( VAR='testvar'; )
$ echo $VAR
$ { VAR='testvar'; }
$ echo $VAR
testvar
只有{ }内的VAR中的值被设定。其中用 . 的方法要很小心, 不要在script裡面用
$ . test.sh arg1 arg2
因為arg1 arg2会继承呼叫这个script的arg1 arg2来,用 . 的方式最好是要执行 的script只是一团script library不带参数。 另外如果 . test.sh执行,test.sh离开时,呼叫. test.sh的shell也跟著离开。
shell何时在子shell中执行命令?
A: 在此我们主要讨论Bourne shell及其兼容shell。在许多情况下shell会在子shell中执行命令:
1.(...)结构
小括号内的命令会在一个子shell环境中执行,命令执行的结果不会影响当前的shell环境。需要注意是此时变量$$会显示当前shell的进程id,而不是子shell的进程id。
参考:
{...;}结构中的命令在当前shell中执行,(内部)命令执行的结果会影响当前的shell环境。
A: 在此我们主要讨论Bourne shell及其兼容shell。在许多情况下shell会在子shell中执行命令:
1.(...)结构
小括号内的命令会在一个子shell环境中执行,命令执行的结果不会影响当前的shell环境。需要注意是此时变量$$会显示当前shell的进程id,而不是子shell的进程id。
参考:
{...;}结构中的命令在当前shell中执行,(内部)命令执行的结果会影响当前的shell环境。
14. shell 中的函数可以递归吗?设计时要注意什么?
Bash 中的递归函数
15. 如何用 subshell 产生的多个值改变多个 shell 中的变量?
怎样把子shell中的变量传回父shell?如(echo "$a") read b不能工作,如何找到一个替代方案?下面给出一些可能的方案:
a.使用临时文件
...
#in subshell
a=100
echo "$a">tmpfile
...
#in parent
read b
b.使用命名管道
mkfifo pipef
(...
echo "$a" > pipef
...)
read b
c.使用coprocess(ksh)
( echo "$a" &)
read -p b
d.使用命令替换
b=`echo "$a"`
e.使用eval命令
eval `echo "b=$a"`
f.使用here document
read b <`echo "$a"`
END
g.使用here string(bash/pdksh)
read b <<<`echo "$a"`
a.使用临时文件
...
#in subshell
a=100
echo "$a">tmpfile
...
#in parent
read b
b.使用命名管道
mkfifo pipef
(...
echo "$a" > pipef
...)
read b
c.使用coprocess(ksh)
( echo "$a" &)
read -p b
d.使用命令替换
b=`echo "$a"`
e.使用eval命令
eval `echo "b=$a"`
f.使用here document
read b <`echo "$a"`
END
g.使用here string(bash/pdksh)
read b <<<`echo "$a"`
16. File pattern 与 regular expression 有什么不同?
略
17. shell 中含有大量文档.不想在每行之前用 # 注释.有那两种方法可以实现?
方法一:
:<<BLOCK
shell
BLOCK
shell
BLOCK
方法二:
if then fi 结构来屏蔽
27. cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a
undefined
把文件描述符2重定向到a,即把错误输出存到file中cmd >a 2>&1
undefined
把标准错误重定向到标准输出,再重定向到a,即stderr和stdout都被输出到file中以下题目暂无答案
18. 用 shell 程序安装配置一个二进制可执行软件.希望将被安装软件含在 shell 程序中形成一个安装文件,可以吗?
19. 可以在一个shell 程序里包含 ksh 及perl两种代码吗?
20. 如何保证shell 程序只有单一instance 运行?(有难度, 绝非一个 ps 命令可以搞定)
21. 当有同名的 alias, function, builtin command, external command 时,如何知道并控制其运行顺序?
22. 如何在自定义function中调用同名的builtin command ?
23. 怎样运行各种 shell 时具有login shell 的行为?
24. 为何 ksh, rksh, pfksh 都是同一个hard link? 功能却不同?
25. 当 while read .. 这样的语句用于pipe右侧时,需注意什么?
26. 对于多个相连的 pipe,最后的返回码是 pipe 中那个命令的? 如何取得所有命令的返回码?
28. Stdin, Stderr 可以关闭吗? 有什么结果?
29. GNU tools 与其他Unix 上的相比有什么特点?为什么说不能过分依赖 GNU 扩展?
30. VI及 VIM 对行长度及 file size 有什么限制?
31. 请写出对 field 1(数字),field 3 (数字倒序),field 3 (ascii) 进行排序的完整语句.
32. 如何用diff及其他工具写一个版本控制系统?(要有check in, check out, file lock .. 等功能)
没有评论:
发表评论