Neden systemctl \ {restart, status} \ sshd \; iş?


14

Echo'dan geçtiğinde yukarıdaki komutun çıktısı:

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

Çıkışı terminale yapıştırsam bile, komut çalışır. Ancak komutu doğrudan çalıştırmayı denediğimde şunu elde ederim:

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

İki sorum var..

  1. Bu ikame ve genişleme yöntemine tam olarak ne denir? (Böylece araştırıp hakkında daha fazla bilgi edinebilir ve doğru bir şekilde nasıl kullanacağım).
  2. Burada neyi yanlış yaptım? Neden çalışmıyor?

Yanıtlar:


26

Bu bir şeklidir Brace genişleme kabuğunda bitti. Küme ayracı genişletme fikri doğrudur, ancak kullanım şekli burada yanlıştır. Bunu yapmak istediğinizde:

systemctl\ {restart,status}\ sshd\;

Kabuk systemctl restart sshd;, uzun bir komut olarak yorumlanır ve çalıştırmayı dener ve bu şekilde çalıştırmak için bir ikili dosya bulamaz. Çünkü bu aşamada, kabuk komutun tamamını bağımsız değişkenlerle oluşturmadan önce komut satırındaki öğeleri belirtmeye çalışır - ancak henüz gerçekleşmemiştir.

Bilinen bu genişleme değerleri için, evalyine de güvende olabilirsiniz, ancak onunla ne genişletmeye çalıştığınızdan emin olun.

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

Ama ben foryerine, bir astar yazmak veya kullanmaya çalışmak yerine, yerine bir döngü kullanmak istiyorum eval:

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

19

Buna küme ayracı genişletme denir (etiketin gösterdiği gibi).

Burada neyi yanlış yaptım? Neden çalışmıyor?

Bir komut satırını bash'de okuma ve yürütme aşamalarını düşünün (örneğin):

  1. bir satır okur
  2. Bileşik basit bir komutu bileşen basit komutlarına ayrıştırır
  3. basit komutlarda çeşitli açılımlar yapar (küme ayracı genişletme, sözcük bölme, globbing, vb.)
  4. daha sonra basit komutları yürütür (netlik için diğer aşamalar atlanmıştır).

Yapmaya çalıştığınız şey (2) 'den (3)' i etkilemek. Dayalı bölme ;bileşik komutları ayrıştırırken aşama (2) 'dir. Ayracı genişletme için (3) gerçekleştiğinde, bileşik bir komut oluşturmak için çok geç.


6

İlk satır

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

3 jeton olarak genişlet

  • Eko
  • systemctl yeniden başlatma sshd;
  • systemctl durumu sshd;

sonra son iki jetonu yankılayın ve sorun yok gibi görünüyor.

aynı şekilde ikinci satır

systemctl\ {restart,status}\ sshd\;

2 jeton olarak genişler

  • systemctl yeniden başlatma sshd;
  • systemctl durumu sshd;

ve bash systemctl restart sshd;bulamadığı bir yürütülebilir dosyayı aramaya çalışır.

eval systemctl\ {restart,status}\ sshd\;Beklenmediklerine dikkat ederek yolculuğunuza karanlık tarafa başlamak isteyebilirsiniz .


yani çözüm kelime yarma olurdu, değil mi? Bu nasıl yapılabilir?
Somenath Sinha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.