'pathmunge' function para variáveis arbitrárias 'PATH'

2

Tenho certeza de que muitos de vocês estão familiarizados com a função pathmunge canônica usada em arquivos de ponto compatíveis com o Bourne-shell para evitar entradas duplicadas na variável PATH . Também criei funções semelhantes para as variáveis LD_LIBRARY_PATH e MANPATH , portanto, tenho as três funções a seguir no meu .bashrc :

# function to avoid adding duplicate entries to the PATH
pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}

# function to avoid adding duplicate entries to the LD_LIBRARY_PATH
ldpathmunge () {
    case ":${LD_LIBRARY_PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$1
            else
                LD_LIBRARY_PATH=$1:$LD_LIBRARY_PATH
            fi
    esac
}

# function to avoid adding duplicate entries to the MANPATH
manpathmunge () {
    case ":${MANPATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                MANPATH=$MANPATH:$1
            else
                MANPATH=$1:$MANPATH
            fi
    esac
}

Existe alguma maneira elegante de combinar essas três funções em uma para manter meu arquivo .bashrc menor? Talvez uma maneira que eu possa passar em qual variável para check / set, semelhante a passagem por referência em C?

    
por villapx 16.01.2017 / 22:47

2 respostas

5

Você pode usar eval para obter e definir o valor de uma variável sabendo seu nome; a seguinte função funciona tanto no Bash quanto no Dash :

varmunge ()
{
  : '
  Invocation: varmunge <varname> <dirpath> [after]
  Function:   Adds <dirpath> to the list of directories in <varname>. If  <dirpath> is
              already present in <varname> then <varname> is left unchanged. If the third
               argument is "after" then <dirpath> is added to the end of <varname>, otherwise
               it is added at the beginning.
  Returns:    0 if everthing was all right, 1 if something went wrong.
  ' :
  local pathlist
  eval "pathlist=\"\$$1\"" 2>/dev/null || return 1
  case ":$pathlist:" in
    *:"$2":*)
      ;;
    "::")
      eval "$1=\"$2\"" 2>/dev/null || return 1
      ;;
    *)
      if [ "$3" = "after" ]; then
        eval "$1=\"$pathlist:$2\"" 2>/dev/null || return 1
      else
        eval "$1=\"$2:$pathlist\"" 2>/dev/null || return 1
      fi
      ;;
  esac
  return 0
}
    
por 16.01.2017 / 23:31
2

No Bash 4.3 ou posterior, você pode usar declare -n para passar efetivamente uma variável por referência.

# function to avoid adding duplicate entries to the PATH
pathmunge () {
    declare -n thepath=$1
    case ":${thepath}:" in
        *:"$2":*)
            ;;
        *)
            if [ "$3" = "after" ] ; then
                thepath=$thepath:$2
            else
                thepath=$2:$thepath
            fi
    esac
}

Você chamaria assim:

pathmunge PATH ~/bin

pathmunge MANPATH /usr/local/man after

    
por 16.01.2017 / 23:22

Tags