AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 495291
Accepted
Harald
Harald
Asked: 2019-01-19 05:28:30 +0800 CST2019-01-19 05:28:30 +0800 CST 2019-01-19 05:28:30 +0800 CST

Defina a função bash que não aparece no xtrace (set -x)

  • 772

Em um script bash tenho uma log()função que é usada em vários lugares, assim como uma logs()função que desvia muita linha para arquivos log(). Quando executo partes do script com set -x, obviamente todos os comandos dentro logs()e log()são rastreados também.

Eu gostaria de definir logs()e log()tal que pelo menos seu conteúdo, na melhor das hipóteses, até mesmo sua chamada seja suprimida da set -xsaída.

bash function
  • 3 3 respostas
  • 995 Views

3 respostas

  • Voted
  1. Jeff Schaller
    2019-01-19T18:23:36+08:002019-01-19T18:23:36+08:00

    Você não pode alterar como a função é invocada de dentro da função, mas pode definir a função para invocar um subshell que desativa imediatamente o rastreamento; observe os parênteses ao redor do corpo em vez das chaves típicas:

    log() (
      set +x
      # rest of log()
    )
    

    A invocação log()gera apenas a chamada em si (a partir do set -xcódigo existente) e a set +xchamada, não o restante dos comandos subsequentes na função. A set -xconfiguração existente é restaurada assim que a função é encerrada.

    • 4
  2. Best Answer
    mosvy
    2019-01-19T19:41:34+08:002019-01-19T19:41:34+08:00

    Um hack rápido e sujo que deve funcionar em todos os shells é (temporariamente) tornar seu logscript externo em vez de uma função.

    No bash, você também pode usar uma combinação trap '...' DEBUGe , que é muito mais versátil do que . Exemplo:shopt -s extdebugset -x

    debug() {
            local f=${FUNCNAME[1]} d=${#FUNCNAME[@]} c=$BASH_COMMAND
            if [ "$NOTRACE" ]; then
                    case $debug_skip in ''|$d) debug_skip=;; *) return;; esac
                    eval "case \$c in $NOTRACE) debug_skip=\$d; return; esac"
            fi
    
            # before the 1st command in a function XXX
            case $c in $f|"$f "*) return;; esac
    
            printf >&2 "%*s(%s) %s\n" $((d * 2 - 4)) "" "$f" "$c"
    }
    

    (Claro, você pode dispensar o formato estranho + recuo e torná-lo completamente set-x-like; você também pode redirecioná-lo para outro arquivo em vez de misturado com o stderr dos comandos.)

    Então:

    NOTRACE='"log "*'
    shopt -s extdebug
    trap debug DEBUG
    
    log(){ log1 "$@"; }; log1(){ log2 "$@"; }
    log2(){ log3 "$@"; }; log3(){ echo "$@"; }
    
    foo(){ foo1 "$@"; }; foo1(){ foo2 "$@"; }
    foo2(){ foo3 "$@"; }; foo3(){ echo "$@"; }
    
    bar(){ case $# in 0) ;; *) echo "$1"; shift; bar "$@";; esac; }
    
    foo 1 2 3
    log 7 8 9
    bar 1 2 3 4
    

    vai resultar em:

    (main) foo 1 2 3
      (foo) foo1 "$@"
        (foo1) foo2 "$@"
          (foo2) foo3 "$@"
            (foo3) echo "$@"
    1 2 3
    7 8 9
    (main) bar 1 2 3 4
      (bar) case $# in
      (bar) echo "$1"
    1
      (bar) shift
        (bar) case $# in
        (bar) echo "$1"
    2
        (bar) shift
          (bar) case $# in
          (bar) echo "$1"
    3
          (bar) shift
            (bar) case $# in
            (bar) echo "$1"
    4
            (bar) shift
              (bar) case $# in
    
    • 3
  3. wef
    2019-01-19T16:42:58+08:002019-01-19T16:42:58+08:00

    Para suprimir a saída do xtrace, basta usar set -x. Para ligá-lo novamente, use set -x. Para detectar se está ativado, use shopt -q -o xtrace. por exemplo

    log() {
      if shopt -q -o xtrace; then TRACE_IS_ON=yes; else TRACE_IS_ON=no; fi
      set +x # turn xtrace off
      ...
      [[ "$TRACE_IS_ON" == "yes" ]] && set +x
    }
    

    Ainda há alguma 'conversa', mas isso é o melhor que posso fazer. Para suprimir a visualização das chamadas para log(), você pode cercar cada chamada para log() com um código semelhante em vez de dentro da função.

    • 1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve