Shell 如何确定我的csh版本?
我有一些适合我的代码,但当我把它交给一些同事时,它坏了。他们使用的是Shell 如何确定我的csh版本?,shell,version,csh,bsd,Shell,Version,Csh,Bsd,我有一些适合我的代码,但当我把它交给一些同事时,它坏了。他们使用的是tcsh,而据我所知,我使用的是csh 我试过: csh -v csh --version csh -V csh --help csh -h 没有成功(他们都直接带我去翻译提示)。我也在手册页上搜索了字符串“version”,但是我也没有找到任何有用的东西。有没有办法确定我安装的csh的版本 --编辑-- 按照/bin/csh中的符号链接,它们似乎在/bin/bsd csh处终止,这似乎意味着我正在使用某种bsd风格的csh
tcsh
,而据我所知,我使用的是csh
我试过:
csh -v
csh --version
csh -V
csh --help
csh -h
没有成功(他们都直接带我去翻译提示)。我也在手册页上搜索了字符串“version”,但是我也没有找到任何有用的东西。有没有办法确定我安装的csh
的版本
--编辑--
按照/bin/csh
中的符号链接,它们似乎在/bin/bsd csh
处终止,这似乎意味着我正在使用某种bsd风格的csh shell,如果这对任何人都有帮助的话。另外,我正在使用ubuntu linux。csh——只有当csh
实际上是一个符号链接到<代码>/bin/tcsh
(!)
否则,csh
会话似乎不会设置任何版本,除非在这里,csh
是
预定义变量
以下变量对C外壳具有特殊意义。其中,
argv
,csh\u版本
,cwd
,home
,路径
,提示符
,ROOTDIR
,shell
,状态
,COMSPEC
,以及TMPDIR
始终由shell设置。除了
cwd
和status
之外,此设置仅在初始化时发生;除非用户明确地进行修改,否则不会修改这些变量
例如,见:
shell_is_csh () { return [ -n "$csh_version" ]; }
/bin/csh
链接到/etc/alternations/csh
哪个链接到/bin/bsd csh
显然是bsd csh
。。。然后,
bsd csh
似乎不支持任何类型的版本功能。在评论中,您指出您在Ubuntu上,/bin/csh
是指向/etc/alternations/csh
的符号链接,它是指向/bin/csh
的符号链接
源于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)
我知道你可能不能发布整个失败的脚本,但是你能发布一个小的代表性的例子,对你有效,对你的同事无效吗
一个解决方案可能是让您的同事在他们的系统上安装vanillacsh
;如果愿意,他们仍然可以使用/bin/tcsh
作为交互式shell,但是#/bin/csh
将导致脚本由旧的csh而不是tcsh执行
最后,我无法回答一个关于[t]csh脚本的问题,除非添加到的链接
附录:我可以使用非tcsh的/bin/csh
访问Solaris系统;如果你愿意,我可以在那里运行一些简单的测试。一个数据点:/bin/tcsh
和/bin/csh
都接受:
作为空命令,但对于/bin/csh
它不接受参数:
% :
% arg
:: Too many arguments
如果你使用的是Ubuntu,那么你的
csh
就是OpenBSD
版本,还有一些补丁。它绝对不支持获取其版本,因为它在任何地方都不编码其版本。但除此之外,我帮不了你
如果您没有在ubuntu上安装csh
,但安装了tcsh
,那么它将使用tcsh
作为csh
的别名。正如你所发现的,它们基本上是相容的
对于您自己,您可能可以通过使用
updatealternations
将csh
重定向到tcsh
(只要您也安装了tcsh)来调试该问题。您是否尝试过-@KevinDTimm?因此,在我开始发布问题时,不建议我查看它。不幸的是,$version
是一个未定义的变量。@closevoter--我看不出这个问题是如何偏离主题的。这是一个关于“程序员常用的软件工具”的问题,“基于我实际面临的问题”。如果你不同意,请更具体地告诉我原因。谢谢。因为对于真正的csh似乎没有一个可靠的测试(在Sun下,我认为有,但我再也没有访问该测试的权限了),而且真正的csh的唯一版本是特定于供应商的,可能您必须反转您的测试,比如'if(shellTest==tcsh);然后设置tcsh;否则如果(外壳试验==bsd csh);然后设置bsd csh;普通csh的else设置;结束if`(很抱歉,如果这不是真正的csh语法,对我来说,这是很久以前的事了;-)祝你好运。@Sheller--谢谢。实际上我只是在调试脚本。整个过程是一个超级复杂的混合脚本,用各种shell方言编写,甚至用一些perl来构建代码。我失败的脚本在整个过程结束时获得源代码,以完成特定目标机器的构建过程。它会出错,错误是关于:
是无效的c