새 쉘을 열지 않고 쉘 스크립트에서 명령을 실행하는 방법

새 쉘을 열지 않고 쉘 스크립트에서 명령을 실행하는 방법

쉘 스크립트 내에서 명령을 실행하고 이를 변수에 저장하고 싶지만 원하지 않는 새 쉘이 열립니다. 이 문제를 해결할 수 있는 방법이 있나요? 이것은 내 스크립트입니다.

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

아래와 같은 쉘 스크립트를 실행하여 동일한 쉘에서 실행할 수 있습니다.

. ./Script.sh

그러나 쉘 스크립트에 변수에 저장될 명령이 있는 경우 이를 위해

V1=`<any_command>` 

이것은 여전히 ​​내가 원하지 않는 새로운 쉘을 엽니다.

답변1

명령의 출력을 변수에 저장하면 해당 변수에서 명령이 실행됩니다.서브쉘. 이것을 피할 수는 없습니다. 셸 컨텍스트(변수, 리디렉션 등)의 변경 사항을 유지하고 출력을 캡처하려면 스크립트를 다르게 구성해야 합니다.

한 가지 방법은 임시 파일을 사용하는 것입니다. 이는 이식 가능하고(임시 파일이 생성되는 방식이 POSIX가 아니라는 점을 제외하면 모든 POSIX sh에서 작동함) 비침해적입니다( any_command블랙 박스로 처리할 수 있으며 수정할 필요가 없음).

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

임시 파일 사용을 피하는 이식 가능하지만 방해가 되는 방법은 any_command해당 출력이 변수에 수집되도록 임시 파일을 변경하는 것입니다. 이를 위해서는 각 외부 명령 호출이 이 변수에 연결되어야 합니다. 이는 함수 호출이 있는 경우 특히 문제가 됩니다. 함수의 코드를 변경해야 하기 때문입니다. 예:

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

으로 변경될 예정입니다.

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

관련 정보