为什么csh(tcsh)别名在一行定义和调用时不起作用?

时间:2017-09-28 13:55:33

标签: shell csh tcsh

[请不要建议我不要使用csh。电气工程界与它密不可分。谢谢!]

当我这样做时:

csh -f -c "alias foo bar; foo"

我明白了:

  

foo:找不到命令。

同样,当我这样做时:

#!/bin/csh -f
alias foo bar; foo

我得到了相同的foo: Command not found.。但是,这可以按预期工作:

#!/bin/csh -f
alias foo bar
foo

给出了:

  

bar:找不到命令。

这只是csh / tcsh中的一个错误吗?或者这是故意的吗?我必须处理别名,因为我使用的环境在很大程度上依赖于它们来配置工具集(包括模块)。但这基本上意味着我无法使用csh -f -c调用短csh脚本。我必须将命令转储到文件chmod + x,然后调用它。没什么大不了的。但我只是想知道是否有办法欺骗这个bug / quirky shell来识别在同一行上定义的别名。

1 个答案:

答案 0 :(得分:4)

这是csh的记录行为:别名替换发生在每个输入行被读取并拆分成命令之后,但在执行任何命令之前(包括你的alias命令)。

来自csh(1)手册:

  

别名替换

     

shell维护一个可以建立,显示的别名列表        并由aliasunalias命令修改。扫描命令行后,它将被解析为不同的命令和每个命令的第一个单词        检查命令(从左到右)以查看它是否具有别名。如果它        确实如此,然后重新读取该命令的别名文本        历史机制可用,就好像该命令是前一个        输入线。生成的单词将替换命令和参数列表。        如果没有引用历史列表,那么参数列表是        保持不变。