как создать опцию для распечатки операторов против их выполнения в сценарии оболочки - PullRequest
0 голосов
/ 31 августа 2011

Я ищу способ создать переключатель для этого сценария bash, чтобы у меня была возможность либо распечатать (echo) его на стандартный вывод, либо выполнить команду для отладки.Как вы можете видеть ниже, я просто делаю это вручную, комментируя одно утверждение над другим для достижения этого.

Код:

#!/usr/local/bin/bash

if [ $# != 2 ]; then
    echo "Usage: testcurl.sh <localfile> <projectname>" >&2
    echo "sample:testcurl.sh /share1/data/20110818.dat projectZ" >&2
    exit 1
fi

echo /usr/bin/curl -c $PROXY --certkey $CERT --header "Test:'${AUTH}'" -T $localfile $fsProxyURL
    #/usr/bin/curl -c $PROXY --certkey $CERT --header "Test:'${AUTH}'" -T $localfile $fsProxyURL

Я просто ищу элегантный /Лучший способ создать как переключатель из командной строки.Распечатать или выполнить.

Ответы [ 5 ]

2 голосов
/ 31 августа 2011
#!/usr/local/bin/bash

if [[ "$1" == "--dryrun" ]]; then
    echoquoted() {
        printf "%q " "$@"
        echo
    }
    maybeecho=echoquoted
    shift
else
    maybeecho=""
fi

if [ $# != 2 ]; then
    echo "Usage: testcurl.sh <localfile> <projectname>" >&2
    echo "sample:testcurl.sh /share1/data/20110818.dat projectZ" >&2
    exit 1
fi

$maybeecho /usr/bin/curl "$1" -o "$2"
2 голосов
/ 31 августа 2011

Один из возможных приемов, хотя он будет работать только для простых команд (например, без каналов или перенаправления (a) ), заключается в использовании префиксной переменной, например:

pax> cat qq.sh
${PAXPREFIX} ls /tmp
${PAXPREFIX} printf "%05d\n" 72
${PAXPREFIX} echo 3

Чтодля этого вам нужно вставить определенную переменную (в данном случае PAXPREFIX) перед командами.Если переменная пуста, она не повлияет на команду, как показано ниже:

pax> ./qq.sh
my_porn.gz  copy_of_the_internet.gz
00072
3

Однако, если она установлена ​​на echo, каждая строка будет иметь префикс этой строки echo.

pax> PAXPREFIX=echo ./qq.sh
ls /tmp
printf %05d\n 72
echo 3

(a) Причину, по которой это будет работать только для простых команд, можно увидеть, если у вас есть что-то вроде:

${PAXPREFIX} ls -1 | tr '[a-z]' '[A-Z]'

Когда PAXPREFIXпуст, он просто даст вам список ваших имен файлов в верхнем регистре.Если установлено значение echo, это приведет к:

echo ls -1 | tr '[a-z]' '[A-Z]'

, что даст:

LS -1

(не совсем то, что вы ожидаете).

InФактически, вы можете увидеть проблему даже в простом случае, описанном выше, где %05d\n больше не заключен в кавычки.

Если вы хотите более надежное решение, я бы выбрал:

if [[ ${PAXDEBUG:-0} -eq 1 ]] ; then
    echo /usr/bin/curl -c $PROXY --certkey $CERT --header ...
else
         /usr/bin/curl -c $PROXY --certkey $CERT --header ...
fi

и используйте PAXDEBUG=1 myscript.sh для запуска в режиме отладки.Это похоже на то, что у вас есть сейчас, но с тем преимуществом, что вам не нужно редактировать файл для переключения между обычным и отладочным режимами.


Для отладки вывода из самой оболочки вы можете запуститьс помощью bash -x или вставьте set -x в ваш скрипт, чтобы включить его в определенный момент (и, конечно, выключите его с помощью set +x).

1 голос
/ 31 августа 2011

Попробуйте что-то вроде этого:

show=echo
$show /usr/bin/curl ...

Затем установите / отмените $ show соответственно.

0 голосов
/ 31 августа 2011

Я не знаю способа для "print vs execute", но я знаю способ для "print and execute", и он использует "bash -x". См. эту ссылку , например.

0 голосов
/ 31 августа 2011

Это не дает прямого ответа на ваш конкретный вопрос, но я думаю, вы пытаетесь увидеть, какая команда выполняется для отладки.Если вы замените #!/usr/local/bin/bash на #!/usr/local/bin/bash -x, bash запустится и отобразит команды в вашем скрипте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...