lockf 명령을 사용하여 eval을 실행하는 방법은 무엇입니까?

lockf 명령을 사용하여 eval을 실행하는 방법은 무엇입니까?

eval아래와 같이 실행 명령이 있습니다 .

#! /bin/sh

readonly scr="MYENV=1 sh /tmp/scr.sh"

eval ${scr} -a 1 -b 2

scr이제 유틸리티를 사용하여 스크립트를 실행 하고 싶기 lockf때문에 다음과 같이 변경했습니다.

#! /bin/sh

readonly scr="MYENV=1 sh /tmp/scr.sh"

lockf -k /tmp/f.lock eval ${scr} -a 1 -b 2

다음과 같은 오류가 발생합니다.

lockf: eval: No such file or directory

기본적으로 제한은 명령을 실행할 때 MYENV=1내보내야 하는 것(따라서 use )입니다.eval

저는 쉘 프로그래밍이 처음인데 이 문제를 해결하는 방법을 잘 모르겠습니다. 이 작업을 어떻게 수행합니까?

답변1

eval쉘이 내장되어 있습니다. 일반적으로 실수하기 쉽기 때문에 사용하지 않는 것이 좋습니다.

당신은 단지 필요할 수도 있습니다

#!/bin/sh
MYENV=1 lockf -k /tmp/f.lock sh /tmp/scr.sh -a 1 -b 2

답변2

readonly scr="MYENV=1 sh /tmp/scr.sh"
eval ${scr} -a 1 -b 2

여기서는 함수를 사용하는 것이 더 나을 것입니다.

scr() {
    MYENV=1 sh /tmp/scr.sh "$@"
}
scr -a 1 -b 2

lockfBash에서 함수를 내보내는 것과 같은 작업을 수행한 다음 lockf함수를 사용할 수 있도록 셸을 실행하지 않는 한 여전히 실행하는 데 도움이 되지 않습니다 .

env를 사용하여 변수를 설정하면 어색한 할당 단어를 피할 수 있습니다. 이는 외부 프로그램이므로 사용할 수도 있습니다 lockf. 이전에 명령을 저장한 방식을 사용하십시오.

readonly scr="env MYENV=1 sh /tmp/scr.sh"
$scr -a 1 -b 2
# or 
lockf -k /tmp/f.lock $scr -a 1 -b 2

그러나 이는 명령을 저장하는 좋은 방법이 아니며 예를 들어 공백이 포함된 파일 이름을 저장해야 할 경우 실패할 수 있다는 점에 유의하세요. 더 좋은 방법은 배열을 사용하는 것입니다(Bash/ksh/zsh에서):

scr=(env MYENV=1 sh /tmp/scr.sh)
"${scr[@]}" -a 1 -b 2
# or 
lockf -k /tmp/f.lock "${scr[@]}" -a 1 -b 2

바라보다:변수에 저장된 명령을 어떻게 실행할 수 있나요?

관련 정보