Linux Bash Komut Dosyası, Tek Komut Ama Birden Çok Satır?


97

Google’da arayarak yazdığım aşağıdaki senaryoyu yazdım ve Linux sistemimi bir arşive yedekledi:

#!/bin/bash
# init

DATE=$(date +20%y%m%d)

tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev --exclude=/share/Archive /

Bu işe yarar, ancak komut dosyasını birden fazla satırda gösterecek şekilde komut dosyasını formatlayabilir miyim, bunun gibi bir şey olup olmadığını merak ediyorum, bu nedenle daha sonra düzenlemek kolaydır:

tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz 
--exclude=/proc 
--exclude=/lost+found 
--exclude=/sys 
--exclude=/mnt 
--exclude=/media 
--exclude=/dev 
--exclude=/share/Archive 
/

Bu şekilde daha sonra okumak ve düzenlemek daha kolaydır. Bash komut dosyasını bu şekilde biçimlendirmek mümkün mü?

Yanıtlar:


129

Yapmanız gereken tek şey, her satırın sonuna "\" eklemektir ve gitmesi iyi olur.

Böylece seninki gibi görünecek:

tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz \
    --exclude=/proc \
    --exclude=/lost+found \
    --exclude=/sys \
    --exclude=/mnt \
    --exclude=/media \ 
    --exclude=/dev \
    --exclude=/share/Archive \
    /

Birkaç Kısayol

($ HOSTNAME ayarlamak için yapılan yorum güncellemenize dayanarak)

$HOSTNAME

Bunu ayarlamak için iki seçenek:

  1. HOSTNAME olarak ayarla

    HOSTNAME = $ (hostname)

  2. Komut değiştirme kullanın (örn. $(command))

    Bu yüzden yukarıdaki gibi görünecek. Bu sadece kullanmadan önce komutu çalıştırır.

$DATE

Kaçınılması gereken başka bir değişken kolayca olabilir:

$(hostname)_$(date +%Y%m%d).tar.gz \

$ man date tarih seçenekleri için biçimlerde olacak, yukarıdaki YYYYmmdd


Teşekkürler beyler. Son bir şey. Komut dosyamın dosya adı bölümünde bir sorun var gibi görünüyor: $ HOSTNAME_ $ DATE.tar.gz Komut dosyasını şimdi çalıştırdığımda, çıkış dosyası şu şekilde: 20121120.tar.gz
— Jay LaCroix

: Eğer gerçek "hostname" isterseniz geri ( "~" sekmesinin üzerinde anahtar tilde) keneler koymak /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
— nerdwaller

Her zaman @JayLaCroix - SU'ya Hoşgeldiniz!
— nerdwaller

1
Bunun yerine kullanılması tavsiye edilir . $(command)`command`
— andrybak

9

Bir sonraki satırda bir komuta devam etmek için ters eğik çizgiyi kullanın:

tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz \
--exclude=/proc \
--exclude=/lost+found \
--exclude=/sys  \
--exclude=/mnt  \
--exclude=/media  \
--exclude=/dev \
--exclude=/share/Archive \
/

Tehlike @Paul! Sadece beni yenmek: D
— nerdwaller

@nerdwaller Heh, sizinkinin önce girdiğini düşündüm!
— Paul

Daha kullanışlı hale getirmek ve girintileri almak için güncellemeye geri döndüm. SU'yu çok ama çok seviyorum.
— nerdwaller

Bu, örneğin benim için çalışmıyor. içindealias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
— TheDefinitionist

1
@Definitionist Buna farklı bir problem gibi geliyor. Belki yeni bir soru açmak?
— Paul,

5

Aynı komut, ancak her satır için yorum yapıldığında:

tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz `#first comment` \
    --exclude=/proc `#second comment` \
    --exclude=/lost+found `# and so on...` \
    --exclude=/sys \
    --exclude=/mnt \
    --exclude=/media \ 
    --exclude=/dev \
    --exclude=/share/Archive \
    /
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.