📄 00000003.htm
字号:
<BR> 若结果是印出 "bug",那就把 && 和 || 对调,或找一个没有这种 <BR> bug 的 csh 来用。 <BR> <BR> Bourn Shell (sh): <BR> <BR> 如果你有较新版的 Bourn Shell(SVR2 或更新的版本),那麽你就可 <BR> 以用一个 shell function 来造你自己的命令,譬如 "xcd": <BR> <BR> xcd() { cd $* ; PS1="`pwd` $ ";} <BR> <BR> 如果你的 Bourn Shell 是比较旧的版本,也是可以做到,但是方法比 <BR> 较复杂。这里提供一个方法。把以下的内容加入你的 .profile: <BR> <BR> LOGIN_SHELL=$$ export LOGIN_SHELL <BR> CMDFILE=/tmp/cd.$$ export CMDFILE <BR> # 16 is SIGURG, pick a signal that's not likely to be <BR> used <BR> PROMPTSIG=16 export PROMPTSIG <BR> trap '. $CMDFILE' $PROMPTSIG <BR> <BR> 然後把以下的部份写成一个可执行的 script(不需要缩排),名字就 <BR> 叫做 "xcd",放在你的 PATH 中 <BR> <BR> : xcd directory - change directory and set prompt <BR> : by signalling the login shell to read a command file <BR> <BR> cat >${CMDFILE?"not set"} <<EOF <BR> cd $1 <BR> PS1="\`pwd\`$" <BR> EOF <BR> kill -${PROMPTSIG?"not set"} ${LOGIN_SHELL?"not set"} <BR> <BR> 那麽,现在就可已用 "xcd /some/dir" 来改变工作目录了。 <BR> <BR> Korn Shell (ksh): <BR> <BR> 把下面这行加入你的 .profile 中: <BR> <BR> PS1='$PWD $ ' <BR> <BR> 如果你只想显示最後一个部分,那麽就用 <BR> <BR> PS1='${PWD##*/} $ ' <BR> <BR> T C shell (tcsh) <BR> <BR> Tcsh 是常用的 csh 加强版,增加了一些内建变数(及许多其他的功 <BR> 能): <BR> <BR> %~ the current directory, using ~ for $HOME <BR> %/ the full pathname of the current directory <BR> %c or %. the trailing component of the current directory <BR> <BR> 所以你可以直接用 <BR> <BR> set prompt='%~' <BR> <BR> BASH (FSF's "Bourne Again Shell") <BR> <BR> $PS1 中的 \w 表示工作目录的完整路径(以 ~ 表示 $HOME);\W 则 <BR> 是表示工作目录的最後一个部份。所以,只要把前面所提有关 sh 和 <BR> ksh 的方法做以下的修改 <BR> <BR> PS1='\w $ ' <BR> 或 <BR> PS1='\W $ ' <BR> <BR>------------------------------ <BR> <BR>Subject: How do I read characters from the terminal in a shell <BR>script? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>2.5) 当我在写 shell script 时,要如何从 terminal 读入字元? <BR> <BR> 在 sh 中,你可以用 read。通常是使用在回圈,如下例: <BR> <BR> while read line <BR> do <BR> ... <BR> done <BR> <BR> 在 csh 中,则用 $<: <BR> <BR> while ( 1 ) <BR> set line = "$<" <BR> if ( "$line" == "" ) break <BR> ... <BR> end <BR> <BR> 很可惜的,csh 并没有方法判断空白行和档案结尾(end-of-file)的不同。 <BR> <BR> 如果你要用 sh 从 terminal 读一个字元,那麽你可以试试 <BR> <BR> echo -n "Enter a character: " <BR> stty cbreak # or stty raw <BR> readchar=`dd if=/dev/tty bs=1 count=1 2>/dev/null` <BR> stty -cbreak <BR> echo "Thank you for typing a $readchar ." <BR> <BR>------------------------------ <BR> <BR>Subject: How do I rename "*.foo" to "*.bar", or change file names to <BR>lowercase? <BR>Date: Thu Mar 18 17:16:55 EST 1993 <BR> <BR>2.6) 怎麽样把 "*.foo" 改名为 "*.bar" 呢?怎样把档案名称改成小写呢? <BR> <BR> 为什麽 "mv *.foo *.bar" 不对呢? 想想 shell 是怎样把万用字元展开的 <BR> 吧。 在 mv 读取参数前 "*.foo" 与 "*.bar" 就已经展开了。"mv *.foo <BR> *.bar" 在各种不同的 shell 会有不同的结果。 Csh 的话会印出 "No <BR> match",因为找不到 "*.bar"。 Sh 则是会执行 "mv a.foo b.foo c.foo <BR> *.bar",也就是说如果只有在有一名为 "*.bar" 的子目录存在时 mv 才会 <BR> 认为执行成功,不过就算成功也不是你所预期的结果。 <BR> <BR> 正确的做法是用你所用的 shell 提供的回圈来做。若你的系统中有 <BR> "basename" 这个指令: <BR> <BR> C Shell: <BR> foreach f ( *.foo ) <BR> set base=`basename $f .foo` <BR> mv $f $base.bar <BR> end <BR> <BR> Bourne Shell: <BR> for f in *.foo; do <BR> base=`basename $f .foo` <BR> mv $f $base.bar <BR> done <BR> <BR> 有些 shell 会提供就自己的变数替代功能,那就可以不用 "basename", <BR> 而用更简单的回圈了: <BR> <BR> C Shell: <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -