Bash

為什麼 systemctl {restart,status} sshd;工作?

  • July 30, 2018

上述命令通過 echo 時的輸出為:

# echo systemctl\ {restart,status}\ sshd\;
systemctl restart sshd; systemctl status sshd;

即使我將輸出粘貼到終端,該命令仍然有效。但是當我嘗試直接執行命令時,我得到:

# systemctl\ {restart,status}\ sshd\;
bash: systemctl restart sshd;: command not found...

我有兩個問題..

  1. 這種替換和擴展的方法到底叫什麼?(這樣我就可以研究它並了解更多關於它以及如何正確使用它的資訊)。
  2. 我在這裡做錯了什麼?為什麼它不起作用?

它是在 shell 中完成的Brace 擴展的一種形式。大括號擴展的想法是正確的,但在這裡使用它的方式是不正確的。當你打算這樣做時:

systemctl\ {restart,status}\ sshd\;

shell 解釋systemctl restart sshd;為一個長命令並嘗試執行它,但它找不到二進製文件以這種方式執行它。因為在這個階段,shell 會在建構帶有參數的完整命令之前嘗試對命令行中的項目進行標記——但這還沒有發生。

對於此類已知的擴展值,您可以使用eval並且仍然是安全的,但請確定您嘗試使用它擴展什麼。

eval systemctl\ {restart,status}\ sshd\;

但我寧願使用循環代替 with for,而不是嘗試編寫單行程式碼或使用eval

for action in restart status; do
   systemctl "$action" sshd
done

引用自:https://unix.stackexchange.com/questions/433782