구분된 문서 내에서 명령을 실행할 때 "count" 변수를 설정하고 시간 제한을 설정하려고 하는데 구분된 문서 외부에서 "count" 변수를 가져올 수 없습니다.
어떻게 해야 하나요?
내 스크립트는 더 복잡하지만 답을 얻기에는 충분하다고 생각합니다.
timeout 10 bash << EOC count=$(ls -l /tmp/ | wc -l) EOC echo "count: $count"
답변1
당신은 할 수 없습니다. 하위 쉘에 할당된 변수는 상위 쉘에 영향을 주지 않습니다.
대신 이렇게 하세요:
count=$(timeout 10 ls -l /tmp/ | wc -l)
echo "count: $count"
답변2
당신이 하려는 일이 제대로 되지 않을 것이고, 다른 방법을 찾아야 합니다. 다른 프로그램을 실행하면 자체 메모리 공간이 있으므로 현재 셸의 변수에 영향을 줄 수 없습니다. 다른 프로그램이 실행 중인 동일한 셸의 인스턴스인 경우에도 마찬가지입니다.
이 사실을 변경 하지 않고 이 문서를 사용하십시오 bash -c
. 귀하의 예는 . 와 동일합니다 timeout 10 bash -c "count=$(ls -l /tmp/ | wc -l)"
. (BTW는 생성한 인스턴스 ls -l /tmp/ | wc -l
가 아닌 셸에서 실행됩니다 bash
. . 와 동등한 작업을 수행하려면 또는 유사한 것을 timeout 10 bash -c "count=$(ls -l /tmp/ | wc -l)"
사용해야 합니다 .)<<\EOF
<<'EOF'
변수 값만 가져와야 하는 경우 명령 대체를 사용할 수 있습니다.
count=$(timeout 10 bash -c '…')
많은 변수나 배열을 설정해야 하는 경우 일부 인코딩 및 디코딩이 필요합니다. bash가 이를 수행하도록 할 수 있습니다. declare -p foo bar
정의를 인쇄 foo
하고 bar
호출 쉘에 대해 올바르게 인용하십시오.
eval "$(bash -c '…; declare foo bar')"
이는 변수를 로컬로 선언하므로 함수 내에서 실행하면 함수가 반환될 때 변수를 사용할 수 없습니다. 반환 시 이러한 변수를 사용해야 하는 경우 를 사용하여 다시 할당해야 합니다 declare -g
. 이는 스칼라에서만 작동합니다.
f () {
eval "$(bash -c '…; declare foo bar')"
declare -g foo="$foo" bar="$bar"
}
또는 변수 값에 개행 문자가 포함될 수 없다는 것을 알고 있는 경우 declare -…
출력의 각 줄 시작 부분에서 개행 문자를 제거하세요 declare -p
.
답변3
나는 당신이 이것을 달성할 수 있다고 생각하지 않습니다. 가장 큰 문제는 bash
파이프를 평가한 다음 해당 파이프의 값을 쉘 변수에 저장하는 프로세스가 있다는 것입니다 count
. timeout
내 Arch 노트북에는 자체적으로 내장된 셸이 아니므로 세 번째 수준 프로세스가 있습니다. timeout
기다리고 있는 명령을 포크하기 때문에 세 번째 레벨 프로세스가 있습니다.
그것은 호출 시간 초과 -> 시간 초과 -> bash-invoked-by-timeout -> value-of-입니다.count
count
값 (또는 달성하려는 모든 것)을 사용하려면 쉘 스크립트를 다시 정렬해야 하는 것 같습니다 .
명령이 정말로 필요한 경우 timeout
명령의 출력을 파일로 보낸 다음 해당 파일을 읽어야 합니다.
if timeout ls -l /tmp > /tmp/some.well.known.name
then
VAR=$(wc -l /tmp/some.well.known.name)
else
: handle timeout
fi