Kabuktaki bir satırda birden fazla komut çalıştırma


388

Diyelim ki bir dosyam var /templates/appleve istiyorum

  1. iki farklı yere koy ve sonra
  2. orijinali çıkarın.

Bu nedenle, AND /templates/appledizinine kopyalanacak ve bundan sonra orijinali kaldırmak istiyorum./templates/used/templates/inuse

cpBunu yapmanın en iyi yolu, bunu takiben rm? Yoksa daha iyi bir yol var mı?

Hepsini tek bir satırda yapmak istiyorum, bu yüzden şöyle bir şey olacağını düşünüyorum:

cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple

Bu doğru sözdizimi mi?

Yanıtlar:


792

|Bir komutun çıktısını başka bir komuta yönlendirmek için (pipe) kullanıyorsunuz . Aradığınız şey &&, yalnızca bir önceki başarılı olduğunda bir sonraki komutu yürütmek için operatörün kullanılmasıdır:

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple

Veya

cp /templates/apple /templates/used && mv /templates/apple /templates/inuse

Bash'ın komut operatörlerini / ayırıcılarını özetlemek (kapsamlı olmayan):

  • |stdoutbir komutun standart çıkışını ( ) başka bir komutun standart girişine bağlar (boru hatları) . stderrHer ne olursa olsun , yine de varsayılan hedefine gittiğini unutmayın .
  • |&Her iki boru stdoutve stderrbaşka bir standart girişine bir komutun. Çok kullanışlı, bash sürüm 4 ve üstü mevcut.
  • &&&&yalnızca bir öncekinin başarılı olması durumunda sağ komutunu yürütür .
  • ||||yalnızca bir öncekinin başarısız olduğu komutun sağ komutunu çalıştırır .
  • ;;önceki komutun başarılı olup olmadığına bakılmaksızın her zaman sağ komutunu yürütür . set -eÖnceden çağrılmadığı sürece , bu bashbir hatada başarısızlığa neden olur.


78

Neden cpönce konum 1'e, sonra mvkonum 2'ye değil. Bu, orijinalin "çıkarılması" ile ilgilenir.

Ve hayır, doğru sözdizimi değil. |bir programdan çıkışı "borulamak" ve bir sonraki program için girişi dönüştürmek için kullanılır. İstediğiniz, ;çoklu komutları ayıran şeydir.

cp file1 file2 ; cp file1 file3 ; rm file1

Bir sonraki komutların başlatılmasından önce tek tek komutların başarılı OLMASI GEREKİRse, &&bunun yerine şunu kullanırsınız:

cp file1 file2 && cp file1 file3 && rm file1

Bu şekilde, cpkomutlardan biri başarısız olursa, rmçalışmaz.


10

cp A B; rm ATam olarak not edin mv A B. Ayrıca baytları kopyalamanız gerekmediği için (hedefin aynı dosya sisteminde olduğu varsayılarak), dosyayı yeniden adlandırmanız daha hızlı olacaktır. Yani istiyorsuncp A B; mv A C


7

Ctrl+V Ctrl+JHer komutun sonuna başka bir seçenek yazmaktır .

Örnek (yerine #ile Ctrl+V Ctrl+J):

$ echo 1#
echo 2#
echo 3

Çıktı:

1
2
3

Bu, öncekiler başarısız olursa olsun komutları yürütür.

İle aynı: echo 1; echo 2; echo 3

Başarısız komutlarda yürütmeyi durdurmak istiyorsanız &&, son satır hariç her satırın sonuna ekleyin .

Örnek (yerine #ile Ctrl+V Ctrl+J):

$ echo 1 &&#
failed-command &&#
echo 2

Çıktı:

1
failed-command: command not found

İçinde veya yerine zshkullanabilirsinizAlt+EnterEsc+EnterCtrl+V Ctrl+J


3

Bunu dene..

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple


2

Boru kullanmak bana tuhaf geliyor. Her neyse, mantıksal andBash işlecini kullanmalısınız :

$ cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apples

Eğer cpkomutlar başarısız rmyürütülmez.

Veya bir fordöngü ve kullanarak daha ayrıntılı bir komut satırı oluşturabilirsiniz cmp.

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.