next up previous
Next: 當我在寫 shell script 時,要如何從 terminal 讀入字元? Up: 初學者可能會問的基本問題 Previous: 我要如何列出整個目錄樹呢?

要怎麼設定 prompt 才會顯示出目前所在的目錄?

這得視你的 shell 而定。有些 shell 很容易,有些 shell 很難,有些根 本辦不到。
C Shell (csh):
將以下的東西加入你的 .cshrc 裡。
alias setprompt 'set prompt="${cwd}% "'
setprompt           # to set the initial prompt
alias cd 'chdir \!* && setprompt'
假如你有用 pushd 與 popd, 把底下的東西也加進去。
		alias pushd 'pushd \!* && setprompt'
		alias popd  'popd  \!* && setprompt'
若你的 C shell 沒有 $cwd 這個變數,那就得用 `pwd` 代替之。

若你想要的只是 prompt 裡有目前所在目錄的最後一個成分 ("mail%" 而非 "/usr/spool/mail%") 則用

		alias setprompt 'set prompt="$cwd:t% "'
有些舊版的 csh 將 && 和 || 的意義弄反了。你可以試試看:
		false && echo bug
若結果是印出 "bug",那就把 && 和 || 對調,或找一個沒有這種 bug 的 csh 來用。

Bourn Shell (sh):

如果你有較新版的 Bourn Shell(SVR2 或更新的版本),那麼你就可 以用一個 shell function 來造你自己的命令,譬如 "xcd":
		xcd() { cd $* ; PS1="`pwd` $ ";}
如果你的 Bourn Shell 是比較舊的版本,也是可以做到,但是方法比 較複雜。這裡提供一個方法。把以下的內容加入你的 .profile:
	LOGIN_SHELL=$$ export LOGIN_SHELL
	CMDFILE=/tmp/cd.$$ export CMDFILE
	# 16 is SIGURG, pick a signal that's not likely to be 
	used
	PROMPTSIG=16 export PROMPTSIG
	trap '. $CMDFILE' $PROMPTSIG
然後把以下的部份寫成一個可執行的  script (不需要縮排),名字就 叫做 "xcd",放在你的 PATH 中
	: xcd directory - change directory and set prompt
	: by signalling the login shell to read a command file

	cat >${CMDFILE?"not set"} <<EOF
	cd $1
	PS1="\`pwd\`$"
	EOF
	kill -${PROMPTSIG?"not set"} ${LOGIN_SHELL?"not set"}
那麼,現在就可已用 "xcd /some/dir" 來改變工作目錄了。

Korn Shell (ksh):

把下面這行加入你的 .profile 中:
		PS1='$PWD $ '
如果你只想顯示最後一個部分,那麼就用
		PS1='${PWD##*/} $ '

T C shell (tcsh)

Tcsh 是常用的 csh 加強版,增加了一些內建變數(及許多其他的功 能):
	%~          the current directory, using ~ for $HOME
	%/          the full pathname of the current directory
	%c or %.    the trailing component of the current directory
所以你可以直接用
		set prompt='%~'

BASH (FSF's "Bourne Again Shell")

$PS1 中若放  $\backslash$w 表示工作目錄的完整路徑 (以 ~ 表示 $HOME ): 而  $\backslash$W 則是 表示工作目錄的最後一個部份。所以,只要把前面所提 有關 sh 和 ksh 的方法做以下的修改
		PS1='\w $ '
		PS1='\W $ '



Tan Koan-Sin
1999-03-02