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

dcd*_*cds 1 linux shell csh

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

csh -x 脚本名称

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

Mar*_*oij 6

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

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

echo a
echo b
echo c && echo d
Run Code Online (Sandbox Code Playgroud)

输出:

% csh test.csh
1 2 a
3 b
4 c
d
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会使-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
Run Code Online (Sandbox Code Playgroud)

我们可以用以下方法进行过滤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
Run Code Online (Sandbox Code Playgroud)

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

csh正如您在过去几天提出了许多相关问题:

虽然tcsh可以作为交互式 shell 正常工作,tcshcsh通常不太适合脚本任务。有很多东西缺失、不完整,或者只是表现得“奇怪”。它甚至比使用 POSIX 的普通 shell 脚本还要丑陋(这已经说明了很多)。

csh除非您有充分的理由不这样做(例如维护现有脚本),否则您可能应该暂时放弃,并使用“真正的”编程语言(Python、Ruby、Perl 等),或者使用/bin/shbash、 或zsh