systemctl\{restart,status}\sshd\; が機能しないのはなぜですか?

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...

2つの質問があります。

  1. この代替方法と拡張方法は正確に何ですか? (それで私はそれを調べて、それについてもっと学び、正しく使用する方法を学ぶことができます)。
  2. 私がここで何を間違っているのか?なぜ動作しないのですか?

ベストアンサー1

それは形ですサポート拡張シェルで完了しました。支柱の拡張という概念は正しいですが、ここで使用されている方法は正しくありません。これを行うとき:

systemctl\ {restart,status}\ sshd\;

シェルはこれをsystemctl restart sshd;長いコマンドとして解釈して実行しようとしますが、この方法で実行するバイナリを見つけることができません。この段階では、シェルは引数を使用して完全なコマンドを作成する前に、コマンドラインのエントリにタグを付けようとしましたが、まだそのようなことは発生していません。

これらの既知の拡張値の場合は使用できますevalが、それでも安全ですが、それを使用して拡張したいものが何であるかを確認してください。

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

forしかし、私は行を書いたり、次を使うよりもループを使いたいと思いますeval

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

おすすめ記事