用户工具

站点工具


faq:shell:tcsh_traps_and_pitfalls

csh/tcsh 陷阱与缺陷

文件名包含有 glob-patterns

有关内容请查阅 tcsh man page 中的 Filename substitution 章节

% ls *.c
15024.c
9543.c
9352.c
a[0].c
a[1].c
a[2].c

% foreach x ( *.c )
foreach? echo $x
foreach? end
15024.c
9352.c
9543.c
echo: No match.

当然可以使用 noglob 在运行 echo 命令的时候关掉 glob-patterns
不过最好还是使用 find + xargs 或者是脚本 perl (File::Find), python (os.walk()) 来做类似的事情:

% foreach x ( *.c )
foreach? set noglob
foreach? echo $x
foreach? unset noglob
foreach? end
15024.c
9352.c
9543.c
a[0].c
a[1].c
a[2].c

恶心的 one-line

有时候非常羡慕 Bourne 系的 shell 能简单的做到单行诸如
for x in `ls`; do echo $x; done 之类动作, 而且能非常方便的使用历史命令重复执行。
tcsh 也可以用一个恶心的方式做到类似功能, 比如下面酱紫:

% alias test_finger '(echo "foreach user ( delphij davidxu ) " ; echo "echo == "\$"user == " ; echo "finger -s "\$"user@freebsd.org"; echo "end" ) | tcsh -f'
% test_finger
== delphij ==
[freebsd.org]
Trying 69.147.83.40...
... ...

网上流传很久的一个古代 tcsh 黑写的经典檄文

/data/vhosts/wiki-data/pages/faq/shell/tcsh_traps_and_pitfalls.txt · 最后更改: 2011/02/18 19:14 由 loader