سؤال لينكس باش سيناريو ، قيادة واحدة ولكن خطوط متعددة؟


لدي البرنامج النصي التالي الذي كتبته عن طريق البحث في Google ، وتم الاحتفاظ بنسخة احتياطية من نظامي Linux في أرشيف:

#!/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 /

يعمل هذا ، لكنني أتساءل عما إذا كان بإمكاني تنسيق البرنامج النصي لإظهار الأوامر عبر عدة أسطر ، شيء من هذا القبيل ، لذلك من السهل تحريرها فيما بعد:

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 
/

بهذه الطريقة يكون من الأسهل القراءة والتعديل في وقت لاحق. هل من الممكن تنسيق برنامج Bash النصي بهذه الطريقة؟


68
2017-11-21 03:09


الأصل




الأجوبة:


كل ما يجب عليك القيام به هو إضافة "\" في نهاية كل سطر ويجب أن يكون جيدًا.

لذلك سوف تبدو لك:

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 \
    /

اختصارات قليلة
(بناءً على تحديث تعليقك لإعداد $ HOSTNAME)

$ HOSTNAME

خياران لتعيين ذلك:

1) قم بتعيين HOSTNAME

HOSTNAME = $ (المضيف)

2) استخدام تبديل الأمر (على سبيل المثال ، $(command))

لذلك سوف تبدو مثل أعلاه. هذا فقط يجعل الأمر يعمل قبل استخدامه.

$ تاريخ

يمكن تجنب متغير آخر بسهولة:

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

$ man date سيكون لديك تنسيقات لخيارات التاريخ ، ما ورد أعلاه هو YYYYmmdd


86
2017-11-21 03:14



شكرا يا شباب. شيء أخير. يبدو أن هناك مشكلة في جزء اسم الملف في البرنامج النصي: $ HOSTNAME_ $ DATE.tar.gz عندما أقوم بتشغيل البرنامج النصي الآن ، يكون ملف المخرجات هو: 20121120.tar.gz - Jay LaCroix
إذا كنت تريد وضع "اسم المضيف" الفعلي في القراد الخلفي (علامة التيلدة "~" مفتاح فوق علامة التبويب): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz - nerdwaller
AnytimeJayLaCroix - مرحبا بك في SU! - nerdwaller
أنه موصى به ليستخدم $(command) بدلا من `command`. - andrybak


استخدم الشرطة المائلة للخلف لمتابعة أمر في السطر التالي:

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 \
/

7
2017-11-21 03:15



دانغ ذلك @ بول! ضربني فقط: د - nerdwaller
nerdwaller هيه ، لقد فكرت في البداية! - Paul
عدت لتحديثه لجعله أكثر فائدة والحصول على المسافات البادئة. أنا أحب SU رغم ذلك ، على العموم. - nerdwaller
هذا لا يعمل بالنسبة لي مثل على سبيل المثال. في alias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."'; - TheDefinitionist
TheDefinitionist يبدو وكأنه مشكلة مختلفة لهذا واحد. ربما فتح سؤال جديد؟ - Paul


نفس الأمر ، ولكن مع التعليقات لكل سطر ، سيكون:

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 \
    /

1
2018-01-17 22:03