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.