执行csh脚本时如何显示行号?

How to show line number when executing csh script?

我正在使用 csh 脚本,我想在调试模式下执行 csh 脚本时查看行号。 我做的像

csh -x script_name

除此之外,我还需要做什么才能在调试模式下查看行号?

没有执行此操作的内置功能。我能想到的唯一方法是(ab)使用 postcmd 特殊别名。此别名将在每个命令后 运行:

set _lineno = 0
alias postcmd '@ _lineno++ && echo -n $_lineno\ '

echo a
echo b
echo c && echo d

输出:

% csh test.csh
1 2 a
3 b
4 c
d

不幸的是,这会使 -x 输出混乱:

% csh -x test.csh
set _lineno = 0
alias postcmd @ _lineno++ && echo -n $_lineno\ 
@ _lineno++
echo -n 1 
1 @ _lineno++
echo -n 2 
2 echo a
a
@ _lineno++
echo -n 3 
3 echo b
b
@ _lineno++
echo -n 4 
4 echo c
c
echo d
d

我们可以使用 grep:

进行筛选
% csh -x test.tcsh | & grep -Ev '^(@ _lineno|echo -n [[:digit:]]+)
set _lineno = 0
alias postcmd @ _lineno++ && echo -n $_lineno\ 
1 @ _lineno++
2 echo a
a
3 echo b
b
4 echo c
c
echo d
d

所有这些都不够完美,甚至可能无法很好地处理大型脚本...

因为你在过去几天问了一些 csh 相关问题:

虽然 tcsh 可以很好地作为交互式 shell,但 tcshcsh 通常不太适合脚本任务。有很多东西缺失、不完整,或者只是以 "strange" 的方式表现。它甚至 比使用 POSIX 的正常 shell 脚本更难看(这说明了很多)。

除非你有充分的理由不这样做(例如维护现有脚本),否则你可能应该暂时放弃 csh,转而使用 "real" 编程语言(Python、Ruby、Perl 等等),或使用 /bin/shbashzsh.