我把自己看作一个快乐的 Bash 用户。 然而,当我开始探索 Unix 时,它是在一个默认提供 tcsh 的专有 Unix 系统上,因此我最早的 shell 体验是在现代版本的 C shell (csh) 上。 事实证明这是一个幸运的意外,因为 tcsh 也是我职业生涯后期工作的电影工作室的首选 shell。
直到今天,我仍然将一些任务与 tcsh 相关联,即使它们之间没有逻辑关联。 我至少在一个系统上仍然使用 tcsh,即使只是为了保持练习。 我还将它安装在我所有的系统上,以保持与我自己的 tcsh 脚本的兼容性,并确保我可以在需要编写我喜欢用 tcsh 编写的脚本时启动它。
C shell 和 Bash 之间的区别
Tcsh 是 csh 的现代延续。 当 C shell 早在 1978 年发布时,用户对其类似 C 的语法感到兴奋。 C 在当时是一种新的编程语言,更重要的是,它是 Unix 的编写语言,因此大多数 Unix 用户比任意脚本语言更熟悉 C。 例如,在 Bash 中,这个 if
循环对 test
二进制文件进行“秘密”调用以评估条件语句(括号中的部分)
v=1
if [ $v -gt 0 ]
then
echo "verbose"
fi
这是 csh 或 tcsh 中的相同语句,没有对 test
的外部调用,因为条件语句(括号中的代码)使用 csh 的内置评估
set v=1
if ($v > 1) then
echo "verbose"
endif
这演示了一些事情,有好的也有坏的。 例如,C 程序员很自然地在括号中键入条件,并且从程序员的角度来看,将数学评估内置到可执行文件中是理想的。 另一方面,if
循环语法与 Lua 的相似之处多于 C,后者使用大括号作为分隔符
// this does not work in Csh
if ( v>1 ) {
printf("verbose");
}
在某种程度上,这很好地总结了 csh:对于某些人来说,它干净、高效且熟悉,但古怪且不一致。
那么为什么要使用它呢?
Tcsh 追求精度
我编写的 C++ 和 Java 代码比 C 代码多,因此我对 tcsh 的兴趣与其历史上的声名鹊起关系不大。 但是,我喜欢 Lua,并且在某种程度上,我像看待 Lua 和 Python 甚至 Markdown 和 Docbook 一样看待 tcsh 和其他 shell。 两种 shell 都有优点,很容易指出哪一个更流行,但另一个 shell 具有严格的清晰度。 事实上,我觉得 tcsh 具有许多其他 shell 缺乏的精度。
变量
你不能在 shell 中使用类型变量,但使用 tcsh,你至少可以使用关键字声明它们。 奇怪的是,你可以使用几个关键字来完成这项任务,但我选择的是 set
> set var=foo
> echo $var
foo
你可以通过键入变量名 (本例中为 var
),然后按 Ctrl+X 键,再按 $ (美元) 键来扩展变量。 上面的示例将 var
设置为 foo
。
与许多其他 shell 一样,你可以仅使用 set
命令(不带任何参数)列出所有已设置的变量
> set
term xterm
tty pts/2
uid 1000
user seth
var foo
[...]
你可以使用 unset
命令取消设置变量
> unset var
> set | grep var
>
缺少特性也是一种特性
也许你在脚本中看到过这样的行
var=GitLab
${var,,}
第二行是一个内置函数,用于将 var
的内容转换为小写。
虽然这些额外的函数非常有用,但我有时觉得它们会让人感到困惑。 Shell 脚本就像编程的 HTML;它是你可以通过阅读其他人的代码来学习的为数不多的严肃语言之一。 这不一定是放弃有用功能的好理由,但这就是我尽量避免各种语言中流行的某些神秘速记的原因。 在 tcsh 中编写代码时,我无法选择使用太多速记,因此复杂的字符串操作必须使用基本的 Unix 工具来执行,而不是使用内置的快捷方式。 我相信这会使代码更容易阅读,这对未来的贡献者以及健忘的我来说意义重大。
内置数学运算
我喜欢 tcsh 的一点是它的内置 @ 数学快捷方式。 像大多数自学成才的 Unix 用户一样,我偶然发现了 bc,并且我一直对此感到遗憾。 bc 本身没有错,但它通常被教给用户作为命令行计算器,而实际上它更适合作为一种计算语言。 解决方法包括一个惊人的 300 行 纯 Bash 计算器,或 Bash 中的 let 命令,或 tcsh 中的 @ 命令。
> @ n = ( 1 + 1 / 2 )
> echo $n
1
对于非常复杂的数学运算,可能值得 学习 bc 或一个好的 Python 数学库。
所有必需品
对我来说,tcsh 在朴素的简洁性和基本功能之间取得了完美的平衡。 它不是适合所有用户的 shell,甚至不是适合所有目的的 shell,但如果你想简化对基于文本的世界的看法,tcsh 可能会提供一个有趣的替代方案。
1 条评论