내가 호출하는 작은 스크립트가 있습니다 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
환경에 변수를 넣는 방법입니다.