1、
#!/bin/ksh
#name:testdir
echo $0
program=`basename $0`
program_dir=`dirname $0`
echo "program= $program"
echo "program_dir=$program_dir"

if [ `echo "$0"|grep -c "/" ` -gt 0 ] ; then
        cd ${0%/*}
fi

#如果文件名中有"/",则去掉最后的文件名字进入目录中

pwd

解析:
在这里,由于这是一个脚本文件,我需要执行这个文件,运行./testdir 。我得到结果program=testdir program_dir=.
pwd=home/npp/a/b/c。
由此可知,$0 接收到的是当前的文件名,我将当前目录pwd改为home/npp时,运行 ./a/b/c/test.dir 得到的结果是program=teatdir program_dir=./a/b/c
命令功能:
$0 表示输入的文件名字,
pwd 显示当前目录,
basename提取所给路径的最后一项,一般用来提取文件名,
dirname 显示除了最后一项的其他项,一般用来显示路径 ,
grep -c 只输出匹配行的计数
-gt 大于
${0%/*} 将第一个输入参数即脚本本身名字中的后缀/XXX删掉,
 相当于dirname

 

2、

#!/bin/ksh
#name:1.sh
A=B
echo "\n\n\nPID for 1.sh before exec/source/fork:$$"
export A
echo "1.sh:\$A is $A"
case $1 in
    exec)
        echo "using exec..."
        exec ./2.sh;;
    source)
        echo "using source..."
        . ./2.sh;;
    *)
        echo "using fork by default..."
        ./2.sh;;
esac
echo "PID for 1.sh after exec/source/fork:$$"
echo "1.sh:\$A is $A"
echo "\n\n\n"

#!/bin/bash
#name:2.sh
echo "PID for 2.sh:$$"
echo "2.sh get \$A=$A from 1.sh"
A=C
export A
echo "2.sh:\$A is $A"

运行命令:./1.sh fork
运行结果:
PID for 1.sh before exec/source/fork:9638
1.sh:$A is B
using fork by default...
PID for 2.sh:9640
2.sh get $A=B from 1.sh
2.sh:$A is C
PID for 1.sh after exec/source/fork:9638
1.sh:$A is B

运行命令:./1.sh exec
运行结果:
PID for 1.sh before exec/source/fork:10330
1.sh:$A is B
using exec...
PID for 2.sh:10330
2.sh get $A=B from 1.sh
2.sh:$A is C

运行命令:./1.sh source
运行结果:
PID for 1.sh before exec/source/fork:11149
1.sh:$A is B
using source...
PID for 2.sh:11149
2.sh get $A=B from 1.sh
2.sh:$A is C
PID for 1.sh after exec/source/fork:11149
1.sh:$A is C

解析:由结果可知,source 调用新脚本是在当前行程中进行的,当新脚本中的变量值改变时,当前行程中的值也会改变,新脚本结束时,回到当期脚本继续运行   . ./2.sh
fork 是在一个新的子行程中进行的,子行程结束回到父行程,子行程中的变量改变不影响父行程中的值  ./2.sh
exec 调用新脚本结束当前脚本,在当前行程中进行,新脚本结束时,程序结束。  调用方法  exec ./2.sh
$$ 当前进程ID