我有一些适合我的代码,但是当我把它交给一些同事时,它就破了。他们正在使用tcsh
,而据我所知,我正在使用csh
。
我试过了:
csh -v
csh --version
csh -V
csh --help
csh -h
没有成功(他们都只是带我直接进入翻译提示)。我也为字符串“version”找到了man页面,但我也没有想出任何有用的东西。有没有办法确定我已安装的csh
版本?
- 编辑 -
遵循/bin/csh
的符号链接,它们似乎终止于/bin/bsd-csh
,这似乎意味着我正在使用一些BSD风味csh shell,如果这有助于任何人。另外,我正在使用ubuntu linux。
答案 0 :(得分:5)
在评论中,您表示您使用的是Ubuntu,并且/bin/csh
是/etc/alternatives/csh
的符号链接,这是/bin/csh
的符号链接。
The csh
shell起源于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的功能,为ccsh编写的脚本很容易在csh下失败,但我希望tcsh能够处理csh脚本。正如tcsh(1)
手册页所说:
tcsh 是Berkeley UNIX C shell的增强但完全兼容的版本, csh(1)。
我知道您可能无法发布整个失败的脚本,但是您是否可以发布一个适合您的小代表示例并且对您的同事失败?
一个解决方案可能是要求同事在他们的系统上安装vanilla csh
;他们仍然可以使用/bin/tcsh
作为他们的交互式shell,但是#!/bin/csh
会导致脚本由旧的csh执行,而不是tcsh。
最后,如果不添加指向this的链接,我无法回答有关[t] csh脚本的问题。
附录:我可以访问一个/bin/csh
不是tcsh的Solaris系统;如果你愿意,我可以在那里进行一些简单的测试。一个数据点:/bin/tcsh
和/bin/csh
都接受:
作为空命令,但是/bin/csh
它不接受参数:
% :
% arg
:: Too many arguments
答案 1 :(得分:3)
csh --version
实际上是... csh
(!)的符号链接时, /bin/tcsh
才有效
否则,csh
会话似乎没有设置任何版本,MKSToolkit除外,其中csh
为supposed to set a variable $csh_version
。
以下变量对C Shell具有特殊含义 其中,
argv
,csh_version
,cwd
,home
,path
,prompt
,ROOTDIR
,shell
,status
,COMSPEC
和TMPDIR
始终由shell设置 除cwd
和status
外,此设置仅在初始化时发生;除非用户明确地完成,否则不会修改这些变量。
例如,请参阅this dotfile:
shell_is_csh () { return [ -n "$csh_version" ]; }
/bin/csh
指向/etc/alternatives/csh
的{{1}}链接。{。}} 显然是/bin/bsd-csh
...然后bsd-csh
似乎不支持任何类型的版本功能。
答案 2 :(得分:2)
如果您使用的是Ubuntu,则csh
是OpenBSD
版本,并附带一些补丁。它完全不支持获取它的版本,因为它不会在任何地方对其版本进行编码。但是,除此之外无法帮助你。
如果您未在ubuntu上安装csh
,但已安装tcsh
,则会使用tcsh
作为csh
的别名。正如您所发现的那样,它们大多是兼容的。
对于您自己,您可以使用update-alternatives
将csh
重定向到tcsh
来调试此问题(只要您已经安装了tcsh)。