Bash
為什麼 systemctl {restart,status} sshd;工作?
上述命令通過 echo 時的輸出為:
# echo systemctl\ {restart,status}\ sshd\; systemctl restart sshd; systemctl status sshd;
即使我將輸出粘貼到終端,該命令仍然有效。但是當我嘗試直接執行命令時,我得到:
# systemctl\ {restart,status}\ sshd\; bash: systemctl restart sshd;: command not found...
我有兩個問題..
- 這種替換和擴展的方法到底叫什麼?(這樣我就可以研究它並了解更多關於它以及如何正確使用它的資訊)。
- 我在這裡做錯了什麼?為什麼它不起作用?
它是在 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