免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: r2007
打印 上一主题 下一主题

comp.unix.shell FAQ(转载http://home.comcast.net/~j.p.h/) [复制链接]

论坛徽章:
0
41 [报告]
发表于 2007-07-20 18:51 |只看该作者

怎么都是英文的

论坛徽章:
0
42 [报告]
发表于 2007-08-15 22:06 |只看该作者
vbhgchjngvnfg

论坛徽章:
0
43 [报告]
发表于 2007-12-13 05:41 |只看该作者
又翻译了一小段,看不懂我翻译的就去看英文原著

6.怎么计算日期:
这主要取决于你大脑里的想法
a.怎么获取昨天的日期
        GNU版本的date有很多好用的人性化的新特性,例如
        获取昨天的日期:
                $ date --date yesterday
        获取明天的日期:
                $ date --date tomorrow
GNU版本的date的man文档中,里面有更多的其他选项,可以得到过去的,或者将来的多余一天的日期.
FreeBSD版本的date同样也有很多扩展选项,可以像下面的方法使用.
                         $ date
                         Wed Oct 22 13:48:29 CDT 2003
                                  $ date -v-1d
                          Tue Oct 21 13:45:16 CDT 2003
任意调整TZ变量(这是个时区变量)并不是一个可靠的办法.如果你的确没有GNU版本或者FreeBSD版本的date,确实需要这么做,那么请参考g章节“任意日期算法”

b.关于文件的日期(新旧)#Finding elapsed time
        若你需要测试一个文件的日期是否比另外一个文件的日期早,你可以这么做(在 bash, pdksh, ksh93环境下)
                 $ [[ file1 -ot file2 ]] && echo file1 is older
        或者你也可以使用find命令,查找一个目录下比目标文件旧或者早的文件:
                  $ find . -name '*.c' -newer test.c
c.获取已经用掉的时间 #Finding elapsed time
        如果你想获取已经用掉的时间,也许是因为你想知道某些操作什么时候超时了,一些shell(bash,ksh,zsh)有一个 SECONDS变量,可以告诉你从shell的某个触发条件开始到现在(since the invocation of the shell)一共多少秒,或者从SECONDS变量最后一次被重置的时间到现在一共多少秒.
        ksh93有一个取决于locale的浮动点seconds .
        在zsh4.1或者以上的版本可以定义浮动点:float SECONDS
        在zsh4.1或者以上的版本中同样有一个$EPOCHSECONDS变量,保存从1970-1-1 0:0:0 UTC到现在的秒数(see zsh/datetime module)
       
d.计算闰年
        在公历中,闰年被定义为:可以被4除尽的年份大部分是闰年,能被100整除而不能被400整除的年份不是闰年,这听起来似乎比较麻烦,实际上,我不会有那么大的岁数 .

        在很久以前,欧洲采用的大都为儒略历,只有被4整除的年份才是闰年.
        为了方便和应该的日期相协调,标准的cal程序可以在儒略历和公历从1752年9月之间切换(see cal 9 1752).公历(由罗马教皇格里高利十三世于1582年颁布施行)从1582开始被很多国家使用.
        Ksh可以完成的一些功能(after 1600 AD/CE#注:这里不知道怎么翻译)有:

        isleap()
        {
          y=$1
          four=$(( $y % 4 ))
          hundred=$(( $y % 100 ))
          fourhundred=$(( $y % 400 ))
          if [ $four -eq 0 ];then
            if [ $hundred -eq 0 ];then
              if [ $fourhundred -eq 0 ];then
                echo leap year
              else
                echo not a leap year
              fi
            else
              echo leap year
           fi
         else
           echo not a leap year
         fi
        }

Or, valid with any date with the same calendar switch day as   POSIX cal's (POSIX syntax):

        is_leap_year() # args: year
        # NB: year before year 1 is year -1, not 0.
        {
          [ "$1" -lt 0 ] && set -- "$(($1 + 1))"
            [ "$(($1 % 4))" -eq 0 ] && {
                [ "$(($1 % 100))" -ne 0 ] || [ "$(($1 % 400))" -eq 0 ] \
                      || [ "$1" -le 1752 ]
            }
        }

或者在一些 Bourne shell 中(see COPYING[1]):       
        is_leap_year() { ## USAGE: is_leap_year [year]
          isl_year=${1:-`date +%Y`}
          case $isl_year in
            *0[48] |\
            *[2468][048] |\
            *[13579][26] |\
            *[13579][26]0|\
            *[2468][048]00 |\
            *[13579][26]00 ) _IS_LEAP_YEAR=1
               return 0 ;;
            *) _IS_LEAP_YEAR=0
               return 1 ;;
          esac
        }
在FreeBSD系统中,date使用-f选项来绕过当前年份(假定)中的2月29日,然后再次打印月中的所有天数来确认是否真的有这一天(注意,你同样需要使用-j参数,负责系统会认为你想要重新设置时间):
      if [ $(date -jf%Y%m%d $(date +%Y0229) +%d) = 29 ]; then
        echo Leap year!
      fi
e.计算一个月中的最后一天.
        这里有N种方法可以实现这个要求,下面是讨论组中的一个取样.
        在任何的Bourne-type shell(调用了上面的is_leap_year() 函数,当月份是2的时候)(see COPYING[1]):
       days_in_month() { ## USAGE: days_in_month [month [year]]
          if [ -n "$1" ]
          then
            dim_m=$1
            dim_y=$2
          else
            eval `date "+dim_m=%m dim_y=%Y"`
          fi
          case $dim_m in
            9|09|4|04|6|06|11) _DAYS_IN_MONTH=30 ;;
            1|01|3|03|5|05|7|07|8|08|10|12) _DAYS_IN_MONTH=31 ;;
            2|02) is_leap_year ${dim_y:-`date +%Y`} &&
              _DAYS_IN_MONTH=29 || _DAYS_IN_MONTH=28 ;;
          esac
          [ ${SILENT_FUNCS:-0} -eq 1 ] || echo $_DAYS_IN_MONTH
        }

用GNU date

        year=2003
        month=9
        date -d "$year/$month/1 +1 month -1 day" +%d

在FreeBSD系统中,使用date的-v-1d 选项可以取得下个月的前一天:

        $ MONTH=12
        $ date -v-1d -jf%Y-%m-%d $(date +%Y-$(((MONTH+1)%12))-01) +%d
        31

在shell中使用cal(但是小心执行cal会一次输出多于一个月)
      month=9 ; year=2003   # adjust
        ##
        for lday in `cal $month $year` ; do : ; done
        echo $lday

        ## or
        set -- `cal $month $year` ; eval lday=\${$#}
        echo $lday
        
      In ksh, bash and zsh:

        : $(cal)
        days_in_month=$_

      In zsh:

        days_in_month=${$(cal)[-1]}

f.给出任意一个日期,计算星期几

        Zeller's Rule是一个大家都熟悉的算法,在数据结构与算法中,我们可以找到它的详细解释.相关网页:
        NIST:
        http://www.nist.gov/dads/

      Also, a fuller explanation is available at
        http://www.merlyn.demon.co.uk/zeller-c.htm#ZC

      An example in C, with a short explanation, is given at
        http://wwwcdf.pd.infn.it/MLO/Calendars/Notes.html#zeller
#译者添加 Zeller's Rule: f = k + [(13*m-1)/5] + D + [D/4] + [C/4] - 2*C.   #[]是取整的意思,例如[3.79]=3.k日、m月(三月为首1, 二月为后12)、D年的后2位(一月、二月时要减1)、C百年.

Ksh(ksh93)中:
        dayofweek()
        {
          # Implementation of a homework assignment given at
          # http://carbon.cudenver.edu/~traup/fa02/lec/hw3.html
          #
          # call with day:   1 - 31
          #           month: March = 1, Jan & Feb are months 11 and
          #                  12 of the previous year.
          #           year:  The year of the century
          #           c:     The previous century
          #
          # For example, for July 4, 1989,
          #   m = 5,  d = 4,  y = 89, and c = 19,
          # while for January 25, 1989,
          #   m = 11, d = 25, y = 88, and c = 19.
          #
          # The output is the day of the week with Sunday = 0,
          # Monday = 1, etc.

          d=$1
          m=$2
          y=$3
          c=$4

          A=$(( ($m * 13 - 1) / 5 ))
          B=$(( $y / 4 ))
          C=$(( $c / 4 ))
          D=$(( $A + $B + $C + $d + $y - ($c * 2) ))
          echo $(( $D % 7 ))
        }
在FreeBSD系统中,使用date的-f选项来跳过date中的有趣的天数,+%A 来打印星期几.

g.任意日期计算

        任意日期计算是十分复杂的.一种方法就是调用外部程序.或者用另外一种内置语言编程实现.例如:perl有封装了UNIX时间相关的函数,可以提供更多的方便的功能调用,C语言也可以轻松的实现(see the examples  section). 要记住一点,严格的来说,unix系统里面的时间是有一个范围限制的.从1970年1月1日0:00:00开始到2038年1月19日3:14:07.c程序和perl程序,在这个范围外可能正常工作,也可能不正常工作,这取决于你的程序.
        利用shell自身计算任意日期也不是不可能的,SysAdmin杂志上的一篇文章描述了一种计算方法:
        http://www.samag.com/documents/s=8284/sam0307b/0307b.htm
        在这个地方给了另外一种算法
        http://groups.google.com/groups? ... f%40ogion.it.jyu.fi
在FreeBSD中,date的-f和-v选项覆盖了大部分你想做的东西,但只能计算上面提及,在这个范围内的日期.范围外的日期将不能工作.
        同样,zsh4.1以上的版本有zsh/datetime 模块,提供了变量$EPOCHSECONDS 和strftime函数.

h.获取从新纪元(1970年1月1日午夜)开始的总秒数
        -GNU date 有s%选项可以返回新纪元时间 (epoch time)

        -更好的方法,使用awk.
        awk 'BEGIN {srand(); printf("%d\n", srand())}'
        因为当没有参数输入的时候,srand()默认采用当前的新纪元时间(epoch time)为种子,它同样也返回它的上一个种子的值,所以第二个调用返回了新纪元时间(epoch time).

        注意:旧版本的awk不支持,这需要支持POSIX标准的srand(),例如,在solaris中/usr/bin/awk不支持,但是nawk 或者 /usr/xpg4/bin/awk则支持.

        取决于顺序,若已经被调用过一次了,或者其它情况,则本次调用可能不是第二次调用.
       
        -另外一个方法,使用perl,若你的系统上安装的有的话.
                perl -le 'print time'
        -同样,zsh4.1或者以上的版本具有 zsh/datetime 提供$EPOCHSECONDS变量和strftime函数


7.为什么有人告诉我RTFM?
        因为你没有
        RTFM 是一个网络行话,全称是 "Read The F-ing Manual".
        当有人问一个过去经常被问的问题的时候,并且man文档中有很清晰的答案,回答者已经疲惫于看到有人再次问同样的问题.
        http://catb.org/~esr/jargon/html/R/RTFM.html
        所以, 在你问问题之前,请RTFM(阅读一下man文档或者说man一下),Also, if you're new to the group, search Google Groups
        http://groups.google.com/advanced_group_search
问问题之前,不要直接把你的作业贴上去除非你尝试了很久没有成功完成,并问一些经过思考过的问题,当你认真的思考过一些问题之后,人们大都乐于和你一起讨论你的问题,而不是直接贴个问题问别人要答案


8.怎么创建一个锁文件.
#译者注: <操作系统>课程中应该讲过,原子操作就是可以再细分的操作,而非原子操作就是不能在细分的操作,课程学的早,不太记得了.

        千万要谨慎
        在一个非原子操作中,调度程序可以停止一个进程,并执行另外一个可能具有同样功能或操作的进程.第二个进程,拥有完整的时间片,可能会完成操作,当控制权回到第一个进程中的时候,可能导致混乱.
        避免这个问题的窍门就是做一些原子操作.有两种方法可以实现.一个是创建一个目录代替文件,另一个是创建一个符号链接.两个操作都被POSIX/SUS定义为原子的,事实上,他们的优点是都需要进行相应的系统调用,并且都是原子操作.
        当在NFS分区上创建任何锁文件的时候都要小心,#不太会翻译这两句 NFS pretty much eliminates anything like atomicity(NFS分区对原子操作有更多的排斥作用? .若你想要创建一个锁文件,确保是在你的本地分区上操作,例如/tmp.
        Netscape/Mozilla 使用链接符号的方法创建锁文件(事实上它在用户的家目录创建了它,尽管用户的家目录可能挂在NFS分区上),当它启动的时候它就创建了一个以及其正在运行的IP地址为名字的文件,然后它在试图创建一个名为"lock"并之前那个文件的链接符号,若这个链接已经存在,则link命令会抱错,在脚本中类似下面:
  touch /tmp/xxx
   ln -s /tmp/xxx /tmp/lockfile 2>/dev/null
   ret=$?
   rm /tmp/xxx
   if [ $ret -ne 0 ];then
     echo lockfile already exists
     exit 1
   else
     echo success
   fi

若你安装了procmail程序,另一个命令lockfile 也会一起被安装的.

9.怎么将DOS文件转换为unix文件,反之亦然
        UNIX文本文件以LF ("line-feed" (ASCII 10)字符结尾,而DOS使用两个字符CR LF ("carriage return", "line feed"; ASCII 13, 10).
        把DOS文件转换为UNIX文件,删除行末尾的CR字符(control-M) 即可,把UNIX文件转换为DOS文件,则在行末尾添加CR字符.
        两个删除CR字符的方法:
      sed 's/^M$//' dos.txt > unix.txt
      tr -d '\r' < dosfile > unixfile
       
        添加方法:
      sed 's/$/^M/' unix.txt > dos.txt
        注意 "^M"在这里是个内部控制字符,(CR,ASCII 13),许多shell允许输入内部控制字符,但要先输入^V 字符 (control-V), 结果如下:
        用 ^V^M  # 输入"^M".
尽管如此,zsh,bash或者ksh93允许以下操作:
        sed $'s/$/\r/'
        这里有个特殊的地方需要考虑OS下的文本文件有时候在文件结尾会包含一个特殊字符^Z (ASCII 26,or octal 32), UNIX文本文件下没有这个字符,文件末尾的字符在unix下是不可见的,同样可以用删除CR字符的方法删除它:
        tr -d '\r\032' < dosfile > unixfile
        注意: sed不能解释这个字符,但awk可以,一个简单的方法做相反的转换:
       
        $ awk '{printf "%s\r\n" $0}END{printf "%c", 26}' unixfile > dosfile
       
        假定我们使用的不是旧版本的awk,在Solaris下不要使用/bin/awk (使用 nawk or /usr/xpg4/bin/awk in Solaris).

        最后,你的系统可能安装了一些名为dos2unix和unix2dos的命令,或者d2u dos2unix 从dos 非标准程序,或者GNU recode:recode /CRLF

10.怎么设置shell prompt而改编xterm的标题
        #不知道怎么翻译这一句"Gives escape sequences for xterm,"例如,把目前窗口的名字改为"XXX" (in bash):
      $ echo -en "\033]2;XXX\007"

      或者,更恰当点的:

      $ printf '%b' '\e]2;XXX\a'

参考"为什么echo输出的结果不是我想要的?"

评分

参与人数 1可用积分 +3 收起 理由
r2007 + 3 谢谢翻译

查看全部评分

论坛徽章:
0
44 [报告]
发表于 2007-12-13 06:02 |只看该作者
还有一点,下次什么时候心情好再继续忽悠,闪人......
11.在命令 cmd1|cmd2 中,我怎么得到cmd1的退出装态
        首先,注意cmd1退出代码可能为0但并不代表错误,这个发生在下面的情况:
        cmd | head -1
        你可能得到cmd的退出状态是141(ksh为269)退出状态,那时因为cmd被SIGPIPE信号中断了当"head -1"在读进一行后退出.
        想要了解cmd1 | cmd2 | cmd3 管道的退出状态的原理
a.用zsh:
        退出状态保存在管道特殊数组中,cmd1的退出状态保存在$pipestatus[1], cmd2的退出状态保存在$pipestatus[2], cmd3的退出状态保

存在$pipestatus[3], 所以$? 总是等于$pipestatus[-1].

b.用bash
        退出状态保存在PIPESTATUS特殊数组中,cmd1的退出状态保存在${PIPESTATUS[0]}, cmd3的退出状态保存年在${PIPESTATUS[2]}, 所

以$?总是等于 ${PIPESTATUS: -1}.

c. 使用其他的任意b shell
        你需要使用一些敲门来绕过主函数的退出代码,你可以使用管道.代替使用"cmd1"的方法,可以运行cmd1; echo $?".
      
        exec 3>&1
       eval `
         # now, inside the `...`, fd4 goes to the pipe
         # whose other end is read and passed to eval;
         # fd1 is the normal standard output preserved
         # the line before with exec 3>&1
         exec 4>&1 >&3 3>&-
         {
           cmd1 4>&-; echo "ec1=$?;" >&4
         } | {
           cmd2 4>&-; echo "ec2=$?;" >&4
         } | cmd3
         echo "ec3=$?;" >&4
       `
d.在POSIX shell下
        我们可以很轻松的实现:
       run() {
         j=1
         while eval "\${pipestatus_$j+:} false"; do
           unset pipestatus_$j
           j=$(($j+1))
         done
         j=1 com= k=1 l=
         for a; do
           if [ "x$a" = 'x|' ]; then
             com="$com { $l "'3>&-
                         echo "pipestatus_'$j'=$?" >&3
                       } 4>&- |'
             j=$(($j+1)) l=
           else
             l="$l \"\$$k\""
           fi
           k=$(($k+1))
         done
         com="$com $l"' 3>&- >&4 4>&-
                    echo "pipestatus_'$j'=$?"'
         exec 4>&1
         eval "$(exec 3>&1; eval "$com")"
         exec 4>&-
         j=1
         while eval "\${pipestatus_$j+:} false"; do
           eval "[ \$pipestatus_$j -eq 0 ]" || return 1
           j=$(($j+1))
         done
         return 0
       }
      
       use it as:
      
       run cmd1 \| cmd2 \| cmd3
       exit codes are in $pipestatus_1, $pipestatus_2, $pipestatus_3


12 为什么会提示 “script.sh:not found”  (^M 章节)
a.脚本以"#!/bin/sh" 开始
        当你从windows系统上面ftp一个脚本到unix系统的时候,可能会报这样的错,因为在windows系统上面,每行的结束符为CRLF,在UNIX

系统上面,行结束符只有LF,CR被当作一个普通字符来处理了。(这个在你的windows终端上是看不到的)
        所以,MSDOS下的"#!/bin/sh", 在unix系统下面,它变成了"#!/bin/sh<CR>",(other names for <CR> are \r, \015, ^M,<Ctrl-M>).
        所以,当你运行脚本的时候,系统寻找的是 "sh<CR>"而不是"sh",所以报错"doesn't  exist"
       
        $ sed 'l;d;q' < script.sh
       #!/bin/sh\r$

问题所在, ($ marks the end of line, \r is the CR   character).

b.路径问题
        有时候,shell的安装路径并不是在/bin或者/usr/bin下面.例如,不是操作系统安装的时候自带的shell可能会被安装到/usr/local/bin

目录下.若你在ksh的路径是/usr/bin的机器上写了一个脚本,而在ksh的路径是/usr/local/bin 的机器上运行它,shebang应该更改正确.
        当你使用sh的时候,一般不会遇到这样的问题,但是,当你使用bash ,zsh或者其他的shell的时候,不同的机器可能安装路径不太一致.
        一个解决办法就是更改shebang, 代替
        #!/bin/sh的方法是使用
        #!/usr/bin/env sh
        当然,env也可能会在其他的路径下,但这并不常见。

13 为什么echo不能输出我想得到的东西.
        参考0a章节中“echo 使用注意事项”
       
        不同的shell的echo命令的效果也不尽一致,例如一些shell(bash,pdksh [,?]),使用下面的参数
      -n suppress newline at the end of argument list
      -e interpret backslash-escaped characters
      -E disable interpretation of backslash-escaped characters, even
         on systems where interpretation is the default.
        但是,pdksh也允许使用 在参数末尾使用"\c"来关闭换行符输出。
       
        POSIX标准只允许 \c 来关闭换行符号输出,不支持任何上面的提及的那些参数格式
        ksh88和ksh93对反斜线的翻译取决于程序执行#翻译不太对。

        [欢迎贴出其他shell的行为描述]
        总的来说,当你选择使用echo的时候,你应该清楚你的机器上的echo是怎么工作的,若可以选择的时候,print和printf的效果会更好


       
14 文件名中带有空格,我怎么在循环中使用它们.
        你想在循环中调用一个文件列表?这个列表是怎么存放的?若是以文本方式存放的,我们有一个关于合法字符的假想,在UNIX系统中

,除了\0' (NUL) 字符,都可以当作路径名的一部分,所以在文件中存储一些列文件名的唯一方法就是使用\0' (NUL) 来分隔他们(若你不使

用引用机制作为xagrs的输入的话)
        但是不幸的是大部分shell(zsh除外)和unix文本编辑程序(GNU的一些软件除外)都不能处理\0' (NUL) 符号,并且,很多命令,如

"ls","find","grep -l"的输出都是以换行符作为文件间隔的,所以,若你想处理这些输出,一个比较接近的假想就是我们认为文件名不包含换

行符,但你不能假装你的代码是完美的。
        所以,若你有一个以换行符结尾的文件列表list.txt,有两种方法处理:
        1-
    while IFS= read -r file <&3; do
      something with "$file" # be sure to quote "$file"
    done 3< list.txt
    (if your read doesn't have the "-r" option, either make another
    assumption that filenames don't contain backslashes, or use:

    exec 3<&0
    sed 's/\\/&&/g' < list.txt |
    while IFS= read file; do
      something with "$file" <&3 3<&-
    done
    )
        2-
    IFS="
    " # set the internal field separator to the newline character
      # instead of the default "<space><tab><NL>".
   
    set -f # disable filename generation (or make the assumption that
           # filenames don't contain *, [ or ? characters (maybe more
           # depending on your shell)).
   
    for file in $(cat < list.txt); do
      something with "$file" # it's less a problem if you forget to
                             # quote $file here.
    done

注意,在你构建这个列表之前,你还可以做一些其他事情。我们还有其他的方法来存储文件名.
  this list.txt. There are other ways to store filenames. For
    instance, you have the positional parameters.
   
    with:
    set -- ./*.txt
   
    you have the list of txt files in the current directory, and no
    problem with weird characters. Looping through them is just a
    matter of:
   
    for file
    do something with "$file"
    done
   
    You can also escape the separator. For instance, with
   
    find . -exec sh -c 'printf %s\\n "$1" | sed -n '"':1
      \$!{N;b1
      }
      s/|/|p/g;s/\n/|n/g;p'" '{}' '{}' \;
      
    instead of
   
    find . -print
   
    you have the same list of files except that the \n in filenames
    are changed to "|n" and the "|" to "|p". So that you're sure
    there's one filename per line and you have to convert back "|n"
    to "\n" and "|p" to "|" before referring to the file.

15.怎么改变默认的登录shell
        See  http://www.faqs.org/faqs/unix-faq/shell/shell-differences
        若没有很好的理由,最好不要改变root的默认登陆shell,默认登陆shell是指/etc/passwd中定义的shell,例如,当我使用root登陆

的时候,我不喜欢root的默认shell,这并不是一个好的理由。
        当只有根分区被挂在的时候,root的默认shell需要在单用户模式下使用,这两者(单用户和多用户)的配置有联系,默认shell必须

满足这个要求,所以,当你把root的默认shell改称其他shell,并且这个shell需要调用不在根分区上的库文件,那么你是在制造问题。
        更改root的登陆shell的最安全的方法就是以root登陆后
      # SHELL=/preferred/shell; export SHELL
      # exec <your preferred shell with login flag>

      e.g.

      # SHELL=/usr/bin/ksh; export SHELL
      # exec $SHELL -l

另一个可行的办法就是在root的.profile 或者.login配置文件增加一些语句检查首选shell是否能够运行。但是这却比直接运行"exec

<shell>" 更复杂且具有更多缺陷。例如,某个首选shell所依赖的库文件被破坏了等,一个比较好的做法就是
     if [ -x /usr/bin/ksh ]; then
        SHELL=/usr/bin/ksh; export SHELL
        ENV=/root/.kshrc; export ENV   
        /usr/bin/ksh -l && exit
      fi

一个更安全的方法就是在你运行你首选的shell之前,尝试运行一个命令。这样会减小你的shell对其他库文件的依靠的风险(shell所依赖的库

文件可能被破坏,也可能shell所依赖的库文件在一个没有挂载的文件分区内。
      if [ -x /usr/bin/ksh ]; then
        /usr/bin/ksh -c echo >/dev/null 2>&1
        if [ $? -eq 0 ];then
           SHELL=/usr/bin/ksh; export SHELL
           ENV=/root/.kshrc; export ENV
           /usr/bin/ksh -l && exit
        fi
      fi
另外一个通用的方法就是再创建一个uid为0的超级用户,例如发FREEBSD系统通常创建一个名为toor,可以根据自己的需要随意设置的用户,迂

回解决。

评分

参与人数 1可用积分 +3 收起 理由
r2007 + 3

查看全部评分

论坛徽章:
0
45 [报告]
发表于 2008-04-13 16:07 |只看该作者
thanks!

论坛徽章:
0
46 [报告]
发表于 2008-05-29 09:46 |只看该作者
不错,值得阅读一下!

论坛徽章:
0
47 [报告]
发表于 2008-08-01 12:09 |只看该作者
精华啊,学习ing

论坛徽章:
0
48 [报告]
发表于 2008-09-19 15:24 |只看该作者

论坛徽章:
0
49 [报告]
发表于 2008-10-05 16:45 |只看该作者
真是好帖,我是从另外一个帖子转过来的。
即学习shell又补习了一下英文。
真是一举两得。

论坛徽章:
0
50 [报告]
发表于 2009-01-14 15:53 |只看该作者
多谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP