환경 변수에서 명령을 실행하고 내부에 후행 앰퍼샌드가 작동하도록 하려면 어떻게 해야 합니까?

환경 변수에서 명령을 실행하고 내부에 후행 앰퍼샌드가 작동하도록 하려면 어떻게 해야 합니까?

내가 호출하는 작은 스크립트가 있습니다 prompt-to-run.

prompt_acc=''

read -p 'run `'"$1"'`
' -i "$1" -e prompt_acc

$prompt_acc

이를 통해 명령을 채우는 스크립트를 생성할 수 있지만 전체 스크립트를 중지하지 않고 실행을 편집하거나 건너뛸 수 있는 기회도 제공됩니다.

나는 다른 스크립트를 가지고 있습니다. "실행하고 싶습니다"라고 부르겠습니다 long-running-script. 자체 터미널에서 실행하고 싶습니다. 왜냐하면 일부 입력을 받은 후에 거기에 앉아서 더 많은 텍스트를 지속적으로 출력하기 때문입니다. prompt-to-run여러 호출이 포함된 스크립트의 시작 부분부터 실행한 후 원래 터미널로 돌아가서 다음 호출을 실행할 수 있기를 원합니다 prompt-to-run.

long-running-script내부에 새 터미널을 열었으므로 수동으로 입력하세요 .

long-running-script &

실행하려는 프로그램을 실행하고 원래 터미널의 프롬프트로 돌아갑니다. 그러나 prompt-to-run 'long-running-script &'터미널 프롬프트를 반환하지 않습니다. 이는 명령이 환경 변수 내에서 실행되기 때문에 $prompt_acc내가 원하는 방식으로 해석되지 않기 때문인 것 같습니다.

prompt-to-run둘 중 하나 또는 둘 다를 변경 하거나 long-running-script원하는 것을 얻을 수 있는 방법이 있습니까 ?

답변1

당신 말이 맞습니다. 그 이유는 환경 변수 내에서 실행되기 때문입니다. 따라서 전체 후속 텍스트( 포함 &)가 에 인수로 전달됩니다 long-running-script.

해결 방법은 파일 $prompt_acc &대신 파일 $prompt_acc에 호출을 넣는 것입니다 . 이렇게 하면 prompt-to-run스크립트를 실행하지 않기로 결정하더라도 &방해가 되지 않습니다 .

답변2

변수 확장 시 수행되는 유일한 처리는 토큰화 및 와일드카드 확장입니다. 다른 쉘 메타 문자는 무시됩니다.

마치 명령어를 입력한 것처럼 변수의 내용을 실행하려면 다음 명령어를 사용하세요 eval.

eval "$prompt_acc"

;이는 따옴표 처리, 로 구분된 여러 명령 실행 , 백그라운드에서 실행 &, I/O 리디렉션 등을 포함하여 명령의 모든 일반적인 셸 처리를 수행합니다.

그건 그렇고, prompt_acc이것은 단지 일반적인 쉘 변수일 뿐이며 환경 변수는 아닙니다. 명령은 export환경에 변수를 넣는 방법입니다.

관련 정보