6

我有一些代码对我有用,但是当我把它交给一些同事时,它坏了。他们正在使用tcsh,而据我所知,我正在使用csh.

我试过了:

csh -v
csh --version
csh -V
csh --help
csh -h

没有成功(他们都直接带我到解释器提示)。我还为字符串“版本”搜索了手册页,但我也没有想出任何有用的东西。有没有办法确定csh我安装的版本?

- 编辑 -

按照来自 的符号链接/bin/csh,它们似乎终止于/bin/bsd-csh这似乎暗示我正在使用一些 BSD 风格的 csh shell,如果这对任何人都有帮助的话。另外,我正在使用 ubuntu linux。

4

3 回答 3

5

在评论中,您已经表明您在 Ubuntu 上,这是/bin/csh指向 的符号链接/etc/alternatives/csh,这是指向/bin/csh.

cshshell起源于 BSD Unix,因此csh是指向/bin/bsd-csh. 它可以追溯到 1978 年左右,在 Unix 程序报告自己的版本号变得普遍之前。

由于您使用的是 Ubuntu,因此:

dpkg -l csh

应该告诉您您拥有的版本——尽管 Debian/Ubuntu 软件包的版本号可能不会比您已经拥有的信息更有用。并且包版本号和shell版本之间的关系并不完全清楚。

我假设这是正确的包名称。如果没有,请尝试dpkg -S /bin/bsd-csh

您可以判断您是否正在运行tcsh,如下所示:

if ($?tcsh) then
    echo This is tcsh
else
    echo This is csh, not tcsh
endif

tcsh应该与 csh 向后兼容,具有一些额外的功能,主要用于交互使用如果为 tcsh 编写的脚本使用 tcsh 特定的功能,它很容易在 csh 下失败,但我希望 tcsh 能够处理 csh 脚本。正如tcsh(1)手册页所说:

tcsh 是 Berkeley UNIX C shell csh(1)的增强但完全兼容的版本。

我知道您可能无法发布整个失败的脚本,但是您能否发布一个对您有用但对您的同事失败的小型代表性示例?

一种解决方案可能是请您的同事csh在他们的系统上安装 vanilla;如果他们愿意,他们仍然可以/bin/tcsh用作他们的交互式 shell,但是#!/bin/csh会导致脚本由旧的 csh 执行,而不是 tcsh。

最后,如果不添加指向this的链接,我将无法回答有关 [t]csh 脚本的问题。

附录:我可以访问一个/bin/csh不是 tcsh 的 Solaris 系统;如果你愿意,我可以在那里运行一些简单的测试。一个数据点:两者都/bin/tcsh接受/bin/csh:空命令,但/bin/csh不接受参数:

% :
% arg
:: Too many arguments
于 2013-01-10T16:36:28.803 回答
3

csh --version仅当csh实际上是指向...的符号链接时才有效/bin/tcsh(!)

否则,csh会话似乎没有设置任何版本,除了在这个MKSToolkit中,csh应该设置一个 variable$csh_version

预定义变量

以下变量对 C Shell 具有特殊意义。
其中,argv, csh_version, cwd, home, path, prompt, ROOTDIR, shell, status, COMSPEC, 和TMPDIR总是由 shell 设置。
cwd和外status,此设置仅在初始化时发生;除非用户明确修改,否则这些变量不会被修改。

例如,请参阅此点文件

shell_is_csh  () { return [ -n "$csh_version"  ]; }

/bin/csh链接到/etc/alternatives/csh哪个链接/bin/bsd-csh
显然是bsd-csh

...然后bsd-csh似乎不支持任何类型的版本功能。

于 2013-01-10T15:10:55.423 回答
2

如果您使用的是 Ubuntu,那么您cshOpenBSD版本就是带有一些补丁的版本。它绝对不支持获取其版本,因为它不会在任何地方对其版本进行编码。但是,除此之外无法为您提供帮助。

如果您尚未csh在 ubuntu 上安装,但已安装tcsh,那么它将tcsh用作csh. 正如您所发现的,它们大多是兼容的。

对于您自己,您可能可以通过使用update-alternatives重定向csh来调试问题tcsh(只要您也安装了 tcsh)。

于 2013-01-10T16:40:21.057 回答