Вопрос: Как включить или отключить несколько «выражений эха» в файле bash


У меня есть сценарий bash, где у меня есть эхо перед каждой командой, показывающей, что происходит.

Но мне нужно отключить эхо при установке в качестве задания cron, а затем снова включить, если вы выполните какое-либо тестирование.

мне очень сложно перейти к каждой строке, а затем добавить / удалить комментарий

есть что-нибудь, что я могу включить в начало что-то вроде

enable echo or disable echo

так что мне не нужно терять время


3


источник


Ответы:


Абсолютно простым было бы вставить следующую строку после строки hashbang:

echo() { :; }

Если вы хотите снова включить, удалите строку или прокомментируйте ее:

#echo() { :; }

Если вы не используете echo но printf, та же стратегия, то есть:

printf() { :; }

если ты абсолютно  нужно на самом деле  echo / printf что-то, добавьте builtin , например:

builtin echo "This 'echo' will not be suppressed."

Это означает, что вы можете выполнить условный вывод, например:

echo () {
  [[ "$SOME_KIND_OF_FLAG" ]] && builtin echo $@
}

Установить SOME_KIND_OF_FLAG переменная к чему-то ненулевому, а переопределенная echo функция будет вести себя как нормальная echo,


РЕДАКТИРОВАТЬ:  другой альтернативой было бы использование echo за оснащающий  (отладка) и printf для выходов (например, для трубопроводов). Таким образом, нет необходимости в каких-либо FLAG, Просто отключите / включите echo() { :; } в зависимости от того, хотите ли вы инструмент или нет, соответственно.


Включить / отключить с помощью параметра CLI

Поместите эти строки сразу после строки hashbang:

if [[ debug == "$1" ]]; then
  INSTRUMENTING=yes  # any non-null will do
  shift
fi
echo () {
  [[ "$INSTRUMENTING" ]] && builtin echo $@
}

Теперь, вызывая скрипт следующим образом: script.sh debug будет включать инструменты. И поскольку есть shift команды, вы все равно можете подавать параметры. Например.:

  • Без инструментов: script.sh param1 param2
  • С инструментами: script.sh debug param1 param2

Выше Можно  упростить:

if [[ debug != "$1" ]]; then
  echo () { :; }
  shift
fi

если ты необходимость  (например, для записи вывода команды в временный файл только  если отладка), используйте else-блок:

if [[ debug != "$1" ]]; then
  echo () { :; }
  shift
else
    INSTRUMENTING=yes
fi

ПОМНИТЕ:  в режиме без отладки, все   echo команды отключены; вы должны либо использовать builtin echo или же printf, Я рекомендую последнее.


12



Несколько вещей:

Не использовать эхо вообще

Вместо этого используйте set -xv для установки режима отладки, который будет эхо каждой команды. Вы можете установить PS4 к требуемому приглашению: например PS4='$LINENO: ' будет распечатывать номер строки на каждой строке. В BASH я считаю, что это то же самое. Затем вам не нужно очищать свой скрипт. Чтобы отключить, используйте set +xv,

Пример:          Foo = 7     бар = 7     PS4 = '$ LINENO:'     set -xv #Begin отладка     если [$ foo = $ bar]     затем         echo "foo, безусловно, равный бар"     фи

set +xv   #Debugging is off

if [ $bar = $foo ]
then
    echo "And bar also equals foo"
fi

Результаты:

    $ myprog.sh     если [$ foo = $ bar]     затем         echo "foo, безусловно, равный бар"     фи

5: [ 7 = 7 ]
7: echo 'foo certainly does equal bar'
foo certainly does equal bar
set +xv   #Debugging is off

And bar also equals foo

Использовать функцию

Определите функцию вместо использования echo:

Пример:

    функция myecho {         если [ ! -z "$ DEBUG"]         затем             echo "$ *"         фи     }

    DEBUG = "TRUE"     мое эхо «распечатает эту строку»     unset DEBUG     myecho "Но не распечатает эту строку"

Использовать NOP  команда

Двоеточие (:) - это команда nop в BASH. Он ничего не делает. Используйте переменную окружения и определите ее как эхо  или же : , Когда установлено значение двоеточия, ничего не происходит. Когда установлено значение echo, линия печатает.

Пример:

    эхо = ":"     $ echo "Эта строка не будет печатать"     эхо = «эхо»     $ echo «Но эта линия будет».


8



Основываясь на ответе Мэтью, как насчет чего-то вроде этого:

myEcho = "/bin/true"
if [ ! "$CRON" ]: then
    myEcho = "/bin/echo"
fi

а затем использовать $myEcho вместо echo в вашем скрипте?


2



Вы можете сделать лучше. Если вы настроите свой crontab, как описано в другой ответ , вы можете проверить, работаете ли вы в cron и только распечатываете, если вы этого не сделали. Таким образом, вам не нужно изменять сценарий вообще между разными запусками.

Затем вы сможете использовать что-то вроде этого (возможно, не совсем работает, я не владею bash):

if [ ! "$CRON" ]; then
  echo "Blah blah"
fi

1



Пытаться set -v вверху для эхо каждой команды. Чтобы остановить эхо изменение set +v,


1



Если вы запускаете его в cron, почему бы просто не сбросить выходные данные? Измените запись crontab, чтобы она > /dev/null в конце команды, и весь вывод будет проигнорирован.


0



Не уверен, что я пропустил решение ниже, чтобы использовать переменную (например, debug) в начале сценария bash.

После того, как вы установите debug = true, любое условие-if включит или отключит несколько «инструкций эха» в сценарии bash.

 typeset debug=false # set to true if need to debug
...
 if [ $debug == "true" ]; then
     echo
     echo "Filter"
     read
 fi
...
 if [ $debug == "true" ]; then
     echo
     echo "to run awk"
 fi

0



Как включить или отключить несколько «выражений эха» в файле bash | Programmerz.ru