新别名在 ; 之后不可用

新别名在 ; 之后不可用

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

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

<name>未知,而下一行已知。cshtcshshkshbash行为相同。至少,csh如果直接使用别名或者在分号之前获取脚本并不重要——别名在分号之后不知道,;但在下一个命令行中是已知的。这是一个错误还是这种行为是有意为之?

答案1

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

alias name='replacement'

但对于所有 shell,这不起作用,因为别名替换是在解析器的早期完成的。

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

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

答案2

此行为是由 POSIX 有意并指定的别名替换

shell 执行后立即替换了别名令牌识别并在任何之前语法规则应用。当您调用 alias 时<name>,该命令alias尚未执行。

答案3

如果你真的想要一行, 然后你可以使用函数而不是别名

例如,您创建了py3别名,但它仅在第二行中有效:

$ alias py3=python3; py3 -c 'print("hello, world")'

Command 'py3' not found, did you mean:

  command 'py' from deb pythonpy
  command 'hy3' from deb python3-hy
  command 'pyp' from deb pyp

Try: sudo apt install <deb name>

$ py3 -c 'print("hello, world")'
hello, world

您可以定义py3function而不是alias

$ function py3() { python3 "$@"; }; py3 -c 'print("hello, world")'
hello, world

或者export -f在稍后用于子进程之前:

$ function py3() { python3 "$@"; }; export -f py3; bash -c "py3 -c 'print("'"hello, world"'")'"
hello, world

如果你意识到其中的区别变量与别名/函数,那么你可以使用多变的也:

$ py3='python3'; $py3 -c 'print("hello, world")'
hello, world

不需要export -f

$ py3='python3'; bash -c "$py3 -c 'print("'"hello, world"'")'"
hello, world

相关内容