Como executar um comando dentro de um script de shell sem abrir um novo shell

2

Eu gostaria de executar comandos dentro de um script de shell e armazenar em uma variável, mas ele está abrindo um novo shell que eu não quero. Existe alguma maneira de corrigir isso? Aqui está o meu script.

#!/bin/bash
V1='<any_command>'      #The shell should not open a new shell
V2='<another_command>'  #The shell should not open a new shell

Eu posso executar o script de shell como abaixo para executar no mesmo shell:

. ./Script.sh

Mas se houver comandos dentro do shell script para serem armazenados na variável e para isso eu uso

V1='<any_command>' 

Que ainda abre um novo shell, que eu não quero.

    
por Debasish 23.11.2016 / 15:14

1 resposta

3

Se você armazenar a saída de um comando em uma variável, esse comando será executado em um . Não há como escapar disso. Se você quiser manter as alterações no contexto da shell (variáveis, redirecionamentos etc.) e capturar a saída, será necessário organizar seu script de maneira diferente.

Uma maneira é usar um arquivo temporário. Isto é portátil (funciona em qualquer POSIX sh, exceto que a maneira de criar um arquivo temporário não é POSIX) e não invasivo (você pode tratar any_command como uma caixa preta, você não precisa modificá-lo).

unset tmp1
trap 'rm -f "$tmp1"' EXIT INT TERM HUP
tmp1="$(mktemp)"
any_command >"$tmp1"
V1=$(cat "$tmp1")
rm "$tmp1"

Uma forma portátil, mas invasiva, de evitar o uso de um arquivo temporário é alterar any_command para que ele colete sua saída em uma variável. Isso requer que cada chamada de comando externo seja anexada a essa variável. Isso é particularmente complicado se houver chamadas de função, já que o código da função precisa ser alterado. Exemplo:

f () {
  echo "$1"
  a=$((a+$1))
  echo "$2"
}
V1=$(f 4 2)

deve ser alterado para

f_into_V1 () {
  V1="${V1}${1}"
  a=$((a+$1))
  V1="${V1}${2}"
}
f_into_V1 4 2
    
por 24.11.2016 / 01:17