удар: выйдите из отдельных строк из '-x' повторение

Как другие сказали, что псевдоним является Вашим другом. Для немного более сложных вещей (когда Вам нужны споры где-нибудь между инструкцией) я использую функции в своем .zshrc, как:

function ff() { find . -iname "*$**" }

это работает как, располагаются (я использую его, когда по некоторым причинам дб не доступен). Или

function chuck() { ps aux | grep $1 | tr -s '\t' ' ' | cut -f2 -d' ' | xargs kill $2 }

для замены killall.

10
03.01.2013, 01:05
3 ответа

xtrace вывод переходит к stderr, таким образом, Вы могли перенаправить stderr кому: /dev/null:

i_know_what_this_does() {
  echo do stuff
} 2> /dev/null

Если Вы все еще хотите видеть ошибки от команд, выполненных в функциях, Вы могли сделать

i_know_what_this_does() (
  { set +x; } 2> /dev/null # silently disable xtrace
  echo do stuff
)

Отметьте использование (...) вместо {...} обеспечить локальный объем для той функции через подоболочку. bash, так как версия 4.4 теперь поддерживает local - как в Almquist окружают для создания опций локальными для функции (подобный set -o localoptions в zsh), таким образом, Вы могли избежать подоболочки путем выполнения:

i_know_what_this_does() {
  { local -; set +x; } 2> /dev/null # silently disable xtrace
  echo do stuff
}

Альтернатива для bash 4.0 к 4,3 должен был бы использовать $BASH_XTRACEFD переменная и имеет специализированный дескриптор файла, открытый на /dev/null для этого:

exec 9> /dev/null
set -x
i_know_what_this_does() {
  { local BASH_XTRACEFD=9; } 2> /dev/null # silently disable xtrace
  echo do stuff
}

С тех пор bash испытывает недостаток в способности отметить fd с флагом замыкаться-должностного-лица, который имеет побочный эффект утечки этого fd к другим командам все же.

См. также этот locvar.sh, который содержит несколько функций для реализации локального объема для переменных и функций в сценариях POSIX и также обеспечивает trace_fn и untrace_fn функции для создания их xtraced или нет.

20
27.01.2020, 20:00
  • 1
    Сладкий! Я надеялся видеть, были ли какие-либо модификаторы, я мог бы обратиться к самой функции, но я не думал о простом перенаправлении stderr.Спасибо! –  clacke 02.01.2013, 11:59
  • 2
    Btw, stchaz.free.fr/which_interpreter от той же страницы является довольно потрясающим и тревожащим. :-) –  clacke 14.01.2013, 10:38
  • 3
    И теперь я возвратился сюда снова для второго метода, заставление замолчать установило +x, не заставляя полезный вывод stderr замолчать. Еще раз спасибо! –  clacke 04.03.2013, 14:00

Причина это set +x печатается это set -x означает, "печатают команду, которую Вы собираетесь выполнить, с расширениями, прежде, чем выполнить его. Таким образом, оболочка не знает, что Вы хотите, чтобы она не распечатала вещи, пока она не распечатала строку, говоря этому не распечатать вещи. Насколько я знаю нет никакого способа мешать этому произойти.

2
27.01.2020, 20:00

Вот решение, которое вы искали:

function xtrace() {
  # Print the line as if xtrace was turned on, using perl to filter out
  # the extra colon character and the following "set +x" line.
  (
    set -x
    # Colon is a no-op in bash, so nothing will execute.
    : "$@"
    set +x
  ) 2>&1 | perl -ne 's/^[+] :/+/ and print' 1>&2
  # Execute the original line unmolested
  "$@"
}

Исходная команда выполняется в той же оболочке при преобразовании идентичности. Непосредственно перед запуском вы получаете нерекурсивный xtrace аргументов. Это позволяет вам отслеживать нужные вам команды, не рассылая stederr дубликатами каждой команды "echo".

# Example
echo "About to do something complicated ..."
xtrace do_something_complicated
0
27.01.2020, 20:00

Теги

Похожие вопросы