到目前為止,我認為 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