之后没有新的别名;


9

到目前为止,我还认为外壳中的分号(以某种方式)与换行符具有相同的含义。所以我很惊讶

alias <name>=<replacement text>; <name>

<name>在下一行中已知时未知。cshtcshshkshbash相同的行为。至少因为csh直接使用别名或脚本是在semccolon之前来源的,这无关紧要-别名在后面不知道,;但在下一个命令行中是已知的。这是错误还是此行为的目的?


“我认为外壳中的分号(在某种程度上)与换行符具有相同的含义”。不完全的!
Lightness Races in Orbit

1
分号和换行符的解释取决于解析器的调用方式。对于“点”命令,Bourne Shell用“ NLFLG”调用解析器,告诉解析器在某些情况下将换行符和分号视为相等,但在其他情况下则不是这样。通常,分号和换行符并不等效,因为您可以使用换行符,其中分号会导致语法错误。
2015年

Answers:


9

您使用的别名语法不适用于POSIX Shell,对于POSIX Shell,您需要使用:

alias name='replacement'

但是对于所有shell,这都无法正常进行,因为别名替换是在解析器的早期完成的。

在执行别名设置之前,解析器将读取整行,因此,您的命令行将无法工作。

如果别名出现在下一个命令行中,它将起作用。


此外,某些shell喜欢yashzsh不愿意扩展中的别名shell -c 'alias name=replacement<newline>replacement'。对于AT&T ksh,您会遇到脚本的问题。
斯特凡Chazelas

在这种情况下,我需要使用csh -语法中没有=使用alias
2015年

@ user3224237-与无关=。这是因为别名扩展发生在外壳第一次看到该行时,这是定义别名之前
cas 2015年

@StéphaneChazelas使用“源代码”脚本的行为是由于Bourne shell在执行之前完全解析了此类文件引起的。Ksh基于Bourne Shell来源,所有未更改的行为都相同。
2015年

@schily,是的,这是同样的原因zsh/yash -c 'code'在那里code被解析为一个整体。Bourne外壳似乎并非如此。因此,我认为Bourne外壳解析code一次仅一行。
斯特凡Chazelas

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.