到目前为止,我认为 shell 中的分号(以某种方式)与换行符具有相同的含义。所以我很惊讶对于
alias <name>=<replacement text>; <name>
<name>
未知,而下一行已知。csh
、tcsh
、sh
、ksh
和bash
行为相同。至少,csh
如果直接使用别名或者在分号之前获取脚本并不重要——别名在分号之后不知道,;
但在下一个命令行中是已知的。这是一个错误还是这种行为是有意为之?
答案1
您使用的别名语法不适合 POSIX shell,对于 POSIX shell,您需要使用:
alias name='replacement'
但对于所有 shell,这不起作用,因为别名替换是在解析器的早期完成的。
在执行别名设置之前,解析器会读取整行,因此,您的命令行将无法工作。
如果别名出现在下一个命令行中,则它将起作用。
答案2
答案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
您可以定义py3
为function
而不是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