新別名在 ; 之後不可用

新別名在 ; 之後不可用

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

相關內容