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
lockf
Bash에서 함수를 내보내는 것과 같은 작업을 수행한 다음 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