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

Shell 为什么csh(tcsh)别名在一行上定义和调用时不起作用?,shell,csh,tcsh,Shell,Csh,Tcsh,[请不要建议我不要使用csh。电气工程界与它有着千丝万缕的联系。谢谢!] 当我这样做时: csh -f -c "alias foo bar; foo" #!/bin/csh -f alias foo bar; foo 我得到: foo:未找到命令 同样,当我这样做时: csh -f -c "alias foo bar; foo" #!/bin/csh -f alias foo bar; foo 我得到相同的foo:Command未找到。。但是,这是可以预期的: #!/bin/csh -f

[请不要建议我不要使用csh。电气工程界与它有着千丝万缕的联系。谢谢!]

当我这样做时:

csh -f -c "alias foo bar; foo"
#!/bin/csh -f
alias foo bar; foo
我得到:

foo:未找到命令

同样,当我这样做时:

csh -f -c "alias foo bar; foo"
#!/bin/csh -f
alias foo bar; foo
我得到相同的
foo:Command未找到。
。但是,这是可以预期的:

#!/bin/csh -f
alias foo bar
foo
其中:

bar:未找到命令


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

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

csh(1)
手册:

别名替换

shell维护可以建立、显示的别名列表 并通过
alias
unalias
命令进行修改。扫描命令行后,将其解析为不同的命令和每个命令的第一个字 命令(从左到右)将被检查,以查看它是否有别名。如果是 则使用 历史机制可用,就好像该命令是以前的一样 输入行。生成的单词将替换命令和参数列表。 如果未引用历史记录列表,则参数列表为 保持不变


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

csh(1)
手册:

别名替换

shell维护可以建立、显示的别名列表 并通过
alias
unalias
命令进行修改。扫描命令行后,将其解析为不同的命令和每个命令的第一个字 命令(从左到右)将被检查,以查看它是否有别名。如果是 则使用 历史机制可用,就好像该命令是以前的一样 输入行。生成的单词将替换命令和参数列表。 如果未引用历史记录列表,则参数列表为 保持不变


您不需要
chmod+x
直接使用
csh
调用的文件;您只需要在调用as
/myscript.sh
时执行此操作。请参阅和.BTW,您在此处使用别名而不是函数有什么特殊原因吗?@CharlesDuffy:可能是因为csh和tcsh没有函数。Argh,仅此而已。嗯。如果从bash调用它,可以调用
csh-f-c$'alias foo bar\nfoo'
,将换行符作为文本传递。您不需要
chmod+x
直接使用
csh
调用的文件;您只需要在调用as
/myscript.sh
时执行此操作。请参阅和.BTW,您在此处使用别名而不是函数有什么特殊原因吗?@CharlesDuffy:可能是因为csh和tcsh没有函数。Argh,仅此而已。嗯。如果从bash调用它,可以调用
csh-f-c$'alias foo bar\nfoo'
,将换行符作为文本传递。非常好。完美的解释。也就是说,我倾向于认为这是一个可怕的设计决定。任何理智的用户都会这样想;这只是一种将多行合并为一行的方法。通常,这并不重要,除非您试图将一个短脚本塞进csh-f-c“…”中,以便从外部脚本(在我的例子中是Ruby[ie,/bin/sh])执行。谢谢雅各布!这是一个先发优势——Bourne的Unix
sh
(以及最初的Thompson shell)没有别名,因此当Joy于1978年开始与2BSD一起发布
csh
时,它们的工作方式没有先例。非常好。完美的解释。也就是说,我倾向于认为这是一个可怕的设计决定。任何理智的用户都会这样想;这只是一种将多行合并为一行的方法。通常,这并不重要,除非您试图将一个短脚本塞进csh-f-c“…”中,以便从外部脚本(在我的例子中是Ruby[ie,/bin/sh])执行。谢谢雅各布!这是一个先发优势——伯恩的Unix
sh
(以及最初的汤普森shell)没有别名,因此,当Joy于1978年开始与2BSD一起发布
csh
时,它们的工作方式没有先例。