Değişkenlerden, örneğin Bash SSS'den öğrendiğim bir teknikle) karmaşık bir komut oluşturan bir kabuk komut dosyası üzerinde çalışıyorum :
#!/bin/bash
SOME_ARG="abc"
ANOTHER_ARG="def"
some_complex_command \
${SOME_ARG:+--do-something "$SOME_ARG"} \
${ANOTHER_ARG:+--with "$ANOTHER_ARG"}
Bu komut dosyası dinamik parametreler ekler --do-something "$SOME_ARG"ve --with "$ANOTHER_ARG"için some_complex_commandbu değişkenler tanımlanırsa. Şimdiye kadar bu iyi çalışıyor.
Ama şimdi aynı zamanda, örneğin betiğim bir hata ayıklama modunda çalıştırıldığında, komutu yazdırabilir veya günlüğe kaydedebilirim. Bu yüzden benim komut dosyası çalıştığında some_complex_command --do-something abc --with def, ben de bu syslog günlüğe kaydedebilirsiniz böylece bir değişken içinde bu komutu olmasını istiyorum.
Bash SSS , bu amaçla tuzağı ve değişkeni (örneğin hata ayıklama amacıyla) kullanmaDEBUG$BASH_COMMAND tekniğini gösterir . Ben aşağıdaki kod ile denedim:
#!/bin/bash
ARG="test string"
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG"
echo "Command was: ${COMMAND}"
Bu çalışır, ancak komuttaki değişkenleri genişletmez:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Ben genişlemek echo "$ARG"için eval kullanmak zorunda sanırım echo test string(en azından evalhenüz olmadan bir yol bulamadı ). Aşağıdakiler işe yarar:
eval echo "Command was: ${COMMAND}"
Aşağıdaki çıktıyı üretir:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Command was: echo test string
Ancak evalbu şekilde güvenli bir şekilde kullanabileceğimden emin değilim . Başarısız bir şekilde bazı şeylerden yararlanmaya çalıştım:
#!/bin/bash
ARG="test string; touch /x"
DANGER='$(touch /y; cat /etc/shadow)'
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG" $DANGER
echo "Command was: ${COMMAND}"
eval echo "Command was: ${COMMAND}"
Bunu iyi idare ediyor gibi görünüyor, ama başka birinin kaçırdığım bir sorun görüp görmediğini merak ediyorum.