Implementando um comando que executa o comando fornecido em um determinado caminho e retorna ao caminho atual

0

meu código:

execInPath() {
prev_dir=${PWD##*/}
cd $1
shift
res=$($@)
cd prev_dir
echo res
}
alias path=execInPath

$ path ~ ls dá: %código% (e os arquivos no meu diretório inicial antes disso)

    
por Oleg Belousov 02.02.2016 / 17:50

3 respostas

3

Você deve usar "$prev_dir" para a variável de referência prev_dir :

execInPath() {
  prev_dir=${PWD##*/}
  cd -P -- "$1"
  shift
  res=$( "$@" )
  cd -- "$prev_dir"
  printf '%s\n' "$res"
}

alias path=execInPath

Mas o uso de um subshell é mais fácil:

execInPath() {
  : 'Change directory in subshell'
  (
    cd -- "$1" || return 1
    shift
    res=$( "$@" )
    printf '%s\n' "$res"
  )
  : 'Back to previous dir'
  pwd
}

alias path=execInPath
    
por 02.02.2016 / 17:56
3

Use um subshell:

execInPath() (cd -P -- "$1" && shift && exec "$@")

Notas:

  • Você precisa verificar o status de saída de cd , como se cd falhasse, você executaria o comando no diretório errado.
  • se você quiser que cd se comporte como em outros idiomas, precisará de -P .
  • pense no status de saída da sua função. Aqui, você quer que seja malsucedido se cd falhar e seja o status de saída de "$@" caso contrário.
  • $@ deve ser citado sempre.
  • É impossível fazer cd some-dir;...;cd original-dir e voltar ao mesmo diretório original 100% confiável.
por 02.02.2016 / 18:08
1

Quando você atribui uma variável no bash, não há $ (diferente de perl), mas quando você usa / referencia uma variável no bash, você precisa adicionar $ a ela. Seu cd prev_dir deve ser cd $prev_dir .

    
por 02.02.2016 / 17:53

Tags